DB プログラミング

【MySQL】DISTINCTで重複行をまとめる

DISTINCTの使い方で沼ったので練習がてら覚え書き。

まずは以下のSQLクエリを使用して、データベースとテーブルを作成しサンプルデータを挿入します。

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: 従業員の部署

SQL
-- サンプルデータの挿入
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を使ってデータ抽出を行ってみたいと思います!

idnamedepartment
1AliceEngineering
2BobEngineering
3AliceEngineering
4CharlieSales
5BobEngineering
6DavidHR
7AliceHR
8CharlieSales
9EveEngineering

DISTINCTを使ったクエリの例

名前で重複をまとめる

SQL
SELECT DISTINCT name FROM employees;

このクエリは、nameが重複しているレコードをまとめた結果を抽出します。
「Alice」のように複数レコード存在するデータは1レコードにまとめられていることがわかると思います。

name
Alice
Bob
Charlie
David
Eve

名前と部署の組み合わせで重複をまとめた

SQL
SELECT DISTINCT name, department FROM employees;

複数のカラムを指定して重複データをまとめることも可能です。
たとえば、「Bob」と「Engineering」の組み合わせは複数レコード存在するため1レコードにまとめられます。
反対に「Alice」「Engineering」や「Alice」「HR」の組み合わせのように、一方が同じ値でももう一方が異なる値の場合はまとめられません。

namedepartment
AliceEngineering
BobEngineering
CharlieSales
DavidHR
AliceHR
EveEngineering

重複でまとめたデータを集計する

DISTINCTを使って、重複でまとめたデータを集計することもできます。

SQL
-- 各部署ごとの従業員数を集計するクエリ
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

結果は以下のようになります。

departmentemployee_count
Engineering5
Sales2
HR2
  • この記事を書いた人

Usagi

▶︎ 新米エンジニア ▶︎ Usagi Blog 運営 ▶︎ 関西在住 ● 主にプログラミングについての学びを発信中

-DB, プログラミング