【SQL】UNIONの使い方と活用事例をわかりやすく解説

SQL

SQLの[UNION]について初心者向けに解説します。どのような時にどのように使うかについて事例を交えて説明します。

1.UNIONとは何か

UNIONは複数のSELECT結果を縦に統合(結合)します。重複データが存在する場合、重複が排除されます。(重複を排除しない場合には [UNION ALL] を使用します)

UNIONとはなにか

UNION    重複を排除する

UNION ALL 重複データもそのまま取得

UNIONのイメージ

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の使い方について初心者向けに解説しました。使いどころはあると思いますので、実際に試してみていただけましたらうれしいです。最後までお読みいただきありがとうございました。

PAGE TOP
タイトルとURLをコピーしました