③SQL UNION句/演算子

スポンサーリンク

本当にわからないとこがあった場合一人では解決できません。
『teratail』とはエンジニア特化型のQ&Aサイトです。 すべてのエンジニアさんが抱えている悩みを共有して 解決するための質問サイトです
無料なのでまずは登録して使ってみてください。メールアドレスだけで登録可能です ----------------------------------------------------------------------------------------

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文の行を返します。

前のページ②結合

次のページ④NULL値

 

スポンサーリンク

プログラミングは独学からは挫折の可能性が高いです。まずは無料体験ができる
コードキャンプが本当におすすめ。無料体験でわからないところを聞きましょう。
転職補助つき。カリキュラム終了後に転職紹介をしてくれます。