【SQL】現場で使える重複データの調べ方

DataBase,MySQL

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

今回は現場レベルで使えるSQLで重複データの検索方法です。
現場で開発中にエラーやおかしな点を調査することって多々ありますよね?

そういった時にこのSQLを知っていれば、データベースの構造がわかっていなくても、エラー文からのヒントのカラム名だけで重複問題のポイントに近づくことができます。

それではやっていきましょう。

SQLの作成

以下のSQL文をコピーしてデータベースツールでペーストしてください。

SELECT *
FROM users
WHERE tel_number IN (
  SELECT tel_number
  FROM users
  GROUP BY tel_number
  HAVING COUNT(*) > 1
)
ORDER BY tel_number;
icon

SQLの説明もしますね。

-- すべてのカラムを取得
SELECT *
FROM users
-- サブクエリで取得したtel_numberを持つレコードを選択
WHERE tel_number IN (
  -- サブクエリ: tel_numberごとにグループ化し、出現回数が2回以上のものを取得
  SELECT tel_number
  FROM users
  GROUP BY tel_number
  HAVING COUNT(*) > 1
)
-- tel_numberでソートして出力
ORDER BY tel_number;

すべてのカラムを取得

usersテーブルからすべてのカラムを取得します。

「*」はすべてのカラムを意味します。

SELECT *
FROM users

サブクエリで取得したtel_numberを持つレコードを選択

WHERE句を使って、特定の条件に一致するレコードを選択しています。
IN句の中にあるサブクエリが返すtel_numberのいずれかと一致するレコードを取得します。

WHERE tel_number IN (
  ...
)

サブクエリ: tel_numberごとにグループ化し、出現回数が2回以上のものを取得

サブクエリでは、usersテーブルからtel_numberごとにグループ化しています。
GROUP BY句でtel_numberごとにまとめ、HAVING COUNT(*) > 1によって、2回以上出現するtel_numberだけを抽出します。

これにより、重複する電話番号を持つユーザーを特定します。

SELECT tel_number
FROM users
GROUP BY tel_number
HAVING COUNT(*) > 1

ソートして出力

結果のレコードをtel_numberで昇順に並べ替えます。

これにより、同じ電話番号を持つレコードがまとめて表示されます。

ORDER BY tel_number

全体の処理の流れ

  1. サブクエリで、tel_numberの値が2回以上あるtel_numberを取得(重複しているtel_numberを取得)。
  2. メインクエリで、取得した電話番号を持つユーザーのレコードをすべて選択。
  3. tel_numberでソートして結果を出力。

DataBase,MySQL

Posted by kami