SQLで2件以上あるデータを抽出する方法とHAVINGの使い方

SQLで重複データを抽出する方法について、実践的なサンプルコードと共に解説します。GROUP BYとHAVINGを使った効率的な抽出方法とは?

SQLで2件以上あるデータの抽出方法

重複データ抽出の基本ポイント
📊
GROUP BY句の活用

データのグループ化により重複を特定

🔍
HAVING句による絞り込み

COUNT関数で重複数をカウント

パフォーマンス最適化

インデックスを活用した効率的な抽出

基本的な重複データの抽出方法

データベースから重複レコードを抽出する最も基本的な方法をご紹介します。以下のサンプルテーブルを使用して説明していきます。


CREATE TABLE customer (
    id INT,
    full_name VARCHAR(50),
    tel VARCHAR(20),
    prefecture VARCHAR(20)
)

 

重複データを抽出する基本的なクエリは次のようになります:


SELECT tel, COUNT(tel) AS duplicate_count 
FROM customer 
GROUP BY tel 
HAVING COUNT(tel) > 1

サブクエリを使用した詳細情報の取得

重複している電話番号を持つ顧客の完全な情報を取得するには、以下のようなサブクエリを使用します:


SELECT * FROM customer 
WHERE tel IN (
    SELECT tel 
    FROM customer 
    GROUP BY tel 
    HAVING COUNT(tel) > 1
) 
ORDER BY tel

パフォーマンスを考慮した実装方法

大規模なデータベースで重複チェックを行う場合、以下のような最適化されたクエリを使用することをお勧めします:


SELECT c1.* 
FROM customer c1
INNER JOIN (
    SELECT tel, COUNT(*) as cnt
    FROM customer 
    GROUP BY tel 
    HAVING COUNT(*) > 1
) c2 ON c1.tel = c2.tel

複数カラムでの重複チェック

電話番号と都道府県の組み合わせで重複をチェックする場合は、以下のようなクエリを使用します:


SELECT tel, prefecture, COUNT(*) as duplicate_count
FROM customer
GROUP BY tel, prefecture
HAVING COUNT(*) > 1

NOT INを使用した重複除外データの抽出

重複していないレコードのみを抽出したい場合は、以下のようなクエリを使用します:


SELECT * FROM customer
WHERE tel NOT IN (
    SELECT tel 
    FROM customer 
    GROUP BY tel 
    HAVING COUNT(*) > 1
)

 

このクエリを実行する際の注意点として、大量データを扱う場合はインデックスの作成が重要です。以下のようにインデックスを作成することで、パフォーマンスが向上します:


CREATE INDEX idx_customer_tel ON customer(tel)

 

また、実務では以下のような点に注意が必要です:

  • データ型の一致確認
  • NULL値の扱い
  • インデックスの適切な使用
  • トランザクション分離レベルの設定

 

重複データの処理は、データクレンジングやマスターデータ管理において重要な作業となります。特に顧客データベースでは、重複登録を防ぐことでデータの整合性を保つことができます。

 

パフォーマンスチューニングのポイントとして:

  1. 適切なインデックス設計
  2. クエリの実行計画の確認
  3. 一時テーブルの活用
  4. バッチ処理の検討

 

これらの要素を考慮することで、効率的な重複データの抽出が可能となります。