複数のSELECT結果をどうやってくっつける?
SQLで複数のテーブルやクエリから得られた結果を、縦方向に結合したい場面があります。例えば、「東京支店の従業員リスト」と「大阪支店の従業員リスト」を一つにまとめたい、といったケースです。
そんなときに活躍するのが UNION と UNION ALL です。どちらも結果セットを結合する機能を持っていますが、重要な違いがあります。しっかり理解して使い分けられるようになりましょう!
UNION: 重複を除いて結合する
UNION は、複数の SELECT 文の結果セットを結合し、重複する行を自動的に削除してくれます。
例えば、`支店Aの顧客リスト` と `支店Bの顧客リスト` があり、両方に登録されている顧客がいた場合、UNION で結合すると、その顧客情報は1行だけ表示されます。
基本的な構文
SELECT カラム1, カラム2 FROM テーブル1
UNION
SELECT カラム1, カラム2 FROM テーブル2;具体例
以下の2つのテーブルがあるとします。
テーブルA (tokyo_customers)
| customer_id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
テーブルB (osaka_customers)
| customer_id | name |
|---|---|
| 2 | 佐藤 |
| 4 | 高橋 |
| 5 | 伊藤 |
UNION を使って結合してみましょう。
SELECT customer_id, name FROM tokyo_customers
UNION
SELECT customer_id, name FROM osaka_customers;実行結果
| customer_id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
| 4 | 高橋 |
| 5 | 伊藤 |
結果を見ると、`customer_id` が 2 の「佐藤」さんは両方のテーブルに存在しましたが、結果セットでは1行にまとめられていますね。これが UNION の特徴です。
UNION で結合する SELECT 文は、カラムの数と、対応するカラムのデータ型が一致している必要があります。 UNION ALL: 全てをそのまま結合する
UNION ALL は、UNION と同様に複数の SELECT 文の結果セットを結合しますが、重複する行もそのまま含めて表示します。
先ほどの例で UNION ALL を使うと、「佐藤」さんの情報は2回表示されることになります。
基本的な構文
SELECT カラム1, カラム2 FROM テーブル1
UNION ALL
SELECT カラム1, カラム2 FROM テーブル2;具体例
先ほどと同じテーブルを使って UNION ALL で結合してみましょう。
SELECT customer_id, name FROM tokyo_customers
UNION ALL
SELECT customer_id, name FROM osaka_customers;実行結果
| customer_id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
| 2 | 佐藤 |
| 4 | 高橋 |
| 5 | 伊藤 |
UNION ALL の結果では、「佐藤」さんの情報が重複して表示されているのがわかりますね。
UNION と同様に、結合する SELECT 文は、カラムの数と対応するカラムのデータ型が一致している必要があります。 UNION と UNION ALL の比較と使い分け
ここまでの説明で、UNION と UNION ALL の主な違いは「重複行の扱い」であることがわかりましたね。それぞれの特徴をまとめてみましょう。
| 機能 | UNION | UNION ALL |
|---|---|---|
| 重複行の扱い | 削除する | 削除しない (そのまま結合) |
| 処理速度 | 遅い傾向 (重複チェックのため) | 速い傾向 |
| 結果の順序 | 保証されない (暗黙のソートが入る場合がある) | 保証されない (基本的に元の順序で結合されることが多い) |
パフォーマンスについて
UNION は重複行を削除するために、内部的にソートなどの処理を行う場合があります。そのため、一般的に UNION ALL よりも処理速度が遅くなる傾向があります。
もし、結合するデータに重複がないことが分かっている場合や、重複があっても問題ない場合は、UNION ALL を使う方がパフォーマンス上有利です。
どちらを使うべきか?
- 重複した結果を除外したい場合
UNION - 重複を含めたすべての結果が必要な場合
UNION ALL - パフォーマンスを重視する場合 (重複がない、または重複しても良い場合)
UNION ALL
目的に応じて適切な方を選びましょう!
ORDER BY 句を追加する必要があります。 まとめ
今回は、複数の SELECT 文の結果を結合する UNION と UNION ALL について学びました。
UNION: 結果を結合し、重複行を削除する。UNION ALL: 結果を結合し、重複行もそのまま含める。一般的にUNIONより高速。- どちらも結合する
SELECT文のカラム数とデータ型を一致させる必要がある。
これらの違いを理解し、状況に応じて使い分けることで、より効率的で意図した通りのデータ抽出が可能になります。
これで Step 4 は完了です!お疲れ様でした 次のステップでは、データ定義言語(DDL)について学んでいきましょう!