SQL DISTINCT

概要: このチュートリアルでは、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テーブルを使用します。

employees_table

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_idsalaryの両方の値を使用して重複を評価するためです。

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演算子を使用します。
このチュートリアルは役に立ちましたか?