目次
複数テーブルの結合クエリ
1. 結合クエリを通じて、2 つのテーブルのレコードのセット、共通のレコードのセット、またはいずれかのテーブルのレコードのセットを取得できます。
2. 結合クエリは行単位でテーブルを操作し、主に行数を増減します。
3. 結合クエリとして使用される複数のテーブル間の列数と列数の種類は同じである必要があります (例: テーブル 1 でどの列がクエリされ、テーブル 2 でどの列がクエリされるか)。
4. 共同クエリはデフォルトで重複レコードを削除します
5. 結合クエリでは任意の SELECT ステートメントを使用できますが、ORDER BY 句は最後の時点でのみ使用できます。
ユニオンクエリタイプ
UNION は 2 つのテーブルの特定のフィールドのレコードを追加します (ユニオン)
ALL はキーワードとして使用され、集合演算の結果が重複行を保持することを示します (通常は UNION ALL)。
INTERSECT は、2 つのテーブルの一部のフィールドの共通レコードを抽出 (交差) します (MySQL は存在しません。代わりに次の接続クエリを使用できます)。
EXCEPT は、2 つのテーブルの一部のフィールドの共通レコードを減算し、テーブルの残りのレコード (差分セット) を返します (MySQL は存在しません。実現するには NOT IN フィールドを使用します)。
ユニオンクエリの形式
ユニオン形式
SELECTフィールド リスト FROM テーブル A ... UNION SELECTフィールド リスト FROM テーブル B ...;
テーブル A クエリとテーブル B クエリの和集合を返します (および重複排除処理)。
全結合形式
Union クエリと比較して、このクエリはマージされたデータを重複排除できません。
ユニオンクエリのデモ
デモのために次の 2 つのテーブルを使用します。
select name , age from Staff1 where origo = '重慶' Union select name , age from user; # query table 1 origoは重慶の名前、ageフィールドの結果と table 2のクエリname 、age 、および重複排除の結果を加えたものです。処理 ( 2 つのテーブルの名前と年齢のデータ型は一貫している必要があります)select name , age from Staff1 where origo = ' Chongqing ' Union all select name , age from user; #重複排除処理なしselect name , age from Staff1 where ( name , age ) not in ( select name , age from user ) ; #テーブル1とテーブル2の差をクエリします (テーブル1とテーブル2の共通部分からテーブル1のクエリ結果を減算します) )
複数テーブル結合クエリ
マルチテーブルクエリは水平列に基づいており、主に他のテーブルのいくつかの列を追加します。
複数テーブルのクエリを実行する場合、SELECT 句の列は通常、テーブル名別名.列名という形式で記述されます。
デモンストレーションには 2 つのテーブルを使用します
複数テーブルクエリの分類
クロスクエリ
2 つのテーブルのすべてのレコードを結合すると、取得されるレコードの数は 2 つのテーブルの行数の積になります。
内部結合クエリ
テーブル A と B の共通部分のデータをクエリする
外部結合クエリ
左外部結合: 左側のテーブルのすべてのデータと、2 つのテーブルの交差部分のデータをクエリします。
右外部結合: 右側のテーブル内のすべてのデータと、2 つのテーブルの共通部分のデータをクエリします。
自己結合クエリ
テーブルは 1 つだけあり、現在のテーブルはそれ自体に接続されています (サブ結合ではテーブルのエイリアスを使用する必要があります)。
クロスクエリ(デカルト積)
クロス結合は集合演算子 GROSS JOIN (デカルト積) を使用して行われます。
他のテーブル フィールドを追加しながら 2 つのテーブルのすべてのレコードをクロス結合すると、取得されるレコードの数は 2 つのテーブルの行数の積になります。
フォーマット
SELECT フィールドリスト FROM テーブル 1、テーブル 2; 表示されるデータ量はテーブル 1 のデータ量 * テーブル 2 のデータ量です
予防
結果が多すぎてエラーが発生し、実用的な価値があまりなく、計算時間がかかるため、このクエリは実際のビジネスでは使用されないという現象がわかります。
ただし、このクエリはすべてのテーブル クエリの基礎となります。
select user . name , career. name from user , career ; #エイリアスは使用されません select u. name , c. name from user u , career c ; #クロスクエリにエイリアスを使用
内部結合クエリ
両方のテーブルに存在するデータ、つまり 2 つのテーブルの交差データを選択できます。
暗黙的な内部接続と明示的な内部接続に分けられますが、両者は書き方が違うだけで、得られる結果は全く同じです。
暗黙的な内部結合
SELECT フィールド リスト FROM テーブル 1、テーブル 2 WHERE 条件リスト;
明示的な内部結合
SELECT フィールド一覧 FROM テーブル 1 [INNER] JOIN テーブル 2 ON 接続条件一覧 [WHERE 判定文] ;
INNERは省略可能
このステートメントに Where を追加する場合は、ON ステートメントが FROM と WHERE の間にある必要があることに注意する必要があります。
実行シーケンスは次のとおりです。最初に内部接続を表示し、次に接続の結果に対して Where を実行します。
予防
内部結合を使用するとデータが欠落する可能性があり、NULL 値が欠落します
select u. name , u. age , c. name from user u , career c where u.career_id = c. id ; #implicit query;同じ user.career_id とキャリア.id を持つレコードを選択し、対応するレコードを表示しますuser.name 、user 、 age 、career.nameフィールド; このとき、user.career_idがnull 値であるか、career.id が null 値である場合、null 値に対応するデータが失われます (このとき、 6番目のデータ)select u. name , u. age , c. name from user u join Career c on u.career_id = c. id ; #explicit query; 2 つのクエリの結果は次のとおりです。select u. name , u. age , c. name from user u join Career c on u.career_id = c. id where u. age > 20 ; #上記の結果をフィルタリングするための明示的なクエリ、年齢が次より大きいデータを選択します20
外部結合クエリ
1 つのテーブル (メイン テーブル) の情報をすべて選択し、2 つのテーブルの交差部分の情報を追加します
左外部結合
SELECT フィールド リスト FROM テーブル 1 LEFT [OUTER] JOIN テーブル 2 ON 条件リスト;
[OUTER]は省略可能
テーブル 1 とテーブル 2 の共通部分のデータを含む、テーブル 1 のすべてのデータをクエリします。
select u. name , u. age , c. name from user u left join Career c on u.career_id = c. id ; #左外部結合は、ユーザーテーブルの対応する名前フィールドと年齢フィールドのすべての情報を表示します。ユーザーを追加します。career_idとcareer.idの交差部分右外部結合
SELECT フィールド リスト FROM テーブル 1 RIGHT [OUTER] JOIN テーブル 2 ON 条件リスト;
[OUTER]は省略可能
テーブル 1 とテーブル 2 の共通部分のデータを含む、テーブル 2 のすべてのデータをクエリします。
select u. name , u. age , c. name from user u right join Career c on u.career_id = c. id ; #右外部結合は、キャリアテーブルの対応する名前セクションのすべての情報を表示し、追加します。user.career_idとキャリア.id の交差部分
自己結合クエリ
このテーブルを使用して、自己結合クエリのデモを実行します (このテーブルには、従業員とそれに対応するスーパーバイザーの ID テーブルが記録されます。つまり、managerid に対応する ID の名前はスーパーバイザーの名前です)。
自分自身をクエリに接続します。これは内部接続または外部接続にすることができます。
フォーマット
SELECT フィールド リスト FROM テーブル A エイリアス A JOIN テーブル A エイリアス B ON 条件リスト;
select e1.name , e2.name ' supervisor ' from emp e1 join emp e2 on e1.managerid = e2.id ; #Display query , query 誰が各従業員に対応するスーパーバイザーであるかをクエリ; emp をテーブルe1としてコピーすると理解できますテーブルe2には 2 つのテーブルがあり、e1テーブルのmanageridとe2のID を外部キーとして関連付け、 e1テーブルの名前とe2テーブルの名前を表示します(ここで、明示的な内部結合方式を使用する場合は省略されます) )select e1.name , e2.name ' Boss ' from emp e1 left join emp e2 on e1.managerid = e2.id ; #左外部接続、リーダーのいない従業員も表示されます
サブクエリのルール
サブクエリ (サブクエリ) は、他の SQL クエリの Where 句にネストされたクエリである、ネストされたクエリとも呼ばれます。サブクエリを含むステートメントは、外部ステートメントと呼ばれます。
- サブクエリは () で囲む必要があります
- 一般に、サブクエリの列と比較する必要がある外側のステートメントに複数の列がある場合を除き、サブクエリの SELECT ステートメントにはフィールドが 1 つだけあります。
- サブクエリは集計関数に直接適用できません。また、サブクエリでは ORDER BY を使用できません。
- Ntext、text、image データ型はサブクエリの選択リストでは使用できません
- キーワード DISTINCT は、GROUP BY を含むサブクエリでは使用できません。
サブクエリの分類
サブクエリのさまざまな結果に応じて、4 つのカテゴリに分類できます。
スカラー サブクエリ サブクエリの結果が 1 つの値として返される
列サブクエリ サブクエリの結果は 1 つの列と複数の行になります。
行サブクエリ サブクエリの結果は、複数の列を含む 1 行になります。
テーブルサブクエリ サブクエリの結果は複数の行と複数の列です
サブクエリの位置の違いにより、大きく 3 つのカテゴリに分類できます。
サブクエリが適用される主なケースは 3 つあります。
それらは WHERE の後、FROM の後、および SELECTECT の後です。
サブクエリのさまざまな外部ステートメントに従って、サブクエリは大きく 4 つのカテゴリに分類できます。
サブクエリの外側のステートメントは次のとおりです。
INSERT / UPDATE / DELETE / SELECTのいずれか
サブクエリの異なる結果
次の 2 つのテーブルを使用してクエリを実行します
スカラー サブクエリ - クエリ結果は 1 行 1 列の結果、つまり特定の値のみを返す必要があります。
サブクエリの結果は単一の値であるため、算術演算の実行に使用できます。
一般的な演算子: = 、 <> 、 > 、 >= 、 < 、 <=
select * from emp where dept_id =( select id from dept where name = '営業部門' ) ; #営業部門に対応するすべての従業員をクエリします(最初に営業部門に対応するID をクエリし、次に ID に従って従業員をクエリします) ) select * from emp whereentrydate >= ( selectentrydate from emp where name = ' Zhang San ' ) ; #Zhang San のエントリ後のすべての従業員情報をクエリします (最初に Zhang San のエントリ情報をクエリし、次にこの時間の後に従業員情報をクエリします)列サブクエリ - 返される結果は、複数の行を含む 1 つの列です。
一般的に使用される演算子:
IN INで指定した設定範囲から1つを選択
NOT IN 指定された設定範囲内にありません
ANY サブクエリの戻りリストのいずれか 1 つで十分です
SOME は ANY と同等です
ALL サブクエリによって返されるリスト内のすべての値は、次の条件を満たす必要があります。
select * from emp where給与> all ( select sacal from emp where dept_id =( select id from dept where name = ' R&D 部門' )) ; #すべての財務従業員の給与よりも給与が高い従業員情報をクエリします (first財務部門に対応するidをクエリし、このID を使用して財務部門の従業員の給与をクエリし、これより給与が高い従業員の情報を見つけます)行サブクエリ - 返される結果は複数の列を含む 1 行です。
一般的な演算子: =、<>、IN、NOT IN
select * from emp where (給与,マネージャー ID ) = ( select給与,マネージャー ID from emp where name = ' Li Si ' ) ; #Li Si と同じ給与とリーダーシップを持つ他の従業員の情報をクエリするテーブルサブクエリ - 返される結果は複数の行と複数の列です
よく使用される演算子: IN
from の後に現れることが多い
select * from emp where ( dept_id ,給与) in ( select dept_id ,給与from emp where name = ' Old Five ' or name = ' Li Si ' ) ; #Lao Wu と同じ部門、同じ給与を持つ他の従業員をクエリするまたは Li Si 従業員情報 select e .* 、部門名from ( select * from emp whereentrydate > '2001-01-01' ) eleft join dept on e.dept_id = dept.id ; #入力時刻が2001-01-01より後の従業員情報および対応する部門情報を照会します
存在するか存在しない
形式は次のとおりです: EXISTS (サブクエリ)
EXISTS は、サブクエリが少なくとも 1 行のデータを返すかどうかを確認するために使用されます。サブクエリが少なくとも 1 行のデータを返す場合は True、サブクエリがデータを返さない場合は False
場合によっては、代わりに IN または ANY フィールドを使用することもできます。
NOT EXISTS はEXIST の反対です
select * from emp where names ( select * from emp where id = 10 ) ; # id=10の値がある限り、empテーブルにクエリを実行しますが、結果はデータではありません select * from emp where names ( select * from emp where id = 1 ) ; # id=1の値がある限り、emp テーブルをクエリし、結果は emp テーブルのデータになります
サブクエリが適用されるさまざまな場所
サブクエリが適用される主な状況は 3 つあります: WHERE 後、FROM 後、SELECT 後
Where句内 - 一般的なサブクエリは where の後に適用されます。
上記で示したのは、where の後のすべてのサブクエリです。
大概格式:SELECT * FROM t1 WHERE column1= (SELECT column1 FROM t2);
From句では、この時点でサブクエリによって返された結果セットは一時テーブルとして使用されます。これは派生テーブルとも呼ばれます。
派生テーブルは別名を使用して構成する必要があり、派生テーブルの列名は一意である必要があります。
select * from ( select origo , count ( * ) as number from Staff1 group by origo ) as emp where emp.number > 2 ; #居住地ごとにグループ化し、 2を超える居住地に住む人の数をクエリします(派生テーブルの別名は emp)選択後- スカラー サブクエリのみがサポートされ、サブクエリは単一の値を返します。
SELECT (サブクエリ) FROM table1;
サブクエリによって返される単一の値はテーブル 1 のフィールドです。このクエリはほとんど使用されません。
さまざまな外部ステートメントでのサブクエリの適用
サブクエリの外側のステートメントは、INSERT/UPDATE/DELETE/SELECT のいずれかになります。
次の 2 つの表に基づいた実験
SELECT文のサブクエリ
select * from user wherecareer_id = ( select id fromcareer where name = 'シェフ' ) ; #query who is a Chef in user (サブクエリで Chef ID をクエリし、次にこの ID に対応する人物をクエリする外部ステートメント)INSERTステートメントのサブクエリ
insert into user1 ( name , age , career_id ) select * from user wherecareer_id in ( select id fromcareer ) ; # user1テーブルにデータを追加します、追加されたデータはuser テーブル内の役職を持つ人物ですUPDATEステートメントのサブクエリ
update user set age = age * 1.5 where Career_id = ( select ID from Career where name = 'シェフ' ) ; #シェフの年齢を 1.5倍しますDELETEステートメントのサブクエリ
delete from user wherecareer_id = ( select id from Career where name = 'シェフ' ) ; #ユーザーテーブルの職業がシェフであるという情報を説明します