摘要:在本教程中,您将学习如何使用 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
运算符。

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_id
和 salary
中的值来评估重复项,而不仅仅是 job_id
列中的值。
SQL DISTINCT 和 NULL
在数据库中,NULL 表示未知或缺失数据。
与数字、字符串、日期等值不同,NULL 不等于任何值,甚至包括它本身,以下表达式将返回未知(或 NULL)
NULL=NULL
Code 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
运算符可以移除结果集中重复的行。