UNION / INTERSECT / EXCEPT の使い方
結果を重ねる
書き方
SELECT … UNION [ALL] SELECT … SELECT … INTERSECT SELECT … SELECT … EXCEPT SELECT …(Oracle は MINUS)
列の数と型をそろえます。UNION は重複を除き、UNION ALL は残します。
よく使うオプション
| オプション | 意味 |
|---|---|
UNION | 2 つの結果を縦に重ね、重なった行を除く |
UNION ALL | 重なった行も残す(速い) |
INTERSECT | 両方にある行だけ |
EXCEPT | 左にあって右に無い行だけ(Oracle は MINUS) |
例
SELECT name FROM employees UNION SELECT name FROM customers;
社員と客の名前を 1 つの一覧にします。両方にいる名前は 1 回だけ出ます。
SELECT 'paid' AS kind, COUNT(*) FROM orders WHERE status = 'paid'
UNION ALL
SELECT 'cancel', COUNT(*) FROM orders WHERE status = 'cancel'; kind | count
--------+-------
paid | 410
cancel | 23
(2 rows)2 つの集計を、別々の行として並べます。重なりを気にしなくてよいときは UNION ALL のほうが速いです。
SELECT customer_id FROM orders WHERE ordered_on < '2024-01-01' EXCEPT SELECT customer_id FROM orders WHERE ordered_on >= '2024-01-01';
去年までは注文していたのに、今年は注文していない客を出します。
SELECT city FROM customers WHERE id <= 50 INTERSECT SELECT city FROM customers WHERE id > 50;
前半の客と後半の客の、両方に出てくる町を出します。
よくある間違い・注意
- 上と下の SELECT は、列の数と型をそろえます。列の名前は上の SELECT のものになります。
- ORDER BY は最後の SELECT の後に 1 回だけ書き、全体を並べます。
実際に打って練習する
SQL コースの Lv30「結果を重ねる UNION」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
Lv1〜3 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。