「UNION」句はSELECTの結果を統合する命令で、主にSELECT文と併用して複数のテーブルから抽出したデータ結果を統合するのに使用されます。
本記事では、「UNION」句の基礎知識から「UNION ALL」との違い、WHERE句やORDER BY句などとの併用方法を中心に詳しく解説します。
UNIONとは
SQLの「UNION」句とは、複数のテーブルデータを統合して一つのテーブルにするクエリです。複数の「SELECT」文をUNION句でつなげることで、それぞれのSELECT文で抽出した結果セットを一つにまとめられます。

【基本構文】
SELECT カラム名 FROM テーブルA UNION SELECT カラム名 FROM テーブルB;
UNIONとUNION ALLの違い
UNIONのほかに、ALLというキーワードを付けたUNION ALLというクエリもよく使われますが、この2つは処理の違いによって使い分けられます。
結論から述べると、両者の違いは以下のとおりです。
UNION:重複した行を含めない(重複がある場合は除外して統合する)
UNION ALL:重複した行を含める(重複がある場合もすべて統合する)
【UNION】

【UNION ALL】

UNION句は結果セット内の重複するデータを排除しますが、UNION ALLを使用すると重複したデータも結果に含まれます。以下が基本的なクエリとなります。
【UNION】
-- 重複するデータを排除して結合
SELECT カラム名 FROM テーブルA UNION SELECT カラム名 FROM テーブルB;
【UNION ALL】
-- 重複するデータも結合に含める
SELECT カラム名 FROM テーブルA UNION ALL SELECT カラム名 FROM テーブルB;
この操作を行う際、結合する各SELECT文のカラム数、順序、データ型が一致していることが必要な条件となります。これにより、異なるテーブルやクエリからのデータを、整合性を保ちながら一つの結果セットとしてまとめることができます。
UNIONの使い方
UNIONを適切に利用することで、異なるテーブル間で共通の属性を持つデータを効率的に抽出・統合することができます。以下の「テーブル1」「テーブル2」を例に、具体的な使用方法を見ていきましょう。
テーブル1
+------------+--------+---------------------+--------+
| ユーザ名 | ルート | 購入日 | 購入額 |
+------------+--------+---------------------+--------+
| 佐藤 | A | 2023-04-01 17:29:31 | 2100 |
| 鈴木 | B | 2023-04-05 13:10:45 | 3500 |
+------------+--------+---------------------+--------+
テーブル2
+------------+--------+---------------------+--------+
| ユーザ名 | ルート | 購入日 | 購入額 |
+------------+--------+---------------------+--------+
| 加藤 | A | 2023-04-19 11:37:01 | 1300 |
| 佐藤 | A | 2023-04-01 17:29:31 | 2100 |
+------------+--------+---------------------+--------+
UNION
UNIONを用いることで、複数のテーブルからデータを抽出し、重複する行を1行として表示します。これにより、データの一覧性が向上し、重複を避けることができます。
-- テーブル1とテーブル2からデータを選択し、重複を排除して結合
SELECT name, route, saved_date, price FROM テーブル1
UNION
SELECT name, route, saved_date, price FROM テーブル2;
結果:
+------------+--------+---------------------+--------+
| ユーザ名 | ルート | 購入日 | 購入額 |
+------------+--------+---------------------+--------+
| 佐藤 | A | 2023-04-01 17:29:31 | 2100 |
| 鈴木 | B | 2023-04-05 13:10:45 | 3500 |
| 加藤 | A | 2023-04-19 11:37:01 | 1300 |
+------------+--------+---------------------+--------+
UNION ALL
一方、UNION ALLはUNIONと異なり、重複する行もそのまま表示します。これにより、データの完全な統合が可能となり、どのテーブルからどのようなデータが抽出されたかが一目瞭然となります。
-- テーブル1とテーブル2からデータを選択し、重複も含めて結合
SELECT name, route, saved_date, price FROM テーブル1
UNION ALL
SELECT name, route, saved_date, price FROM テーブル2;
結果:
+------------+--------+---------------------+--------+
| ユーザ名 | ルート | 購入日 | 購入額 |
+------------+--------+---------------------+--------+
| 佐藤 | A | 2023-04-01 17:29:31 | 2100 |
| 鈴木 | B | 2023-04-05 13:10:45 | 3500 |
| 加藤 | A | 2023-04-19 11:37:01 | 1300 |
| 佐藤 | A | 2023-04-01 17:29:31 | 2100 |
+------------+--------+---------------------+--------+
UNIONの応用
続いて、UNIONを用いる際に一緒に活用できるWHERE句やORDER BY句の使用方法について詳しく説明していきます。
WHERE句と組み合わせる
WHERE句をUNIONと組み合わせることで、異なる条件に基づいてデータをフィルタリングし、特定の基準を満たすデータのみを抽出することができます。
WHERE句は、それぞれのSELECT文のなかで個別に適用されます。そのため、異なるテーブルまたは同一テーブルに対して異なる条件を設定できます。
SELECT 列名 FROM テーブル名1 WHERE 条件1
UNION
SELECT 列名 FROM テーブル名2 WHERE 条件2;
ORDER BY句と組み合わせる
ORDER BY句は、UNIONを使用して結合された結果の並び順を制御します。
ORDER BYは全体の結果セットに対して適応されます。そのため、各SELECT文のなかにORDER BYを記述するとエラーが発生します。
SELECT 列名 FROM テーブル名1
UNION
SELECT 列名 FROM テーブル名2
ORDER BY 列名 [ASC|DESC];
【補足】UNIONとJOINの違いは?
UNIONと似た機能を持つものとして、JOIN句があります。こちらも複数のテーブルを結合するという機能を持っていますが、この二つには大きな違いがあります。
UNION: SELECTの結果を統合する
UNIONは、二つのテーブル間で実行されたSELECTの結果を一つに統合するクエリです。SELECTクエリの実行結果を統合するので、共通するカラムのデータを一つにまとめるような用途に向いています。
イメージとしては、最初に説明した際の図のように縦にテーブルを繋げるような形になります。
JOIN: テーブル間のデータを関連付けて結合する
JOINは両方のテーブルのデータを関連付けてテーブルを結合するクエリです。そのため、共通するデータがなければNULLが含まれることがあったり、実行結果のテーブルに含まれなかったりといったことがあります。
JOINは複数のテーブル間で関連するデータを結合して1つのテーブルに結果セットをまとめる用途に向いています。
イメージとしては、テーブルを横に繋げるような形になります。

JOINについてさらに詳しく知りたい方のために詳しく解説している記事があります!
こちらもぜひ読んでみてください。
UNIONとJOINは併用できる
似ているようで異なるUNIONとJOINですが、機能が異なるためそれぞれを同時に利用することも可能です。
二つのクエリを組み合わせることで、より高度な抽出結果を取得することができます。
【補足】UNION句を含む処理をより高速にするには?
SQLを利用していると、処理の実行速度・実行時間を気にする場面がたびたび出てきます。UNIONでテーブルを統合する場合も書き方ひとつでパフォーマンスは大きく変わってきますので、より高速に処理するにはどうしたらよいのかを見ていきましょう。
基本的にはUNIONよりUNION ALLのほうが速い
UNIONは統合する際に重複のチェックを行いますが、UNION ALLはチェックを行わずに重複も含めて統合します。
重複のチェックを行う処理の有無で実行速度は当然変わってきます。
どちらでも実行結果が同じになることが分かっている場合などは、UNIONの代わりにUNION ALLを使うことでパフォーマンスの低下を防げます。
1つのテーブル内で行う処理にはなるべく使わない
同一のテーブル内で複数のSELECT文を実行した結果を統合するような場合にUNION / UNION ALLを使用することは多いと思いますが、UNIONを使用するとその回数分テーブルをスキャンすることになります。
同じテーブルを何度も読み込むとそのぶんだけクエリの実行にかかる時間が増大していき、パフォーマンスの低下につながります。
同一のテーブル内でUNIONを使おうとしている場合は、代わりにSELECT文の中で条件分岐を追加するなどクエリを工夫して、同一のテーブルをスキャンする回数を減らすようにしましょう。
まとめ
本記事では、SQLのUNIONおよびUNION ALLについて解説しました。これらの知識を用いて、データベース操作をより効率的に行いましょう。
SQL関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを抽出する「SELECT」文
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- テーブル構造を変更する「ALTER TABLE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 内部結合「INNER JOIN」句
- データの曖昧検索「LIKE」句
- データの取得件数を制限する「LIMIT」句
- 条件分岐処理「CASE」式
- 「NULL」の扱い方
- 「主キー」とは?
- 「外部キー」とは?
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。