DISTINCTの使い方で沼ったので練習がてら覚え書き。
まずは以下のSQLクエリを使用して、データベースとテーブルを作成しサンプルデータを挿入します。
-- データベースの作成
CREATE DATABASE practice_db;
-- データベースの使用
USE practice_db;
-- テーブルの作成
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(100)
);続いてデータを投入します。
テーブル定義はざっくり下記のイメージです。
・id: 従業員の一意のID(自動インクリメント)
・name: 従業員の名前
・department: 従業員の部署
-- サンプルデータの挿入
INSERT INTO employees (name, department) VALUES
('Alice', 'Engineering'),
('Bob', 'Engineering'),
('Alice', 'Engineering'),
('Charlie', 'Sales'),
('Bob', 'Engineering'),
('David', 'HR'),
('Alice', 'HR'),
('Charlie', 'Sales'),
('Eve', 'Engineering');こちらのようなデータが出来上がります。
このデータに対してDISTINCTを使ってデータ抽出を行ってみたいと思います!
| id | name | department |
|---|---|---|
| 1 | Alice | Engineering |
| 2 | Bob | Engineering |
| 3 | Alice | Engineering |
| 4 | Charlie | Sales |
| 5 | Bob | Engineering |
| 6 | David | HR |
| 7 | Alice | HR |
| 8 | Charlie | Sales |
| 9 | Eve | Engineering |
DISTINCTを使ったクエリの例
名前で重複をまとめる
SELECT DISTINCT name FROM employees;このクエリは、nameが重複しているレコードをまとめた結果を抽出します。
「Alice」のように複数レコード存在するデータは1レコードにまとめられていることがわかると思います。
| name |
|---|
| Alice |
| Bob |
| Charlie |
| David |
| Eve |
名前と部署の組み合わせで重複をまとめた
SELECT DISTINCT name, department FROM employees;複数のカラムを指定して重複データをまとめることも可能です。
たとえば、「Bob」と「Engineering」の組み合わせは複数レコード存在するため1レコードにまとめられます。
反対に「Alice」「Engineering」や「Alice」「HR」の組み合わせのように、一方が同じ値でももう一方が異なる値の場合はまとめられません。
| name | department |
|---|---|
| Alice | Engineering |
| Bob | Engineering |
| Charlie | Sales |
| David | HR |
| Alice | HR |
| Eve | Engineering |
重複でまとめたデータを集計する
DISTINCTを使って、重複でまとめたデータを集計することもできます。
-- 各部署ごとの従業員数を集計するクエリ
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;結果は以下のようになります。
| department | employee_count |
|---|---|
| Engineering | 5 |
| Sales | 2 |
| HR | 2 |