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 |