【SQL】UNIONの使い方と活用事例をわかりやすく解説
SQLの[UNION]について初心者向けに解説します。どのような時にどのように使うかについて事例を交えて説明します。
1.UNIONとは何か
UNIONは複数のSELECT結果を縦に統合(結合)します。重複データが存在する場合、重複が排除されます。(重複を排除しない場合には [UNION ALL] を使用します)
UNION 重複を排除する
UNION ALL 重複データもそのまま取得
2.UNIONの構文
—UNIONの基本構文—
SELECT 列1, 列2 FROM テーブル名1
UNION
SELECT 列1, 列2 FROM テーブル名2
テーブルAとテーブルBが同じ構成(列名・データ型)である場合2つのSELECT文をUNION で繋げるだけで2つのSELECT結果を統合することができます。前述しましたが、UNION を使用した場合重複行は排除されます。UNION ALL (重複を排除しない)でも記述方法は同じです。
3.UNIONの活用方法とサンプルコード
それではUNIONの具体的な使い方をみていきましょう。
◆例1
支店ごとに売上データを格納したテーブルがあります。「2つのテーブルのデータのSELECT 結果を繋げて一つのテーブルにする」というケースでUNIONが利用できます。テーブルの構成が同じですから、SELECT文をUNIONでつなぐだけで取得することができます。
tokyo_br
order_date | order_code | Customer_code | products | price | amount |
2000-01-06 | TK−0002 | 11112222 | ボールペン | 120 | 100 |
2000-01-06 | TK−0002 | 11112222 | 電卓 | 800 | 3 |
2000-01-06 | TK−0002 | 11112222 | コピー用紙 | 350 | 6 |
osaka_br
order_date | order_code | Customer_code | products | price | amount |
2000-01-08 | OS-0001 | 11113344 | ファイル | 120 | 60 |
2000-01-08 | OS-0001 | 11113344 | デスクライト | 4200 | 1 |
2000-01-08 | OS-0001 | 11113344 | コピー用紙 | 350 | 20 |
実際にSQLを記述してみます。
SELECT * FROM tokyo_br UNION SELECT * FROM osaka_br
簡単なSQLで取得することができました。実行結果は次の通りです。
+————+————+—————+——————–+——-+——–+
| order_date | order_code | customer_code | products | price | amount |
+————+————+—————+——————–+——-+——–+
| 2000-01-06 | TK-0002 | 11112222 | ボールペン | 120 | 100 |
| 2000-01-06 | TK-0002 | 11112222 | 電卓 | 800 | 3 |
| 2000-01-06 | TK-0002 | 11112222 | コピー用紙 | 350 | 6 |
| 2000-01-08 | OS-0001 | 11113344 | ファイル | 120 | 60 |
| 2000-01-08 | OS-0001 | 11113344 | デスクライト | 4200 | 1 |
| 2000-01-08 | OS-0001 | 11113344 | コピー用紙 | 350 | 20 |
+————+————+—————+——————–+——-+——–+
6 rows in set (0.00 sec)
しかし上記の例では2つのテーブルは同じ構成です。テーブルの構成が異なる場合、UNIONは使えないのか・・次の例で解説します。
◆例2
先程の例で利用したテーブルに少し変更を加えてみました。このような場合でもUNIONは利用できます。
<変更点>osaka_br : カラム名をすべて日本語に変更
tokyo_br
order_date | order_code | Customer_code | products | price | amount |
2000-01-06 | TK−0002 | 11112222 | ボールペン | 120 | 100 |
2000-01-06 | TK−0002 | 11112222 | 電卓 | 800 | 3 |
2000-01-06 | TK−0002 | 11112222 | コピー用紙 | 350 | 6 |
osaka_br
オーダー日 | オーダーコード | 顧客コード | 商品 | 単価 | 数量 |
2000-01-08 | OS-0001 | 11113344 | ファイル | 120 | 60 |
2000-01-08 | OS-0001 | 11113344 | デスクライト | 4200 | 1 |
2000-01-08 | OS-0001 | 11113344 | コピー用紙 | 350 | 20 |
実行結果は以下の通りです。
+————+————+—————+——————–+——-+——–+
| order_date | order_code | customer_code | products | price | amount |
+————+————+—————+——————–+——-+——–+
| 2000-01-06 | TK-0002 | 11112222 | ボールペン | 120 | 100 |
| 2000-01-06 | TK-0002 | 11112222 | 電卓 | 800 | 3 |
| 2000-01-06 | TK-0002 | 11112222 | コピー用紙 | 350 | 6 |
| 2000-01-08 | OS-0001 | 11113344 | ファイル | 120 | 60 |
| 2000-01-08 | OS-0001 | 11113344 | デスクライト | 4200 | 1 |
| 2000-01-08 | OS-0001 | 11113344 | コピー用紙 | 350 | 20 |
+————+————+—————+——————–+——-+——–+
6 rows in set (0.00 sec)
カラム名が異なる2つの表を一つにまとめることができました。カラム名は1つ目の結果セットの名称となります。
◆例3
次は少し工夫してみます。どのテーブルから取得したデータか判別できるように[branch]カラムを追加します。また、WHERE文を追加して[products]が「コピー用紙」のデータのみを抽出してみましょう。
SELECT order_date, order_code, customer_code, products, price, amount, '東京' as branch FROM tokyo_br WHERE products = 'コピー用紙' UNION SELECT オーダー日, オーダーコード, 顧客コード, 商品名, 単価, 数量, '大阪' as branch FROM osaka_br WHERE 商品名 = 'コピー用紙';
実行結果は以下のとおりです。[branch]のカラムが追加され、どの支店のデータかが分かるようになりました。また、[products](商品名)が「コピー用紙」の列だけを抽出することができました。
+————+————+—————+—————–+——-+——–+——–+
| order_date | order_code | customer_code | products | price | amount | branch |
+————+————+—————+—————–+——-+——–+——–+
| 2000-01-06 | TK-0002 | 11112222 | コピー用紙 | 350 | 6 | 東京 |
| 2000-01-08 | OS-0001 | 11113344 | コピー用紙 | 350 | 20 | 大阪 |
+————+————+—————+—————–+——-+——–+——–+
2 rows in set (0.00 sec)
4.UNIONとUNION ALL
ここまでUNIONの基本や使用例について述べてきました。UNION ALL との使い分けについては重複を排除するか否かであることもお伝えしました。
もう一つの違いとして、SQLを実行するとUNIONでは重複があるかないかを判断するする処理が走ります。一方UNION ALL では判断の処理が走らないため、UNION ALL の方が処理速度は速くなります。大量データの処理をする場合等は注意してください。
5.UNIONを使用する際のポイント
・カラム数を揃える
それぞれのSELECT文はカラムの数を同一にします。
片方のテーブルだけにあるデータも一緒に取得したい場合は、カラムが少ない方のSELECT文に
‘’as [カラム名]
のようにブランク列追加してカラム数を揃えます。
・データ型を揃える
基本的にはデータ型が異なるとエラーになります。データ型が異なっていても暗黙変換してくれる場合もあるようですが、SELECT文の中でCASTするなど、データ型を揃えるようにした方が良いでしょう。ここまでの例では2つのテーブルを統合していますが、さらにSELECT文を追加することもできます。またORDER BY や GROUP BY などを組み合わせて使用することもできます。
6.まとめ
UNIONの使い方について初心者向けに解説しました。使いどころはあると思いますので、実際に試してみていただけましたらうれしいです。最後までお読みいただきありがとうございました。
コメント