重複したデータを抽出するSQLの使い方(HAVING)

特定のカラムのデータが重複もしくは特定件数以上のレコードを抽出する方法です。

例えば、

・同じ電話番号で登録されている顧客を抽出したい
・同じ外部キーや特定カラムの組み合わせの重複データを抽出したい
・○件以上の売上件数がある商品を抽出したい

などのようなレコードを抽出する際に使います

サンプルデータ

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の使い方

Leave a Reply

Your email address will not be published. Required fields are marked *