SQL UNION句/演算子は、重複行を返さずに2つ以上のSELECT文の結果を結合するために使用されます。
このUNION句を使用するには、各SELECT文に
- 同じ列数が選択されています
- 同じ数の列式
- 同じデータ型と
- それらを同じ順序で持っている
同じ長さにする必要はありません。
構文
UNION句の基本的な構文は次のとおりです。
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
ここで、与えられた条件は、あなたの要求に基づいて与えられた任意の式である可能性があります。
例
次の2つの表を考えてみましょう。
表1 – 顧客表は以下の通りです。
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | yokota | NULL | NULL |
| 2 | kenta | 1560 | 2009-11-20 00:00:00 |
| 3 | otsuka | 3000 | 2009-10-08 00:00:00 |
| 3 | kenta | 1500 | 2009-10-08 00:00:00 |
| 4 | nakauchi | 2060 | 2008-05-20 00:00:00 |
| 5 | kengo | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | meiji | NULL | NULL |
+------+----------+--------+---------------------+
表2 – 注文表は以下の通りです。
+-----+---------------------+-------------+--------+ |OID | DATE | CUSTOMER_ID | AMOUNT | +-----+---------------------+-------------+--------+ | 102 | 2009-10-08 00:00:00 | 3 | 3000 | | 100 | 2009-10-08 00:00:00 | 3 | 1500 | | 101 | 2009-11-20 00:00:00 | 2 | 1560 | | 103 | 2008-05-20 00:00:00 | 4 | 2060 | +-----+---------------------+-------------+--------+
さて、次のようにSELECTステートメントでこれら2つのテーブルを結合しましょう。
SQL> SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
これは、次のようになります
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | yokota | NULL | NULL |
| 2 | kenta | 1560 | 2009-11-20 00:00:00 |
| 3 | otsuka | 3000 | 2009-10-08 00:00:00 |
| 3 | kenta | 1500 | 2009-10-08 00:00:00 |
| 4 | nakauchi | 2060 | 2008-05-20 00:00:00 |
| 5 | kengo | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | meiji | NULL | NULL |
+------+----------+--------+---------------------+
UNION ALL句
UNION ALL演算子は、重複行を含む2つのSELECT文の結果を結合するために使用されます。
UNION句に適用されるのと同じ規則がUNION ALL演算子に適用されます。
構文
UNION ALLの基本的な構文は次のとおりです。
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION ALL SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
ここで、与えられた条件は、あなたの要求に基づいて与えられた任意の式である可能性があります。
例
次の2つの表を考えてみましょう。
表1 – 顧客表は以下の通りです。
+------+----------+--------+---------------------+
| ID | NAME | AMOUNT | DATE |
+------+----------+--------+---------------------+
| 1 | yokota | NULL | NULL |
| 2 | kenta | 1560 | 2009-11-20 00:00:00 |
| 3 | otsuka | 3000 | 2009-10-08 00:00:00 |
| 3 | kenta | 1500 | 2009-10-08 00:00:00 |
| 4 | nakauchi | 2060 | 2008-05-20 00:00:00 |
| 5 | kengo | NULL | NULL |
| 6 | Komal | NULL | NULL |
| 7 | meiji | NULL | NULL |
+------+----------+--------+---------------------+
表2 – ORDERS表は以下の通りです。
+-----+---------------------+-------------+--------+ |OID | DATE | CUSTOMER_ID | AMOUNT | +-----+---------------------+-------------+--------+ | 102 | 2009-10-08 00:00:00 | 3 | 3000 | | 100 | 2009-10-08 00:00:00 | 3 | 1500 | | 101 | 2009-11-20 00:00:00 | 2 | 1560 | | 103 | 2008-05-20 00:00:00 | 4 | 2060 | +-----+---------------------+-------------+--------+
さて、次のようにSELECTステートメントでこれら2つのテーブルを結合しましょう。
SQL> SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
これは、次の結果になります。
+------+----------+--------+---------------------+ | ID | NAME | AMOUNT | DATE | +------+----------+--------+---------------------+ | 1 | yokota | NULL | NULL | | 2 | kenta | 1560 | 2009-11-20 00:00:00 | | 3 | otsuka | 3000 | 2009-10-08 00:00:00 | | 3 | otsuka | 1500 | 2009-10-08 00:00:00 | | 4 | nakauchi | 2060 | 2008-05-20 00:00:00 | | 5 | kengo | NULL | NULL | | 6 | Komal | NULL | NULL | | 7 | meiji | NULL | NULL | | 3 | kaushik | 3000 | 2009-10-08 00:00:00 | | 3 | otsuka | 1500 | 2009-10-08 00:00:00 | | 2 | kenta | 1560 | 2009-11-20 00:00:00 | | 4 | nakauchi | 2060 | 2008-05-20 00:00:00 | +------+----------+--------+---------------------+
UNION節のような他の2つの節(演算子)があります。
- SQL INTERSECT句 – これは2つのSELECT文を結合するために使用されますが、2番目のSELECT文の1つの行と同一の最初のSELECT文からの行のみを返します。
- SQL EXCEPT句 – 2つのSELECT文を結合し、2番目のSELECT文で返されなかった最初のSELECT文の行を返します。