データベースのリレーショナル操作のコレクション

従来の集合演算


従来の集合演算には、和集合 (UNION)、差分集合 (EXCEPT または MINUS または LEFT JOIN&&IS NULL)、交差 (INTERSECT または INNER JOIN)、およびデカルト積 (JOIN) が含まれます。

異なるデータベースの構文は多少異なる場合がありますが、この段落で説明するのは一般的な概念であることに注意してください。

1:ユニオン(UNION)

複合効果: 重複した行を削除します。

2 つのテーブルのすべての同じ列の内容が一致しているかどうかを比較しますが、一方のテーブルの n 列のデータと別の n+1 列のデータを使用して UNION を使用しないでください。そうしないとエラーが発生します。

たとえば、表 1 の people1 のデータは次のとおりです。

画像の説明を追加してください

たとえば、表 2 の people2 のデータは次のとおりです。

画像の説明を追加してください

UNION を使用します。

select * from people1 
union 
select * from people2;

ここに画像の説明を挿入

2: 違い (例外、マイナス、左結合&&IS NULL)

減算: 一方のセットには存在するが、もう一方のセットには存在しない要素を検索します。

  1. 比較列の数は同じである必要があり、あるセットの n 列を別のセットの n+1 列と比較することはできません。(上記の段落の内容により、少し混乱するかもしれません。実際、select * が使用されていない場合、select name from people1 と select name,source from people2 が比較されます。)
  2. 対応する列のデータ型には互換性がある必要があります。あるセットの列は int 型であり、別の varchar セットの列はセット演算を実行しないでください。

MySQL は EXCEPT または MINUS をサポートしていません。LEFT JOIN&&IS NULL を使用して実現できます。これは必須ではありません。同じロジックを実現できる他の方法も可能です。

PostgreSQL と Oracle は EXCEPT または MINUS をサポートします。

例: 表 1 の people1 のデータは次のとおりです。

画像の説明を追加してください

たとえば、表 2 の people2 のデータは次のとおりです。

画像の説明を追加してください

使用上の違い (MySQL データベース):

select * from people1 
left join 
people2 
on people1.name = people2.name 
where people2.name is null;

join は on と一緒に使用する必要があります。

減算の使用 (PostgreSQL および Oracle データベース):

select * from people1 
MINUS
select * from people2 

ここに画像の説明を挿入

データ「Yasuo」の行は他のコレクションには存在しないことがわかります。

3: 交差 (INTERSECT または INNER JOIN)

交差: 両方のセットが等しい行を返します。

MySQL は INTERSECT をサポートしていません。INNER JOIN を使用して交差関数を実現できます。

PostgreSQL と Oracle は INTERSECT をサポートします。

例: 表 1 の people1 のデータは次のとおりです。

例: 表 1 の people1 のデータは次のとおりです。

画像の説明を追加してください

たとえば、表 2 の people2 のデータは次のとおりです。

画像の説明を追加してください

交差の使用 (MySQL データベース):

select * from people1 
inner join 
people2 
on people1.name = people2.name;

ここに画像の説明を挿入

データ「Riven」の行が両方のセットに存在することがわかります。

4: デカルト積(JOIN)

デカルト積には通常、結合条件があります。

  1. INNER JOIN (内部結合): 両方のコレクションで一致する行を返します。
  2. LEFT JOIN (左側の接続): 左側のテーブルのすべての行と、右側のテーブルの一致する行を返します。それ以外の場合、右側のテーブルは NULL を返します。
  3. RIGHT JOIN (右接続): 右のテーブルのすべての行と、左のテーブルの一致する行を返します。それ以外の場合、左のテーブルは NULL を返します。
  4. FULL JOIN (完全接続): 左テーブルと右テーブルのすべての行を返します。一方の行ともう一方の行が一致しない場合は、NULL が返されます。

特殊な集合演算


特殊なコレクション操作には、選択 (SELECT)、投影 (PROJECTION)、接続 (JOIN)、および分割 (DIVISION) が含まれます。

1:選択(SELECT)

選択関数: 特定の条件を満たす行を選択します。通常は WHERE で実装されます。

select * from people1 
where name = "亚索";

ここに画像の説明を挿入

2:投影(PROJECTION)

射影関数: コレクション内の特定の列を選択します

select name,source 
from people1 
where name = "亚索";

ここに画像の説明を挿入

3: 接続(JOIN)

結合の役割: 通常、INNER JOIN、LEFT JOIN、RIGHT JOIN、または FULL JOIN を使用して 2 つのテーブルを結合します。

4:ディバイド(DIVISION)

これをうまく利用するには、アプリケーションのシナリオを想像する必要があります。

例えば:

  1. すべてのアイテムを購入した人を探したい
  2. すべての賞を受賞したクラスを見つけたい
  3. すべてのイベントに参加した従業員を探したい

たとえば、表 3 の people3 のデータは次のとおりです。

ここに画像の説明を挿入

たとえば、表 4 の allproject データは次のとおりです。

ここに画像の説明を挿入

すべてのプロジェクトに参加した人を見つけるには、分割を使用します。

select name from people3 
group by name 
having count(distinct project) = (select count(*) from allproject);

ここに画像の説明を挿入

割り算(DIVISION)の基本的な考え方:GROUP BYを使ってグループ化し、HAVINGを使って各グループの数が集合全体の数と等しいかどうかを判定します。

おすすめ

転載: blog.csdn.net/qq_41974199/article/details/131024416