メインコンテンツにスキップ
モジュール 5 · レッスン 4 / 4コース内の 20/57~12 min
モジュールのレッスン (4/4)

UNION、INTERSECT、EXCEPT (および CROSS JOIN)

これまでのところ、水平にデータを結合しました: JOIN は列をアタッチします 関連する行から。 SQL は、別の演算子ファミリーも提供しています。 データを 垂直方向に結合し、2 つの SELECT の結果を次のように扱います。 セット: UNION、INTERSECT、EXCEPT。 CROSS JOIN についても再確認します。 デカルト積。

CROSS JOIN: すべての行とすべての行

CROSS JOIN には ON がありません。可能なすべての組み合わせが生成されます。 2 つのテーブル間の行 (デカルト積)。 A に n 行があり、B がある場合 m 行ある場合、結果は n × m になります。

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 人の顧客 × 16 製品 = 192 行。実際のデータではめったに使用されません( 高価です!)、しかし、次の場合に役立ちます。

  • 「すべて対すべて」の組み合わせを生成します (互換性マトリックスなど)。
  • テーブルと定数/パラメータの小さなテーブルを組み合わせます。

ユニオンとユニオンオール

UNION は、同じ番号を持つ 2 つの SELECT の結果を追加します。 列のタイプ:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

ルール:

  • 2 つの SELECT には、互換性のある同じ数の列が必要です。 タイプ;
  • UNION (ALL なし) 重複を削除 — 効果的に 最終結果については DISTINCT。
  • UNION ALL は重複も保持し、はるかに高速です。 重複排除のためのソート/ハッシュを回避します。
SQL
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM   customers c JOIN orders  o ON o.customer_id = c.id
UNION
SELECT c.email
FROM   customers c JOIN reviews r ON r.customer_id = c.id;

交差と除外

INTERSECT は 両方の結果に存在する行のみを保持します。 EXCEPT 2 番目の行にはない最初の行 (セット 「違い」)。

SQL
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECT および EXCEPT もデフォルトで重複を削除します。の INTERSECT ALL / EXCEPT ALL バリアントにはありません。

自分で試してみてください

運動#sql.m5.l4.e1
試行回数: 0読み込み中…

Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati)。ウナ・コロンナ:メール。電子メールによるオルディナ。

エディターを読み込み中…
ヒントを表示

同じ電子メール列を返す 2 つの SELECT 間の UNION。 ORDER BY は最後、最終結果に適用されます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m5.l4.e2
試行回数: 0読み込み中…

飯能以外でのメール送信も可能です。米国を除く。ウナ・コロンナ:メール。電子メールによるオルディナ。

エディターを読み込み中…
ヒントを表示

EXCEPT は、右側の SELECT に存在しない左側の SELECT の行のみを保持します。

3 回の試行後に解決策が利用可能になります