UNION / INTERSECT / EXCEPT の使い方

結果を重ねる

書き方

SELECT … UNION [ALL] SELECT …
SELECT … INTERSECT SELECT …
SELECT … EXCEPT SELECT …(Oracle は MINUS)

列の数と型をそろえます。UNION は重複を除き、UNION ALL は残します。

よく使うオプション

オプション意味
UNION2 つの結果を縦に重ね、重なった行を除く
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 は、登録不要・無料で遊べます(それより先はブロンズ以上のプランで遊べます)。

SQL 構文一覧(使い方と例)へ戻る