mysqlの高度なクエリ文

 1. はじめに

 2. 効率的なクエリ方法

2.1 表示するフィールドを指定する

2.2 フィールドが重複していないことを確認する 

2.3 where 条件クエリ

2.4 and and or 論理関係を増やす

 2.5 値リスト内のデータをクエリする

2.6 間の参照

2.7 同様のクエリメソッド

2.8 ソート方法によるクエリ 

 3. 関数クエリを使用する

3.1 データベースで一般的に使用される数学関数 

3.2 集計関数 

3.3 文字列関数 

(1) 文字トリミングを削除する

(2) サブストリングの切片

(3) フィールドスプライシング 

(4) 文字長 length を返す 

 (5) 交換交換

 4. 高度なクエリ文

4.1 GROUP BY (グループ化と集計用) 

 (1) 概要統計

 (2) 指定分野の要約・蓄積(デジタル授業)

  (3) 指定されたフィールド(デジタルクラス)を要約および蓄積し、降順に実行します

4.2 フィルターを持つ

4.3 エイリアス設定クエリ 

 (1) フィールドエイリアス

 (2) テーブルの別名

4.4 テーブルの自己結合

(1) 重複値を含まないランキング 

(2) 繰り返し値によるランキング 

4.5 サブクエリ文 

サブクエリ使用アップグレード 

  4.6 存在する

 5. テーブル結合クエリ

(1) 内部結合 内部結合

 (2) 左結合 左結合

(3) 右結合 右結合 

 6. ビュービューの使用

(1) ビューの作成 

(2) 以降のビューによる便利な操作

(3) 古典的な定義の問題: ビューはデータを挿入できますか? 

 7. UNION カスケード

7.1 UNION (マージ後の重複排除)

7.2 UNION ALL (マージ後重複なし) 

 8. 複数の方法でテーブルとテーブルの交差値を見つける

8.1 カスケードビューの交差値

8.2 内部結合の交差値 

(1) 交差点を繰り返さない 

(2) 重複排除と交差 

8.3 左結合を使用して交差値を見つける 

8.4 右結合を使用した交差 

 8.5 サブクエリを使用して交差値を検索する

8.6 非交差値を取得する

9. ケース条件選択問合せ文 

 10. 正規表現の使用

10.1 SQL 正規表現の一般的なタイプ

10.2 SQL通常アプリケーション 

 探索: NULL 値 (NULL) と値なし (' ') の違い

 1. この記事の序文
データベースは、データの保存、更新、クエリに使用されるツールであり、データのクエリはデータベースの中核機能です。データベースは情報を運ぶために使用され、情報は分析と表示に使用されます。したがって、より洗練されたクエリ方法を習得する必要があります。この記事では、データの高度なクエリ ステートメントに焦点を当てます。 

以下のクエリ文を使用する場合、事前に 2 つのテーブルが用意されており、クエリ関数の使用に応じて、後でテーブルに変更が加えられたり、新しいテーブルが作成されたりします。 

CREATE TABLE info (
  id int(4) 、
  name char(4)、
  height double 
) ;
 
 
CREATE TABLE info2 (
  名前 char(4) 
  趣味 char(10) 
  日付 char(10)
) ;


 2. 効率的なクエリ方法
2.1 表示するフィールドを指定
する テーブル名からフィールド 1、フィールド 2 を選択します。
 

2.2 フィールドの重複を除去し、 
 SELECT DISTINCT "フィールド" FROM "テーブル名" を表示します。
 

2.3 where 条件クエリ
 SELECT "フィールド" FROM テーブル名" WHERE "条件";
 

2.4 and and or 論理関係を増やす
 SELECT "フィールド" FROM "テーブル名" WHERE "条件 1" AND "条件 2";


 SELECT "フィールド" FROM "テーブル名" WHERE "条件 1" または "条件 2";
 

 2.5 値リストのデータをクエリする
 SELECT "field" FROM "table name" WHERE "field" IN ('value 1', 'value 2', ...); #in、値リストを走査します
 


 2.6 SELECT "フィールド" FROM "テーブル名" WHERE "フィールド" BETWEEN '値 1' AND '値 2';間の参照
 

2.7 like query メソッド
 like query は通常、ワイルドカードと組み合わせて使用​​されます。

%: パーセント記号は、0、1 つ以上の文字を表します。

 _: ダッシュは単一の文字を表します

select * from info2 where 趣味は '%ing';
select * from info2 where name like '小_';


 select * from info2 where name like '_刚';
 
select * from info2 where 趣味は '%ay%';



2.8 クエリの順序、キーワードによる並べ替えの並べ替え方法 。

知らせ:

通常は数値フィールドを並べ替えます。
文字タイプのフィールドをソートすると、アルファベット順にソートされます。
 SELECT "フィールド" FROM "テーブル名" [WHERE "条件"] ORDER BY "フィールド" [ASC|DESC] ;
 #ASC は、デフォルトの並べ替え方法である昇順で並べ替えられます。
 #DESC は降順にソートされます。
  select * 情報から高さ順に並べ替え;
  select * 情報から高さ順に並べ替える asc;
  select * 情報から高さ順に並べ替える desc;
 

 3. 関数クエリを使用する
3.1 データベースで一般的に使用される数学関数 数学関数 
function
abs(x) は x の絶対値を返します
rand() は 0 から 1 までの乱数を返します
mod(x, y) は x をで割った後の剰余を返しますy 乗
( x, y) x の y 乗を返します。round
(x) x に最も近い整数を返します。round
(x, y) x の y 桁の四捨五入値を保持します
。sqrt(x) x の平方根を返します
。truncate(x) , y) 数値 x の値を小数点
以下y 桁に切り捨てて返します。#四捨五入しないでください。 ceil(x) x
以上の最小の整数を返します。 Floor(x) x 以下の最大の整数を返します
。greatest( x1,x2,...) コレクション内の最大値を返します
minimum(x1,x2,...) コレクション内の最小値を返します
SELECT abs(-1),rand(), mod(5,3) ,べき乗(2,3);


 SELECT truncate(1.89,2);
SELECT truncate(1.89,1);
 

選択ceil(1.76);
床を選択(1.76);


最大を選択(1,2,3,55,12,55,61);
最小(1,2,3,55,12,55,61)を選択します。


3.2 集計関数 
集計関数 意味
avg() 指定した列の平均値を返す
count() 指定した列の非 NULL 値の数を返す
min() 指定した列の最小値を返す
max()指定された列の最大値
sum(field) 指定された列のすべての値の合計を返します
。 select avg(height) from info;


情報から count(name) を選択します。
情報から count(*) を選択します。
 

情報から最大(高さ)を選択します。
情報から最小(身長)を選択します。
情報から合計(高さ)を選択します。


3.3 文字列関数 
文字列関数 関数
Trim() は、指定された形式を使用せずに値を返します。
concat(x,y) は、指定されたパラメータ x と y を文字列に連結します。
substr(x,y) は、文字列 x から y 番目の値を取得します。位置 1 は substring() 関数と同じです
substr(x,y,z) 文字列の y 番目の位置から長さが z の文字列を取得します x
length(x) は文字列 x の長さを返します
replace(x, y,z) 文字列 x の文字列 z を文字列 y に置き換えます
upper(x) 文字列 x のすべての文字を大文字に変換します
lower(x) 文字列 x のすべての文字を小文字に変換します
left(x,y) は、文字列 x の最初の y 文字を返します文字列 x
right(x,y) は文字列 x の最後の y 文字を返します
repeat(x,y) 文字列 x y を繰り返します
space(x) は x スペースを返します
strcmp(x,y) x と y、戻り値を比較します-1,0,1 にすることができます
reverse(x) 文字列を反転します x
(1) 文字を削除します トリム
 SELECT TRIM ([[位置][文字列を分割するために] FROM ] String)
 ;
 #[位置]: 値は、LEADING (始まり)、TRAILING (終わり)、BOTH (始まりと終わり) です。 
 #[削除する文字列]: 文字列の先頭、末尾、または先頭と末尾の両方から削除する文字列。デフォルトは空白です。
select トリム(先頭の 's' from 'swmming' );
select トリム(末尾の 'g' from 'swmming' );
select トリム(両方の 'l' from 'lol' );


(2) インターセプト substr
substr(x,y) #x 文字列を y 番目から最後までインターセプト
 
substr(x,y,z) #x 文字列を y 番目からインターセプト、インターセプト長は z
 
 
select substr(hobby,2) ) from info2;
select substr(hobby,3) from info2;


 info2 から substr(hobby,2,5) を選択します。
 info2 から substr(hobby,4,6) を選択します。
 

(3) フィールドのスプライシング 
 1) concat(x,y)

情報から concat(名前,高さ) を選択します。


 2) || 記号を使用します

 #情報テーブルの名前フィールドの値と高さフィールドの値をつなぎ合わせます。
 情報から名前 || 身長を選択します。
 

 #情報テーブルでは、名前フィールドの値と高さフィールドの値が結合され、中央にスペースが追加されます。
 名前を選択 || ' ' || 情報から身長を選択します。
 

(4) info2 から文字長 length 
 select length(hobby) を返します。
 
 

 (5) 置換 replace
select replace(name,'small','big') from info2;


 4. 高度なクエリ ステートメント
4.1 GROUP BY (グループ化および要約用) は、 
GROUP BY の背後にあるフィールドのクエリ結果を要約およびグループ化し、通常は集計関数と組み合わせて使用​​されます。

「GROUP BY」には、「GROUP BY」の後に表示されるすべてのフィールドが SELECT の後に表示される必要があるという原則があります。

SELECT の後に表示され、集計関数に表示されないフィールドはすべて、「GROUP BY」の後に表示される必要があります。

 (1) 概要統計情報
グループから名前ごとに名前、カウント(名前)を選択します。


 (2) 指定されたフィールド (デジタル クラス) を要約および蓄積します。
名前ごとに info3 グループから名前、合計 (保存) を選択します。


  (3) 指定されたフィールド (数値) を集計して累積し、
info3 グループから名前、合計 (保存) を名前順、合計 (保存) の降順で選択します。


4.2 HAVING フィルタ
「GROUP BY」ステートメントによって返されたレコードセットをフィルタリングするために使用され、通常は「GROUP BY」ステートメントと組み合わせて使用​​されます。

HAVING ステートメントの存在により、WHERE キーワードを集計関数と組み合わせて使用​​できないという欠点が補われます。

where は元のテーブルのフィールドのみをフィルタリングでき、group by 後の結果をフィルタリングすることはできません。

 SELECT フィールド 1,SUM(フィールド 2) FROM "テーブル名" GROUP BY フィールド 1 HAVING(関数条件) ;
select 名前,合計(保存) from info3 合計(保存)>1500 を持つ名前でグループ化します。


4.3 エイリアス設定クエリ 
 構文形式: 

 SELECT フィールド 1, フィールド 2 AS フィールド 2 テーブル名からのエイリアス; #AS は省略可能
 (1) フィールドエイリアス
select name, sum( Saving) as total_ Saving from info3 group by name Has sum( Saving)>1000;
select name ,sum (保存) total_ Saving > 1000 を持つ名前による info3 グループの total_ Saving として;


 (2) テーブル別名
SELECT テーブル別名 フィールド 1 [AS] フィールド別名 FROM テーブル名 [AS] テーブル別名、#AS は省略可能


4.4 テーブルの自己結合
(1) 重複値を含まないランキング 
テーブルの自己結合により、以下のテーブルに対して保存比較とランキングを行います。 

 ランキングを達成するためのテーブルの自己接続の原理分析と操作アイデア:

1. 上記のデータテーブルを例に、合計 4 人がいて、それぞれの手元にある金額が異なると仮定します。テーブルの自己結合を行いました。

2. count を使用して数えます。手持ちの金額以上の人の数のみを数えます。たとえば、Xiao Ming が 2000 の場合、彼以上の人物は 1 人だけです。カウント値は次のとおりです。彼のランキングとしても使用されます

3. もう 1 つの例は、Xiaohong の 800 です。彼女以上の人物が 4 人いる場合、カウント値は 4 になります。同様に、彼女が 4 位であることが証明できます。

select A.name,A. Saving,count(A. Saving) as Rank from info3 as A,info3 as B where A. Saving <=B. Saving group by A.name,A. Saving order by Rank asc;
 

(2) 
重複した数値ランキングを含む新しい需要リストがあります。 

select A.name,A. Saving,count(A. Saving) as Rank from info3 as A,info3 as B where A. Saving < B. Saving or (A.name=B.nameme and A. Saving=B. Saving ) A.名前、A.ランク順の保存順でグループ化します。


4.5 サブクエリ文 
サブクエリ: テーブルを結合し、WHERE 句または HAVING 句に別の SQL 文を挿入します。 

 SELECT "フィールド 1" FROM "テーブル 1" WHERE "フィールド 2" [比較演算子] #外部クエリ
 (SELECT "フィールド 1" FROM "テーブル 2" WHERE "条件"); #内部クエリ
通常のテーブル データ接続: 

select * from info as A, info3 as B (A.name=B.name);


サブクエリ結合テーブル結合:

 select * from info where name in (select name from info3 where Saving > 1000);


サブクエリはアップグレードを使用して、 
「北京エリア」のすべての節約値の合計を見つけます。

select sum( Saving) from info3 where name in (select name from info where address='北京');

select sum( Saving) from info3 where name in (select name from info where address='北京');
 

  4.6 存在する
 

ブール値が true かどうかと同様に、内部クエリが結果を生成したかどうかをテストするために使用されます。
内部クエリに結果がある場合、システムは外部クエリの SQL ステートメントを実行します。結果がない場合、SQL ステートメント全体で結果は生成されません。
 

フォーマット: 

 SELECT "フィールド 1" FROM "フォーム 1" WHERE EXISTS (SELECT * FROM "フォーム 2" WHERE "条件");
 

 5. テーブル接続クエリ
MYSQL データベースで一般的に使用されるテーブル接続には 3 つのタイプがあります。

内部結合 (内部結合): 2 つのテーブル内の等しい結合フィールド (交差値を持つ) を持つ行のみを返します。
 

左結合 (左結合): 左テーブルのすべてのレコードと右テーブル
A の結合フィールドを含むレコードを返します。 左結合 B: A は左テーブル、B は右テーブルです。
 

右結合 (右結合): 右テーブルのすべてのレコードを含むレコードを返し、左テーブルの結合フィールドが等しい
A 右結合 B: A は左テーブル、B は右テーブル


 

(1) 内部結合
select * from info A inner join info3 B on A.name = B.name;
 
 

 内部結合を実装する他の方法:

 select * from info A, info3 B where A.name=B.name;
 select * from info A inner join info3 B using(name);
 

 (2) 左結合 左結合
 

select * from info A LEFT JOIN info3 B on A.name=B.name;
 

(3)右接続 right join 
select * from info3 A right join info B on A.name=B.name ;
 

 6. ビュービューの使用
 

ビュー: 仮想テーブルまたはストアド クエリと考えることができます。

ビューとテーブルの違いは、テーブルは実際にデータ レコードを格納するのに対し、ビューはテーブル上に構築された構造であり、実際にはデータ レコードを格納しないことです。
ユーザーがログアウトするかデータベースへの接続が切断されると、一時テーブルは自動的に消えますが、ビューは消えません。
ビューにはデータは含まれず、その定義のみが保存され、一般にビューを使用すると複雑なクエリが簡素化されます。たとえば、複数のテーブルに対して結合クエリを実行し、統計的な並べ替え操作も実行したい場合、SQL ステートメントを記述するのは非常に面倒ですが、ビューを使用して複数のテーブルを結合し、そのビューに対してクエリ操作を実行することは同じです。テーブルに対して操作を実行するのと同じで、クエリも同様で非常に便利です。
 

フォーマット:

CREATE VIEW "ビューテーブル名" AS "SELECT文"; #ビューテーブル作成
 DROP
 VIEW "ビューテーブル名"; #ビューテーブル削除
 

(1) ビューの作成 
 

作成要件: 2 つのテーブル間の info と info3 をカウントするビューを独立して作成し、最初に名前のアドレスを要約し、次に領域の節約の合計を計算します。アドレスと合計(sving)の2つのフィールドを反映する必要があります

create view v_address_ Saving as select A.address,sum(B. Saving) total_ Saving from info A inner join info3 B on A.name=B.name group by address;
 
 

ビュー作成のためのデータ検証:

(2) 以降のビューによる便利な操作
 

 ビューの利点: ビューの作成プロセスは高度なクエリ ステートメント (条件を結合し、2 つの選択ステートメントを分割して派生テーブルを生成する) と同じですが、プロセスは複雑ですが、クエリ操作を使用する必要がある場合は、多くの場合、ビューの作成は非常に便利です。必要に応じて、クエリ プロセスを簡素化できるだけでなく、クエリに対してさらなる操作を実行することもでき、非常に便利です。

 さらなる要件: 蘇州と上海の貯蓄額の合計を計算する必要がある

v_address_ Saving から sum(total_ Saving) を suzhou_shanghai_ Saving として選択します (ここで、 address='苏州' または address='上海';)
 

(3) 古典的な定義の問題: ビューはデータを挿入できますか? 
 

ビューがデータを挿入できるかどうかは、状況によって異なります。 

1) ビュー テーブルが 2 つのテーブルの結合クエリである場合 (たとえば、ビューの A フィールドは A テーブルから取得され、B フィールドは B テーブルから取得されます)、データは挿入できません。テーブル構造が元のテーブルと矛盾しているためです。ビュー内のフィールドは、元のテーブルの特定のフィールドを基に関数演算によって生成された新しいフィールドですが、実際に格納できるフィールドがないため、データを挿入できません。

2) ビュー表の構造が元の表と一致していればデータを挿入できますが、挿入されたデータは元の表に格納され、ビューによって更新されるデータは実際には元の表にマッピングされたデータになります。

show create view は、ビューの作成プロセスを分析します。 

 7. UNION 連結
UNION ユニオン セット: 2 つの SQL ステートメントの結果を結合します。2 つの SQL ステートメントによって生成されるフィールドは、同じタイプのデータ レコードである必要があります。

7.1 UNION (マージ後の重複排除)
 

結果のデータ レコード値は重複せず、フィールドの順序に従って並べ替えられます。# マージ後の重複排除

 形式: [選択ステートメント 1] UNION [選択ステートメント 2];

情報ユニオンから名前を選択 info3 から名前を選択;
 

7.2 UNION ALL (マージ後重複なし) 
 

情報から名前を選択 Union all から情報 3 から名前を選択;
 

 8. 複数の方法でテーブルとテーブルの交差値を求める
8.1 カスケード ビューの交差値を求める
 

 
create view v_info as 情報結合から個別の名前を選択 info3 から個別の名前を選択; v_info グループから名前で名前を
 選択(*) >1 を持つ名前で v_info グループから名前  を選択


 

 
 

8.2 内部結合の交差値 
 

(1) 交差を繰り返さない 
select A.name from info A inner join info3 B on A.name=B.name;
 select
A.name from info A inner join info3 B using(name);
 
 

(2) 重複排除と交差は、 
info A 内部結合 info3 B using(name) から個別の A.name を選択します。
 

8.3 左結合を使用して交差値を見つける 
 

select * from info A left join info3 B using(name);
info A left join info3 B using(name) から個別の A.name を選択します。ここで、B.name は null ではありません。
 

8.4 右結合を使用した交差 
 

 # 右結合を使用して、store_name フィールドの交差値を検索し、重複を削除します。
 select * from info A right join info3 B using(name);
 select unique A.name from info A right join info3 B using(name)ここで、A.name は null ではありません;
 
 または
 、info A から別の A.name を選択し、A.name=B.name で info3 B を右結合します (A.name は null ではありません)。
 
 

 8.5 サブクエリを使用して交差値を検索する
 

名前が入っている情報から別の名前を選択します (info3 から名前を選択);


8.6 非交差値を取得する
 

(1) カスケード方式の場合 count(*)<=1

  (2) 左右の内部接続の変化がnullでないからnullになる

(3) サブクエリの外部結合クエリが存在しない(内部結合クエリ)

9. ケース条件選択問合せ文 
 

 SELECT CASE ("フィールド名")
     WHEN "条件 1" THEN "結果 1"
     WHEN "条件 2" THEN "結果 2"
     [ELSE "結果 N"]
     END
 FROM "テーブル名";
     
 # "条件" には値を指定できますまたは数式。ELSE 句は必要ありません。
 

mysql> select address,case address
    -> '上海' の場合、高さ-10
    -> '北京' の場合、高さ+5
    -> それ以外の場合、高さ+10
    -> 終了
    -> "new_height"、名前
    -> 情報から;
 

 10. 正規表現の使用
10.1 SQL 正規表現の一般的なタイプ
 

通常の記号 機能
^ テキストの開始文字と一致
$ テキストの終了文字と一致
. 任意の 1 文字と一致
* 直前の 0 文字以上の文字と
一致 + 直前の文字を 1 回以上
一致 文字列一致には、指定された文字列
l または、前の「|」が true でない場合は、次の文字列と一致します
[...] 文字セット内の任意の文字と一致します[^...] 括弧{n}
内にない任意の文字と一致します
前の文字と一致する 文字列 n 回
{n,m} は、前の文字列と少なくとも n 回、最大で m 回一致します
 

10.2 SQL通常アプリケーション 
 

フォーマット:

select "field" from "table name" where "field" regexp '正規表現';
 

 探索: 空の値 (NULL) と値なし (' ') の違い
値がない長さは 0 であり、スペースを必要としませんが、NULL 値の長さは NULL で、スペースを必要とします。

IS NULL または IS NOT NULL は、フィールドが NULL か非 NULL かを判断するために使用され、値がないかどうかを調べることはできません。

値なしの判定には =' ' または < >' ' を使用します。<> は等しくないことを表します。

count () を使用してフィールドによってカウントされる行数を指定する場合、NULL 値が見つかった場合は自動的に無視され、値が見つからなかった場合は計算のためにレコードに追加されます。

おすすめ

転載: blog.csdn.net/zl965230/article/details/130625543