【SQL】結果の統合はUNIONで!だれでもわかるUNION解説!

みなさんこんにちは!フリーランスプログラマーのsatoです。

今回はUNIONについて見ていきましょう。UNIONは二つ以上のSELECTの結果を、統合して表示してくれる仕組みです。これを使えれば、また一つ高度な結果表示を行えますのでぜひ覚えてしまいましょう。

  • [基本]UNIONとは
  • [基本]UNIONの種類
  • [基本]UNIONの使い方
  • [応用]UNION後に「ORDER BY」を使用する
  • [応用]UNION後に「GROUP BY」を使用する

今回は前半で「UNIONの種類」「UNIONの使い方」といった基礎的な内容を見ていきましょう。そして後半で、よく疑問として上がるUNION後に「ORDER BY」などをかける方法について見てきましょう。

目次

UNIONとは

UNNIONとは、冒頭でも言いましたが二つ以上のSELECTの結果を、統合して表示してくれる仕組みのことを言います。

例えばすごくシンプルに書いてみましょうか。例えば以下の、二つのSELECT文があったとします。

SELECT 1 AS NUM;
SELECT 2 AS NUM;

どちらも、1,2と数字を表示するだけのシンプルなSELECT文です。

「SELECT 1 AS NUM」の実行結果:

+-----+
| NUM |
+-----+
|   1 |
+-----+

「SELECT 2 AS NUM」の実行結果:

+-----+
| NUM |
+-----+
|   2 |
+-----+

この二つに対してUNIONを使うと結果は以下の通りです。

SELECT 1  AS NUM
UNION
SELECT 2 AS NUM;

事項結果:

+-----+
| NUM |
+-----+
|   1 |
|   2 |
+-----+

二つのSELECTの結果を、ひとまとめにして表示できていますね!複数のSELECT結果を一つにして表示する、これがUNIONです。

UNIONの種類

UNIONには二つの種類があります。「UNION」と「UNION ALL」です。違いは非常にシンプルです。

  • 「UNION」 ・・・重複は削除
  • 「UNION ALL」 ・・・重複も含める

実際に見てみましょう。

実行命令:

SELECT 1  AS NUM
UNION
SELECT 1 AS NUM;

実行結果:

+-----+
| NUM |
+-----+
|   1 |
+-----+

実行命令:

SELECT 1  AS NUM
UNION ALL
SELECT 1 AS NUM;

実行結果:

+-----+
| NUM |
+-----+
|   1 |
|   1 |
+-----+

ALLだと確かに重複内容でも、表示していますね!

[補足]「UNION」と「UNION ALL」どっちが速い

例えば重複情報がないことが確定している場合など、「UNION」と「UNION ALL」どっちを結果が変わらない状況の場合、どちらを使うべきなのでしょうか。

答えは「UNION ALL」です。「UNION」では重複チェックが入るため、「UNION ALL」の方が軽いそうです。

どちらでも良い時は「UNION ALL」を覚えておきましょう。

UNIONの使い方

なんとなくの使い方はここまでで理解できたのではないかと思います。ここからは、具体的な使い方を見ていきましょう。

基本的な書き方

基本的な書き方は、先ほど見た通りです。

二つのSELECT文をつなげるように「UNION」を書くだけです。

SELECT 1  AS NUM
UNION ALL
SELECT 2 AS NUM;

表示内容は同じでなければならない

それだけとはいえ、注意点もあります。それは、一緒に表示するために、結果の数や型が同じである必要があることです。違う場合はエラーとなってしまいます。例えば以下のコマンドは、結果の数が違うためエラーとなります。

実行命令:

SELECT 1,2 AS NUM
UNION ALL
SELECT 3 AS NUM;

WHEREなどは各SELECTで書こう

また「WHERE」などのコマンドは、各SELECTなどで使用できます。

SELECT [要素名] FROM [テーブル名] WHERE [条件式]
UNION ALL
SELECT [要素名] FROM [テーブル名] WHERE [条件式];

UNIONは、あくまで結果を統合する命令のため、WHEREなどを使用するタイミングは各SELECTに対してです。

UNION後に「ORDER BY」を使用する

UNIONで出した結果に対して「ORDER BY」でソートをかけたくなることもあるでしょう。その場合は例えば以下のように書きましょう。

実行命令:

SELECT 1 AS NUM
UNION ALL
SELECT 2 AS NUM
ORDER BY NUM DESC;

実行結果:

+-----+
| NUM |
+-----+
|   2 |
|   1 |
+-----+

また「ORDER BY」の詳細を知りたい人はぜひ、以下のリンクをお読みください。

UNION後に「GROUP BY」を使用する

そうそうこれをやることはないかもしれませんが、UNIONした結果を「GROUP BY」したくなった時は以下のように書きましょう。単純には実現できないため、一度SELECTで挟み、ASで名前をつける必要があります。その点に注意しましょう。

実行命令:

SELECT NUM FROM(
  SELECT 1 AS NUM
  UNION ALL
  SELECT 2 AS NUM
) AS tmp
GROUP BY NUM;

また「GROUP BY」の詳細を知りたいのならば以下リンクをぜひ読んでください。

まとめ

今回は二つ以上のSELECTの結果を、統合して表示してくれる仕組みである、UNIONについて一通り勉強しました。多用する命令ではないかもしれませんが、便利なのも事実です。様々なテーブルを使用する環境下での、データの分析などには有用な命令です。

しっかり使い方を覚えておきましょう。

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次