SQL入門その13 - <SELECT 文> UNION/UNION ALL <SELECT 文>による検索結果の結合

2008/07/22 14:54Update
TAGS: SQL | UNION | UNION ALL

異なる関連性のない2つテーブルからそれぞれのデータを取出して、検索結果をまとめる必要がある場合、UNIONやUNION ALLという集合演算子を使います。UNIONもしくはUNION ALLは、複数のクエリからのデータを結合して、一つのデータセットとして返すことができます。


UNION/UNION ALLの基本構文は、次の通りです。

UNIONの場合:
<SELECT文1>
UNION
<SELECT文2>
[ORDER BY句]

UNION ALLの場合:
<SELECT文1>
UNION ALL
<SELECT文2>
[ORDER BY句]

※二つの<SELECT文>の対象テーブルは、同じテーブルであっても、異なるテーブルであってもかまいません。
※二つの<SELECT文>による取出されるフィールドの数は一致でなければ、UNION(UNION ALL)できません。
※二つの<SELECT文>による取出されるデータの型に、互換性がある場合のみ、UNIONできます。
※それぞれのSELECT文でORDER BY句を使用することができません。
※UNION(UNION ALL)の結果をソートするORDER BY句では、別名を指定した場合別名か、または列番号を指定します。


UNION と UNION ALLの区別



UNION と UNION ALL両者とも「問い合わせ結果」を結合するための集合演算子です。
UNIONは、結合するデータに重複がある場合、その重複データを取り除いた形で返します。
UNION ALLは、重複があっても、結合するデータをそのまま返します。


そのため、パフォーマンス面では、UNION ALLはUNIONより優れているといわれています。
※重複データを取り除く必要がない場合は、UNION ALLを使用したほうがパフォーマンスは良いのではと思います。

UNIONの使用例


テーブル:PRODUCTS
ID PROD_NAME PROD_TITLE
1   Computer   My Computer
2   CD          My CD

テーブル:GOODS
ID GOODS_NAME   GOODS_TITLE PRICE
1   Computer   My Computer 1500
2   CD         My CD 20
3   BOOK        My BOOK 10


※実際のテストはMySQLを使って行います。Oracle、DB2などについても同じです。

mysql>
SELECT p.ID as ID, p.PROD_NAME as NAME, 'p' as FLAG
FROM PRODUCTS p
UNION
SELECT g.ID as ID, g.GOODS_NAME as NAME, 'g' as FLAG
FROM GOODS g
WHERE g.ID < 3
ORDER BY ID;

+----+----------+-----+
| ID |  NAME    |FLAG |
+----+----------+-----+
|1   |Computer  |  p  |
|1   |Computer  |  g  |
|2   |CD        |  p  |
|2   |CD        |  g  |
+----+----------+-----+
4 rows in set (0.00 sec)

mysql>

UNIONの使い方
mysql>
SELECT p.ID as ID, p.PROD_NAME as NAME
FROM PRODUCTS p
UNION
SELECT g.ID as ID, g.GOODS_NAME as NAME
FROM GOODS g
WHERE g.ID < 3
ORDER BY ID;

+----+----------+
| ID |  NAME    |
+----+----------+
|1   |Computer  |
|2   |CD        |
+----+----------+
2 rows in set (0.00 sec)

mysql>


UNION ALLの使い方
mysql>
SELECT p.ID as ID, p.PROD_NAME as NAME
FROM PRODUCTS p
UNION ALL
SELECT g.ID as ID, g.GOODS_NAME as NAME
FROM GOODS g
WHERE g.ID < 3
ORDER BY ID;

+----+----------+
| ID |  NAME    |
+----+----------+
|1   |Computer  |
|1   |Computer  |
|2   |CD        |
|2   |CD        |
+----+----------+
4 rows in set (0.00 sec)

mysql>

その他参考資料


SQL入門その2 - データの問い合わせSELECT文の基本的な使い方

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments