SQLのunion allの構文についてまとめています。
SQLのunion allは、検索結果を統合する
SQLのunion allは、selectの検索結果を統合します。
以下の例は、emp_no=20005のレコードを抽出するselect文と、emp_noが20007~20010のレコードを抽出するselect文の検索結果をunion allで統合する例です。
mysql> select * from employees where emp_no = 20005 union select * from employees where emp_no between 20007 and 20010; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 20005 | 1956-02-20 | Licheng | Przulj | M | 1992-07-17 | | 20007 | 1964-06-21 | Deborah | Setia | F | 1991-06-11 | | 20008 | 1954-11-21 | Hilary | Speel | M | 1989-04-12 | | 20009 | 1961-10-30 | Yakkov | Krybus | F | 1987-09-10 | | 20010 | 1961-01-26 | Saniya | Veccia | M | 1997-06-16 | +--------+------------+------------+-----------+--------+------------+ 5 rows in set (0.00 sec)
【関連記事】
▶MySQL UNIONで、select文ごとにorder byでソート指定するサンプルSQL
サブクエリとunion allを組み合わせることで、複数のselect文ごとに異なる条件でorder byによるソートをおこなうことも可能です。
以下は、1つ目のselect文ではbirth_date(誕生日)でソートを行い、2つ目のSQLではfirst_name(姓名の名)でソートをおこなった結果をunion allで統合しています。
mysql> (select * from employees where emp_no <= 10010 order by birth_date limit 10) UNION ALL ( select * from employees where emp_no between 10011 and 10020 order by first_name limit 10);
主要DBMSのunion allの構文
Oracleのunion allの構文
SELECT location_id FROM locations UNION ALL SELECT location_id FROM departments ORDER BY location_id;
参考)UNION [ALL]、INTERSECTおよびMINUS演算子
unionは集合演算子と呼ばれ、複数の問い合わせを組み合わせる事ができます。unionとだけ指定すると重複が除外されますが、union allと指定すると重複も含まれます。
Oracleでは、データ型がBLOB、CLOB、BFILE、VARRAYまたはネストした表である列、LONG列に対しては無効になります。select構文のリストに敷が含まれている場合は、式に列の別名を指定する必要があります。
SQL Serverのunion allの構文
{ <query_specification> | ( <query_expression> ) } { UNION [ ALL ] { <query_specification> | ( <query_expression> ) } [ ...n ] }
参考)UNION (Transact-SQL) – SQL Server | Microsoft Docs
UNION ALLと指定すると、重複を含めたデータを取得します。例えば以下のSQLでは、DimCustomerテーブルからCustomerKey, FirstName, LastNameを抽出した結果を3セット分抽出します。
SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION ALL SELECT CustomerKey, FirstName, LastName FROM DimCustomer UNION ALL SELECT CustomerKey, FirstName, LastName FROM DimCustomer;
MySQLのunion allの構文
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9.4 UNION 構文
以下は、2つのselect文の結果をunion allで連結した例です。
mysql> SELECT REPEAT('a',1) UNION ALL SELECT REPEAT('b',10); +---------------+ | REPEAT('a',1) | +---------------+ | a | | bbbbbbbbbb | +---------------+
MySQLのunionでは、デフォルトではdistinctを指定したことになり、重複データがあった場合は除去されます。union allを明示的に指定すると、重複データも含めて検索結果が連結されます。
mysql> select 1 as test union select 1 union select 1 union select 1; +------+ | test | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select 1 as test union all select 1 union all select 1 union all select 1; +------+ | test | +------+ | 1 | | 1 | | 1 | | 1 | +------+ 4 rows in set (0.00 sec)
PostgreSQLのunion allの構文
query1 UNION [ALL] query2
参考)PostgreSQLの公式ドキュメント:問い合わせの結合
PostgreSQLでも他のDBMSと同様に、union all指定をすると重複を含めて複数のselect文の検索結果を連結します。allを指定せずunionのみだと、重複行は除去されます。
SQLのunion allのまとめ
- union allは複数のselect文の検索結果を統合する
- unionのallを指定すると、重複データを含めて検索結果を統合する
- サブクエリを組み合わせることで、select文ごとに異なるソート条件を指定することが可能