SQLでデータをまとめる方法とDISTINCTの使い方完全ガイド

SQLでデータをまとめる際の基本的な手法からGROUP BY、DISTINCTまで、実践的なコード例を交えて解説します。データベース初心者でも実務で使える技術が身につくのではないでしょうか?

SQLでデータをまとめる基本テクニック

SQLデータ集約の3つの主要ポイント
📊
重複行の除外

DISTINCTを使用して重複データを効率的に除外

🔄
グループ化

GROUP BYによる効率的なデータ集約

🔍
結合操作

JOINとUNIONを使用したデータの統合

SQLで重複データをまとめるDISTINCTの基本

DISTINCTは重複したレコードを1つにまとめる強力なSQLコマンドです。以下のような基本構文で使用します:


SELECT DISTINCT カラム名 FROM テーブル名

 

具体例として、社員テーブルから部署名の重複を除いて取得する場合:


SELECT DISTINCT department_name FROM employees

 

複数のカラムに対してDISTINCTを使用する場合:


SELECT DISTINCT department_name, job_title FROM employees

SQLでデータをまとめるGROUP BY集計の実践

GROUP BYを使用すると、特定のカラムでデータをグループ化し、集計関数と組み合わせて分析できます。

 

基本的な集計関数の例:

  • COUNT(): レコード数をカウント
  • SUM(): 数値の合計を計算
  • AVG(): 平均値を計算
  • MAX(): 最大値を取得
  • MIN(): 最小値を取得

 

実践的なコード例:


SELECT 
    department_name,
    COUNT(*) as 社員数,
    AVG(salary) as 平均給与,
    MAX(salary) as 最高給与
FROM employees
GROUP BY department_name

SQLのJOINとUNIONでデータをまとめる手法

複数のテーブルのデータを結合する場合、JOINとUNIONを使い分けることが重要です。

 

JOINの種類と使用例:


-- INNER JOIN(共通データのみ取得)
SELECT e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
-- LEFT JOIN(左テーブルのすべてのデータを取得)
SELECT e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id

 

UNIONの使用例:


-- 重複を除外してデータを結合
SELECT employee_name FROM employees_2023
UNION
SELECT employee_name FROM employees_2024
-- 重複を含めてデータを結合
SELECT employee_name FROM employees_2023
UNION ALL
SELECT employee_name FROM employees_2024

SQLでデータをまとめる際のパフォーマンス最適化

大量のデータを扱う際のパフォーマンス最適化のポイント:

  1. インデックスの活用
  • GROUP BY句で使用するカラムにインデックスを作成
  • 結合条件のカラムにインデックスを設定
  1. 集計の効率化
  • 必要なカラムのみを選択
  • WHERE句での絞り込みを先に実行
  1. メモリ使用量の最適化
  • UNION ALLの使用(重複チェック不要の場合)
  • 一時テーブルの活用

SQLでデータをまとめる際の実務的なTips

  1. データの前処理
    
    -- NULL値の処理
    SELECT 
        COALESCE(department_name, '未所属') as 部署名,
        COUNT(*) as 社員数
    FROM employees
    GROUP BY department_name
    
  2. 条件付き集計
    
    -- HAVINGを使用した集計後のフィルタリング
    SELECT 
        department_name,
        COUNT(*) as 社員数
    FROM employees
    GROUP BY department_name
    HAVING COUNT(*) > 5
    
  3. 集計結果の整形
    
    -- 文字列連結による集計
    SELECT 
        department_name,
        STRING_AGG(employee_name, ', ') as 所属社員
    FROM employees
    GROUP BY department_name
    

 

実務では、これらの技術を組み合わせて使用することで、より効果的なデータ分析が可能になります。