【MySQL】UNIONでDISTINCT指定の有無による違い
ここではMySQLで、UNIONでDISTINCT指定の有無による違いを紹介しています。
UNIONでDISTINCT指定の有無による違い
基本的なUNIONの使い方は下記の通りです。
UNION句のみでも構いませんが、ALLまたはDISTINCTキーワードを使用することが出来ます。
SELECT 列名・・ FROM 表名
UNION [ALL | DISTINCT]
SELECT 列名・・ FROM 表名
・UNIONのみ(デフォルト)
重複行は削除されます。
・ALLを指定
重複行も結果として返されます。
・DISTINCTを指定
重複行は削除されます。
→つまりUNIONのみのデフォルトと同じ結果になります。
UNIONでDISTINCT指定の有無による違いの検証
UNION(デフォルト)の結果
UNIONのみのデフォルトでは、重複行は削除されます。
mysql> select * from tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from tab1
-> union
-> select * from tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
+--------+----------+-------+------+
3 rows in set (0.01 sec)
UNION ALLの結果
ALLを指定することで重複行も表示されます。
mysql> select * from tab1
-> union all
-> select * from tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
UNION DISTINCTの結果
DISTINCTを指定することで、デフォルトと同じく、重複行を削除することが出来ます。
mysql> select * from tab1
-> union distinct
-> select * from tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | HR | 28 |
| 00002 | Tanaka | SALES | 25 |
| 00003 | Kizaki | SALES | 35 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)