【MySQL】レコードの存在チェック、重複レコードの排除と表示


ここではMySQLで、レコードの存在チェック、重複レコードを排除する方法と表示する方法を紹介しています。重複レコードを表示することで重複チェックとしても応用可能です。
・EXISTS:レコードの存在チェック
・DISTINCT:重複レコードの排除
・GROUPBY&HAVING:重複レコードの表示

EXISTS:レコードの存在チェック

テーブルのレコードの存在を確認する方法はいくつかありますが、EXISTSを使う方法が簡単でおすすめです。

EXISTSを使ってレコードの存在チェックするSQLは次のようになります。

SELECT EXISTS(SELECT 1 FROM テーブル名 WHERE 条件);

TAB1テーブルに次の通りレコードが登録されているときに、EXISTSを使った存在チェックのSQLを実行してみます。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.01 sec)

SELECTした結果が1件以上ある場合は1が、0件の場合は0が返ってきます。

mysql> SELECT EXISTS(SELECT 1 FROM tab1 WHERE dept = 'DEV');
+-----------------------------------------------+
| EXISTS(SELECT 1 FROM tab1 WHERE dept = 'DEV') |
+-----------------------------------------------+
|                                             1 |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT EXISTS(SELECT 1 FROM tab1 WHERE dept = 'XXXX');
+------------------------------------------------+
| EXISTS(SELECT 1 FROM tab1 WHERE dept = 'XXXX') |
+------------------------------------------------+
|                                              0 |
+------------------------------------------------+
1 row in set (0.00 sec)

DISTINCT:重複レコードの排除

レコードの重複は、DITSINCTを使うことで排除することが出来ます。

DISTINCTの基本的な使い方は次の通りです。SELECT句で指定した列名の値で重複を排除して結果を返します。

SELECT DISTINCT 列名 FROM 表名;

実際にDISTINCTを使うと次のように重複したレコードを排除して結果を返します。

mysql> SELECT emp_name FROM tab1;
+----------+
| emp_name |
+----------+
| Suzuki   |
| Tanaka   |
| Kizaki   |
| Tanaka   |
| Kizaki   |
| Nakata   |
+----------+
6 rows in set (0.00 sec)

mysql> SELECT DISTINCT emp_name FROM tab1;
+----------+
| emp_name |
+----------+
| Suzuki   |
| Tanaka   |
| Kizaki   |
| Nakata   |
+----------+
4 rows in set (0.01 sec)

GROUPBY&HAVING:重複レコードの表示

重複レコードを取得して表示するには、GROUPBY句とHAVING句を組み合わせてSQLを実行します。

例えば、次のようなテーブルのレコードで、emp_nameが重複しているレコードを表示します。

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | HR    |   28 |
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
| 00004  | Tanaka   | DEV   |   45 |
| 00005  | Kizaki   | DEV   |   55 |
| 00006  | Nakata   | DEV   |   35 |
+--------+----------+-------+------+
6 rows in set (0.02 sec)

GROUP BY句にemp_nameを指定し、HAVING句に「COUNT(emp_name) > 1」として、emp_name列のカウントが1よりも大きい列だけを抽出します。

つまり、emp_name列で重複しているレコードのみを抽出しています。

最後に、見やすくするためにORDERBY句でソート順を指定しています。

SELECT
 *
FROM
 tab1
GROUP BY
 emp_name
HAVING
 COUNT(emp_name) > 1
ORDER BY
 emp_id

実行した結果は次のようになります。
emp_name列が重複しているレコードを取得して表示しています。

mysql> SELECT * FROM tab1 GROUP BY emp_name HAVING COUNT(emp_name) > 1 ORDER BY emp_id;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00002  | Tanaka   | SALES |   25 |
| 00003  | Kizaki   | SALES |   35 |
+--------+----------+-------+------+
2 rows in set (0.00 sec)