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

SQL

複数の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_idname
1田中
2佐藤
3鈴木

テーブルB (osaka_customers)

customer_idname
2佐藤
4高橋
5伊藤

UNION を使って結合してみましょう。

SELECT customer_id, name FROM tokyo_customers
UNION
SELECT customer_id, name FROM osaka_customers;

実行結果

customer_idname
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_idname
1田中
2佐藤
3鈴木
2佐藤
4高橋
5伊藤

UNION ALL の結果では、「佐藤」さんの情報が重複して表示されているのがわかりますね。

注意点: UNION と同様に、結合する SELECT 文は、カラムの数と対応するカラムのデータ型が一致している必要があります。

UNION と UNION ALL の比較と使い分け

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

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

パフォーマンスについて 🚀

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

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

どちらを使うべきか? 🤔

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

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

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

まとめ 🎉

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

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

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

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

コメント

タイトルとURLをコピーしました