特定のカラムのデータが重複もしくは特定件数以上のレコードを抽出する方法です。
例えば、
・同じ電話番号で登録されている顧客を抽出したい
・同じ外部キーや特定カラムの組み合わせの重複データを抽出したい
・○件以上の売上件数がある商品を抽出したい
などのようなレコードを抽出する際に使います
customerというテーブルに下記のようなデータが格納
ID(id) | 名前(full_name) | 電話番号(tel) | 都道府県(prefecture) |
1 | 佐藤 太郎 | 090-0000-1111 | 東京都 |
2 | 山田 次郎 | 090-0000-2222 | 福岡県 |
3 | 鈴木 三郎 | 090-0000-3333 | 大阪府 |
4 | 斉藤 四郎 | 090-0000-1111 | 北海道 |
5 | 渡辺 五郎 | 090-0000-5555 | 長崎県 |
このデータの中から重複した電話番号を持つデータを抽出する場合のクエリ
GROUP BYで抽出カラムのグループ化を行いHAVINGで重複件数条件を絞り込み
SQL
SELECT tel FROM customer GROUP BY tel HAVING COUNT(tel) > 1
クエリ実行結果
GROUP BYで抽出カラムのグループ化を行いHAVINGで重複件数条件を絞り込み
列指定にCOUNT(対象列)を追加することで重複している件数を表示
SQL
SELECT tel, COUNT(tel) AS duplicate_count FROM customer GROUP BY tel HAVING COUNT(tel) > 1
クエリ実行結果
GROUP BYで抽出カラムのグループ化を行いHAVINGで重複件数条件を絞り込み
①のクエリで抽出された列データをWHERE条件として指定
SQL
SELECT * FROM customer WHERE tel in( SELECT tel FROM customer GROUP BY tel HAVING COUNT(tel) > 1 ) ORDER BY ID ASC
クエリ実行結果
※INを使っているため①で指定したデータ件数が大量の場合はクエリの実行スピードが遅くなります。
INを使わずに抽出する方法としてEXISTS演算子というものがあります。
EXISTS演算子での抽出方法については下記記事をご覧ください。
レコードが存在するかを条件として抽出するEXISTSの使い方