SQL入門その13 - <SELECT 文> UNION/UNION ALL <SELECT 文>による検索結果の結合
2008/07/22 14:54Update
異なる関連性のない2つテーブルからそれぞれのデータを取出して、検索結果をまとめる必要がある場合、UNIONやUNION ALLという集合演算子を使います。UNIONもしくはUNION ALLは、複数のクエリからのデータを結合して、一つのデータセットとして返すことができます。
UNION/UNION ALLの基本構文は、次の通りです。
UNIONの場合:
<SELECT文1>
UNION
<SELECT文2>
[ORDER BY句]
UNION
<SELECT文2>
[ORDER BY句]
UNION ALLの場合:
<SELECT文1>
UNION ALL
<SELECT文2>
[ORDER BY句]
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>
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>
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>
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文の基本的な使い方
Sponsored Link
- Relative Articles
- SQL入門その1 - SQLとは - (2007/10/30 10:42)
- SQL入門その2 - データの問い合わせSELECT文の基本的な使い方 - (2007/10/30 12:42)
- SQL入門その3 - データの更新UPDATE文の基本的な使い方 - (2007/11/05 16:07)
- SQL入門その4 - データの削除DELETE文の基本的な使い方 - (2007/11/05 16:28)
- SQL入門その5 - データの登録INSERT文の基本的な使い方 - (2007/11/05 17:21)
- SQL入門その6 - テーブルの作成CREATE TABLE文の基本的な使い方 - (2007/11/06 14:42)
- SQL入門その7 - インデックスの作成CREATE INDEX文の基本的な使い方 - (2007/11/07 16:58)
- SQL入門その8 - データベース制約CONSTRAINT - (2007/11/08 15:27)
- SQL入門その9 - テーブルの変更ALTER TABLE文の基本的な使い方 - (2007/11/20 23:37)
- SQL入門その10 - SELECT DISTINCT文による重複データを取除く - (2008/02/16 15:58)