あなたもこんな経験ありませんか?
-
「異なるテーブルのデータを一度に取得したいけど、どうすればいいのかわからない」
-
「UNIONとUNION ALLの違いがいまいちピンとこない」
-
「結果をまとめたいけどJOINじゃうまくいかない…」
SQLで複数のクエリ結果を一つにまとめたいとき、UNIONはとても便利な構文です。とはいえ、JOINとの違いや、UNION ALLとの使い分けに迷う方も多いのではないでしょうか?
この記事では、SQL UNIONの基礎から応用までを、初心者にもわかりやすく丁寧に解説します。実務でも頻出する処理なので、ここでしっかり理解しておきましょう!
SQL UNIONの基本と構文
◆ UNIONとは?
UNIONは、複数のSELECT文の結果を縦にまとめるためのSQL構文です。
SELECT 列1, 列2 FROM テーブルA
UNION
SELECT 列1, 列2 FROM テーブルB;
上記のように書くことで、テーブルAとテーブルBの同じ構造の列を1つの結果セットにまとめることができます。
◆ UNIONの基本ルール
UNIONを使うには、以下のルールを守る必要があります:
-
各SELECT文の列数と順序が一致していること
-
各列のデータ型が互換性のあるものであること
POINT:SELECT文の構造をそろえることが大前提です。
◆ UNIONとUNION ALLの違い
初心者がつまずきやすいのが、UNIONとUNION ALLの違いです。
-- 重複行を自動で削除
SELECT name FROM users
UNION
SELECT name FROM admins;
-- 重複行もそのまま取得
SELECT name FROM users
UNION ALL
SELECT name FROM admins;
違いのまとめ
-
UNION → 重複行を自動で削除(処理コストがやや高い)
-
UNION ALL → 重複行も含めてすべて返す(高速)
◆ 視覚的に理解しよう!
┌────────────┐ ┌────────────┐
│ SELECT A │ UNION │ SELECT B │
└────────────┘ └────────────┘
↓(重複行を除外)
┌────────────────┐
│ 結合された結果 │
└────────────────┘
┌────────────┐ ┌────────────┐
│ SELECT A │ UNION ALL │ SELECT B │
└────────────┘ └────────────┘
↓(重複行も含めて)
┌────────────────┐
│ 結合された結果 │
└────────────────┘
◆ 実務での活用例:アクティビティログをまとめる
例えば、ユーザーと管理者のログイン履歴を1つにまとめたい場合
SELECT user_id, login_at, 'user' AS role FROM user_logins
UNION ALL
SELECT admin_id, login_at, 'admin' AS role FROM admin_logins
ORDER BY login_at DESC;
このようにすれば、ログの種類を区別しながら時系列で一覧化できます。
つまずきやすいポイントとベストプラクティス
◆ よくあるミス①:列数が合っていない
-- エラーになる例
SELECT name, email FROM users
UNION
SELECT name FROM admins;
エラー内容:SELECTの列数が一致しません
正しい書き方
SELECT name, email FROM users
UNION
SELECT name, NULL AS email FROM admins;
◆ よくあるミス②:ORDER BYの位置
-- エラーになる例
SELECT name FROM users ORDER BY name
UNION
SELECT name FROM admins;
UNIONの中でORDER BYを使う場合は、最後のSELECTの後にまとめて記述する必要があります。
正しい書き方
SELECT name FROM users
UNION
SELECT name FROM admins
ORDER BY name;
◆ よくある誤解:UNIONはJOINの代替ではない
「UNIONすればテーブルの情報が結合できる」と誤解されがちですが、JOINとはまったく用途が異なります。
-
JOIN:列(横方向)を結合
-
UNION:行(縦方向)を結合
◆ ベストプラクティス
-
大量データを扱うときはUNION ALLを使う:重複削除のコストを避ける
-
デバッグ時はLIMITで結果を絞る:誤った結合の影響を確認しやすくなる
-
明示的にカラムを指定する:SELECT *は避ける(構造変更の影響を受けやすい)
まとめと次のステップ
◆ この記事のまとめ
-
UNIONは複数のSELECT結果をまとめる構文
-
UNIONは重複行を削除、UNION ALLはすべて取得
-
列数・データ型・ORDER BYの位置に注意
-
JOINとは役割が異なる(縦 vs 横)
-
実務でもログの統合や一覧化などで頻出
コード実行環境の案内
今回紹介したSQLは、以下のような環境で試すことができます。
-
ローカルのMySQL/PostgreSQL環境
-
DBブラウザ for SQLiteなどのGUIツール
-
オンラインSQL実行サービス(例:SQL Fiddle、DB Fiddleなど)
自分の手で動かしてみることで、理解がさらに深まります。
最後までお読みいただきありがとうございました。
SQLの基本をしっかり押さえることが、実務での自信と効率アップにつながります。UNIONを味方に、もっと柔軟なデータ取得を実現しましょう。
【外部リンク】
Microsoft SQL Server: UNION (Transact-SQL)
【内部リンク】
【Docker入門】MySQL環境を手軽に構築する方法を徹底解説
【図解・実践コード付き】MySQLのROW_NUMBER()完全ガイド|最新データを1件だけ抽出するROW_NUMBER()の使い方順番付けの基本と実務での活用法