【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)