こんにちはSQL講習です
オブジェクティブグループの@Yukidarusanです!
弊社では月に1回、社内講習会を開いておりまして自分はSQL講習を担当しております。
さて、SQLでの第一の壁といえば結合!
SQLの基本構文である JOIN
と UNION
。
JOIN
は講習などでもよく扱われますが、 UNION
はあまり触れられず、
「使用禁止」にされている現場すらあります。
今回は以下の観点から、両者の違いや使い分けについてお話します!
- UNIONの基本と挙動
- JOINとの明確な違い
- なぜUNIONがパフォーマンス的に問題視されるのか
- 実務での使い分けの判断軸
1. そもそもUNIONとは?
UNIONは、2つ以上のSELECT文の結果を縦方向に合体させるための構文です。
SELECT name, age FROM employees
UNION
SELECT name, age FROM contractors;
この例では、employeesとcontractorsという2つのテーブルのnameとageを取得し、同じ構造の1つの結果セットにまとめます。
列の数とデータ型が一致している必要があります
結果は重複排除された状態で返されます(※後述)
2. UNIONとUNION ALLの違い
UNION
にはUNION ALL
というものがあり、特徴により違いがあります。
パフォーマンスチューニングで触ることが多くなるものです!
- UNION -- 重複を削除する(DISTINCT 相当)
- UNION ALL -- 重複をそのまま残す(高速)
句 | 特徴 | パフォーマンス |
---|---|---|
UNION | 重複行を削除(DISTINCT扱い) | 遅くなりがち(ソート発生) |
UNION ALL | 重複を残す | 高速 |
UNION は内部的に「重複チェック(ソートやハッシュ)」を行うため、大規模なデータを扱うと極端に遅くなる場合があります。
3. 現場でUNIONが禁止される理由
実際の開発現場では、UNION
の使用が制限されたり、レビューでリジェクトされるケースもあります。
その主な理由はこちら
① パフォーマンスが悪化しやすい
-
UNION
は重複排除のために全件を読み込んでソートする必要がある - インデックスが効きにくく、実行計画が重くなりがち
- 特にサブクエリ内やビューで使われると致命的に遅くなることも
② チューニングが難しい
- SELECT句が複数あるため、一部の列変更が全体に波及
- 実行計画も読みづらくなり、インフラ・SQLチューニングが困難
- 開発・運用面での「保守性の低さ」が嫌われる
③ 静的解析やコード規約でブロックされることも
- 「SQL整形ツールでエラーになる」
- 「ORMやBIツールが対応していない」
- 「バグにつながる可能性があるので原則NG」
4. JOINとの違いは?
ざっくりと比較してみました!
比較項目 | JOIN(結合) | UNION(合算) |
---|---|---|
結合方向 | 横(列を増やす) | 縦(行を増やす) |
主な用途 | 関連データを組み合わせる | 同じ構造のデータをまとめる |
必要な条件 | ON句で結合条件が必要 | 列数・型が一致していればOK |
重複データ | そのまま表示される | UNIONは削除、ALLは保持 |
パフォーマンス | 比較的良好 | 重くなりやすい(特にUNION) |
使用頻度 | 高い | 制限されることもある |
JOINは「横方向の関係性」、UNIONは「縦方向の集約」
5. 使い分けの判断基準
違いが分かっても、どうするねん!ってなりがちなので、
判断基準を記載してみました。
(参考程度に見てみてください
-
🟢 JOINを使うケース
- テーブル間にリレーション(外部キーなど)がある
- 関連するデータを1行にまとめたい
- 複数の情報を1つの行に集約したいとき
-
🟡 UNIONを使うケース
- 同一構造のテーブル・ビューを1つにまとめたい
- 「正社員」「契約社員」「派遣社員」など分類ごとにテーブルが分かれている
- 重複の有無に応じて
UNION
orUNION ALL
を選択
-
🔴
UNION
を避けたいケース- 大量データで、重複除去が不要なのにUNIONを使っている
- 既存のビューやサブクエリで複雑なUNIONが重なっている
- パフォーマンスが悪化しているが理由がわからない場合
✅ まとめ:JOINとUNION、どちらを使う?
というわけで、まとめますとこうなります。
項目 | JOIN | UNION(ALL) |
---|---|---|
結合方向 | 横(列を増やす) | 縦(行を増やす) |
関係性 | リレーションあり | 同じ構造の別テーブル |
処理速度 | 速い | UNIONは遅くなりがち |
主な用途 | データの関連付け | データの合算・統合 |
重複行 | 表示される | UNIONは削除、ALLは残す |
結論としては…
🔍 JOINは「関係をつなぐ」
🔍 UNIONは「同じ種類のデータをまとめる」
そして、UNION
を使うときは「重複が本当に不要か?」を見極めるのがポイントです。
✍️ おわりに
SQLは書けるけど、なぜその構文を使うのかを説明できることが現場での力につながります。
JOIN
とUNION
の本質的な違いを理解して、適切な選択ができるようになりましょう!
オブジェクティブグループでは X の投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。