概要: このチュートリアルでは、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=NULL
Code 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
演算子を使用します。