[SQLのはじめ方] Part15: UNIONとUNION ALLの違い

複数のSELECT結果をどうやってくっつける?

SQLで複数のテーブルやクエリから得られた結果を、縦方向に結合したい場面があります。例えば、「東京支店の従業員リスト」と「大阪支店の従業員リスト」を一つにまとめたい、といったケースです。

そんなときに活躍するのが UNIONUNION 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 の比較と使い分け

ここまでの説明で、UNIONUNION ALL の主な違いは「重複行の扱い」であることがわかりましたね。それぞれの特徴をまとめてみましょう。

機能 UNION UNION ALL
重複行の扱い 削除する 削除しない (そのまま結合)
処理速度 遅い傾向 (重複チェックのため) 速い傾向
結果の順序 保証されない (暗黙のソートが入る場合がある) 保証されない (基本的に元の順序で結合されることが多い)

パフォーマンスについて

UNION は重複行を削除するために、内部的にソートなどの処理を行う場合があります。そのため、一般的に UNION ALL よりも処理速度が遅くなる傾向があります。

もし、結合するデータに重複がないことが分かっている場合や、重複があっても問題ない場合は、UNION ALL を使う方がパフォーマンス上有利です。

どちらを使うべきか?

  • 重複した結果を除外したい場合 UNION
  • 重複を含めたすべての結果が必要な場合 UNION ALL
  • パフォーマンスを重視する場合 (重複がない、または重複しても良い場合) UNION ALL

目的に応じて適切な方を選びましょう!

補足: どちらの演算子を使った場合でも、最終的な結果セットの順序を保証したい場合は、クエリの最後に ORDER BY 句を追加する必要があります。

まとめ

今回は、複数の SELECT 文の結果を結合する UNIONUNION ALL について学びました。

  • UNION: 結果を結合し、重複行を削除する。
  • UNION ALL: 結果を結合し、重複行もそのまま含める。一般的に UNION より高速。
  • どちらも結合する SELECT 文のカラム数とデータ型を一致させる必要がある。

これらの違いを理解し、状況に応じて使い分けることで、より効率的で意図した通りのデータ抽出が可能になります。

これで Step 4 は完了です!お疲れ様でした 次のステップでは、データ定義言語(DDL)について学んでいきましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です