SQL DISTINCT

摘要:在本教程中,您将学习如何使用 SQL DISTINCT 运算符从结果集中移除重复项

SQL DISTINCT 运算符简介

若要移除结果集中重复的行,请在 SELECT 子句中使用 DISTINCT 运算符,如下所示

SELECT DISTINCT
    column1, column2, ...
FROM
    table1;Code language: SQL (Structured Query Language) (sql)

如何在 DISTINCT 运算符后面使用一列时,该运算符会使用该列中的值来评估重复项。

在使用两列或更多列时,DISTINCT 将使用这些列中的值组合来评估重复项。

请注意,DISTINCT 仅从结果集中移除重复行,而不会删除表中的重复行。

如果您想要选择两列并从一列中移除重复项,则应使用 GROUP BY 子句。

SQL DISTINCT 示例

我们将使用 样本数据库 中的 employees 表来演示如何使用 DISTINCT 运算符。

employees_table

1) 使用 SQL DISTINCT 运算符在单列上举例

以下语句会从 employees 表的 salary 列中选择 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)

如您所见,结果集中不包含任何重复的 salary 值。

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 和 salary 相同。

以下语句使用 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_idsalary 中的值来评估重复项,而不仅仅是 job_id 列中的值。

SQL DISTINCT 和 NULL

在数据库中,NULL 表示未知或缺失数据。

与数字、字符串、日期等值不同,NULL 不等于任何值,甚至包括它本身,以下表达式将返回未知(或 NULL)

NULL=NULLCode language: PHP (php)

通常,DISTINCT 运算符将所有 NULL 视为相同,因此,DISTINCT 运算符仅保留结果集中一个 NULL

请注意,此行为在不同的数据库产品之间可能有所不同。

例如,以下语句返回 employees 的唯一电话号码

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)

请注意,查询仅返回结果集中一个 NULL

总结

  • SELECT 子句中使用 DISTINCT 运算符可以移除结果集中重复的行。
本教程有用吗?