概要: このチュートリアルでは、SQLのDISTINCT演算子を使用して、結果セットから重複を削除する方法を学びます。
SQL DISTINCT演算子の概要
結果セットから重複行を削除するには、SELECT句でDISTINCT演算子を次のように使用します。
SELECT DISTINCT
column1, column2, ...
FROM
table1;Code language: SQL (Structured Query Language) (sql)DISTINCT演算子の後に1つの列を使用する場合、DISTINCT演算子はその列の値を使用して重複を評価します。
2つ以上の列を使用する場合、DISTINCTはそれらの列の値の組み合わせを使用して重複を評価します。
DISTINCTは結果セットから重複行を削除するだけであり、テーブル内の重複行を削除しないことに注意してください。
2つの列を選択し、1つの列の重複を削除したい場合は、代わりにGROUP BY句を使用する必要があります。
SQL DISTINCTの例
DISTINCT演算子の動作を示すために、サンプルデータベースのemployeesテーブルを使用します。

1) 1つの列でSQL DISTINCT演算子を使用する例
次のステートメントは、employeesテーブルのsalary列から給与データを選択し、高から低にソートします。
SELECT
salary
FROM
employees
ORDER BY salary DESC;Code language: SQL (Structured Query Language) (sql)+----------+
| salary |
+----------+
| 24000.00 |
| 17000.00 |
| 17000.00 |
| 14000.00 |
| 13500.00 |
| 13000.00 |
| 12000.00 |
| 12000.00 |
| 11000.00 |
| 10000.00 |
| 9000.00 |
| 9000.00 |
...結果セットにはいくつかの重複があります。たとえば、17000、12000、および9000です。
次のステートメントは、DISTINCT演算子を使用して、employeesテーブルのsalary列から一意の値を選択します。
SELECT
DISTINCT salary
FROM
employees
ORDER BY salary DESC;Code language: SQL (Structured Query Language) (sql)+----------+
| salary |
+----------+
| 24000.00 |
| 17000.00 |
| 14000.00 |
| 13500.00 |
| 13000.00 |
| 12000.00 |
| 11000.00 |
| 10000.00 |
| 9000.00 |Code language: plaintext (plaintext)ご覧のとおり、結果セットには重複した給与値は含まれていません。
2) 複数の列でSQL DISTINCT演算子を使用する例
次のステートメントは、employeesテーブルからjob idとsalaryを選択します。
SELECT
job_id,
salary
FROM
employees
ORDER BY
job_id,
salary DESC;Code language: SQL (Structured Query Language) (sql)+--------+----------+
| job_id | salary |
+--------+----------+
| 1 | 8300.00 |
| 2 | 12000.00 |
| 3 | 4400.00 |
| 4 | 24000.00 |
| 5 | 17000.00 |
| 5 | 17000.00 |
| 6 | 9000.00 |
| 6 | 8200.00 |
...Code language: plaintext (plaintext)結果セットには、job id 5 salary 17000などの重複行があります。これは、同じjob idと給与を持つ従業員が2人いることを意味します。
次のステートメントは、DISTINCT演算子を使用して、job idとsalaryの重複値を削除します。
SELECT DISTINCT
job_id,
salary
FROM
employees
ORDER BY
job_id,
salary DESC;Code language: SQL (Structured Query Language) (sql)+--------+----------+
| job_id | salary |
+--------+----------+
| 1 | 8300.00 |
| 2 | 12000.00 |
| 3 | 4400.00 |
| 4 | 24000.00 |
| 5 | 17000.00 |
| 6 | 9000.00 |
| 6 | 8200.00 |
...Code language: plaintext (plaintext)job_id列に重複が表示されていることに注意してください。これは、DISTINCT演算子がjob_id列の値だけでなく、job_idとsalaryの両方の値を使用して重複を評価するためです。
SQL DISTINCTとNULL
データベースでは、NULLは不明または欠落しているデータを意味します。
数値、文字列、日付などの値とは異なり、NULLはそれ自体を含めて何とも等しくありません。次の式は不明(またはNULL)を返します。
NULL=NULLCode language: PHP (php)通常、DISTINCT演算子はすべてのNULLを同じように扱います。したがって、DISTINCT演算子は結果セットに1つのNULLのみを保持します。
この動作はデータベース製品によって異なる可能性があることに注意してください。
たとえば、次のステートメントは、従業員の一意の電話番号を返します。
SELECT DISTINCT phone_number
FROM employees
ORDER BY phone_number;Code language: SQL (Structured Query Language) (sql)+--------------+
| phone_number |
+--------------+
| NULL |
| 515.123.4444 |
| 515.123.4567 |
| 515.123.4568 |
| 515.123.4569 |
| 515.123.5555 |
...Code language: plaintext (plaintext)クエリが結果セットに1つのNULLのみを返すことに注意してください。
まとめ
- 結果セットから重複行を削除するには、
SELECT句でDISTINCT演算子を使用します。