Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

SQL UNIONの使い方をやさしく解説|違い・注意点・活用例まとめ

2

あなたもこんな経験ありませんか?

  • 「異なるテーブルのデータを一度に取得したいけど、どうすればいいのかわからない」

  • 「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の違い

初心者がつまずきやすいのが、UNIONUNION 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を味方に、もっと柔軟なデータ取得を実現しましょう。

【外部リンク】

MySQL公式ドキュメント:UNION

PostgreSQL公式:UNION構文

Microsoft SQL Server: UNION (Transact-SQL)

【内部リンク】

【SQL】副問い合わせ入門|基本構文から実例まで徹底解説

【Docker入門】MySQL環境を手軽に構築する方法を徹底解説

【図解・実践コード付き】MySQLのROW_NUMBER()完全ガイド|最新データを1件だけ抽出するROW_NUMBER()の使い方順番付けの基本と実務での活用法

RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE