MySQLでDISTINCTを使用して重複行を削除

MySQLでDISTINCTを使用する方法

DISTINCTは、クエリの結果セットから重複する行を削除し、ユニークな値のみを返すために使用されます。
例えば、テーブルに同じデータが複数回登録されている場合でも、DISTINCTを使用することで、重複を取り除いた結果を取得できます。
どんな値のパターンが登録されているのか確認したい場合などに使用されます。

基本的な使用方法

DISTINCTは通常、SELECT文と一緒に使用されます。
以下に基本的な構文を示します。

SELECT DISTINCT カラム1, カラム2, ...
FROM テーブル名;

この構文では、指定した列の組み合わせで重複を取り除いた結果が返されます。
例えば、次のようなテーブルemployeesがあるとします。

| id | first_name | last_name | department |
|----|------------|-----------|------------|
| 1  | John       | Doe       | Sales      |
| 2  | Jane       | Smith     | Sales      |
| 3  | John       | Doe       | Marketing  |
| 4  | Jane       | Doe       | Sales      |
| 5  | John       | Doe       | Sales      |

この場合、次のクエリを実行すると

SELECT DISTINCT first_name, last_name FROM employees;

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

| first_name | last_name |
|------------|-----------|
| John       | Doe       |
| Jane       | Smith     |
| Jane       | Doe       |

この結果では、first_nameとlast_nameの組み合わせが一意になるように重複が取り除かれています。

複数列でのDISTINCT

DISTINCTは複数の列にまたがって動作します。
つまり、指定したすべての列の組み合わせが完全に一致する場合にのみ重複が削除されます。
上記の例で、department列も含めてDISTINCTを使用すると、結果が変わることがわかります。

SELECT DISTINCT first_name, last_name, department FROM employees;

このクエリの結果は以下の通りです。

| first_name | last_name | department |
|------------|-----------|------------|
| John       | Doe       | Sales      |
| Jane       | Smith     | Sales      |
| John       | Doe       | Marketing  |
| Jane       | Doe       | Sales      |

この場合、first_nameとlast_nameが同じであっても、departmentが異なるため、重複として扱われません。

DISTINCTと集計関数

DISTINCTは集計関数と組み合わせて使用することもできます。
例えば、特定の列のユニークな値の数を数えたい場合に、COUNT()関数と一緒に使用します。

SELECT COUNT(DISTINCT department) FROM employees;

このクエリは、employeesテーブル内でユニークなdepartmentの数を返します。
結果として、重複した部門名が除外された状態でカウントされます。

DISTINCTとORDER BY

DISTINCTを使用する場合でも、ORDER BY句で結果をソートすることができます。
ただし、ORDER BY句はDISTINCTによってフィルタリングされた結果セットに対して適用されるため、ソートの順序が結果に影響を与えることはありません。

SELECT DISTINCT first_name, last_name FROM employees ORDER BY last_name ASC;

このクエリでは、重複を削除した後にlast_nameで昇順にソートされた結果が返されます。

注意点

1. パフォーマンス
DISTINCTは重複を削除するため、特に大規模なデータセットに対して使用する場合、パフォーマンスに影響を与えることがあります。
インデックスを設定することで、DISTINCTのパフォーマンスが向上することがあります。

2. NULLの扱い
MySQLでは、NULLは他のNULLと等しいとみなされます。
そのため、DISTINCTを使用すると、NULLが一つにまとめられます。

結論

DISTINCTは、重複するデータを取り除いてユニークな結果を取得するための強力なツールです。
適切に使用することで、データの冗長性を排除し、クリーンな結果を得ることができます。
しかし、パフォーマンスへの影響を考慮しながら使用することが重要です。