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

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

Rii

Rii

ボールド歴8年

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_dateorder_codeCustomer_codeproductspriceamount
2000-01-06TK−000211112222ボールペン120100
2000-01-06TK−000211112222電卓8003
2000-01-06TK−000211112222コピー用紙3506

osaka_br

order_dateorder_codeCustomer_codeproductspriceamount
2000-01-08OS-000111113344ファイル12060
2000-01-08OS-000111113344デスクライト42001
2000-01-08OS-000111113344コピー用紙35020

実際に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_dateorder_codeCustomer_codeproductspriceamount
2000-01-06TK−000211112222ボールペン120100
2000-01-06TK−000211112222電卓8003
2000-01-06TK−000211112222コピー用紙3506

osaka_br

オーダー日オーダーコード顧客コード商品単価数量
2000-01-08OS-000111113344ファイル12060
2000-01-08OS-000111113344デスクライト42001
2000-01-08OS-000111113344コピー用紙35020

実行結果は以下の通りです。

+————+————+—————+——————–+——-+——–+

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

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

IT業界を目指す求職者へ

プレミアムSESで市場価値の高いエンジニアへ

株式会社ボールドが約束する5つのプレミアムとは?

IT業界を目指す求職者へ

プレミアムSESで市場価値の高いエンジニアへ

株式会社ボールドが約束する5つのプレミアムとは?