モジュールのレッスン (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 になります。
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 人の顧客 × 16 製品 = 192 行。実際のデータではめったに使用されません( 高価です!)、しかし、次の場合に役立ちます。
- 「すべて対すべて」の組み合わせを生成します (互換性マトリックスなど)。
- テーブルと定数/パラメータの小さなテーブルを組み合わせます。
ユニオンとユニオンオール
UNION は、同じ番号を持つ 2 つの SELECT の結果を追加します。
列のタイプ:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';ルール:
- 2 つの
SELECTには、互換性のある同じ数の列が必要です。 タイプ; UNION(ALLなし) 重複を削除 — 効果的に 最終結果についてはDISTINCT。UNION ALLは重複も保持し、はるかに高速です。 重複排除のためのソート/ハッシュを回避します。
-- 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 番目の行にはない最初の行 (セット
「違い」)。
-- 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 バリアントにはありません。
自分で試してみてください
Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati)。ウナ・コロンナ:メール。電子メールによるオルディナ。
ヒントを表示
同じ電子メール列を返す 2 つの SELECT 間の UNION。 ORDER BY は最後、最終結果に適用されます。
3 回の試行後に解決策が利用可能になります
復習演習
飯能以外でのメール送信も可能です。米国を除く。ウナ・コロンナ:メール。電子メールによるオルディナ。
ヒントを表示
EXCEPT は、右側の SELECT に存在しない左側の SELECT の行のみを保持します。
3 回の試行後に解決策が利用可能になります