ここでは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)