摘要:在本教程中,您将学习如何使用 SQL DISTINCT 运算符从表中选择不重复的值。
SQL DISTINCT 运算符简介 #
要从表的某一列中选择不重复的值,您可以在 SELECT 子句中使用 DISTINCT 运算符,如下所示:
SELECT DISTINCT
column1
FROM
table_name;Code language: SQL (Structured Query Language) (sql)在此语法中,SELECT 语句返回一个结果集,其中包含表中 column1 列的唯一值。
SQL 允许您将多个列与 DISTINCT 运算符一起使用:
SELECT DISTINCT
column1,
column2
FROM
table_name;在这种情况下,SELECT 语句会使用 column1 和 column2 两列的值组合来评估行的唯一性,并将不重复的行包含在结果集中。
请注意,DISTINCT 仅从表中选择不重复的值,它不会删除表中的重复行。
如果您想选择两列并移除其中一列的重复项,您应该改用 GROUP BY 子句。
SQL DISTINCT 运算符示例 #
我们将使用示例数据库中的 employees 表来演示 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)输出显示 DISTINCT 运算符返回了唯一的薪资金额。
在多列上选择不重复行的示例 #
以下语句从 employees 表中检索职位 ID 和薪水:
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
6 | 7800.00
6 | 7700.00
6 | 6900.00
7 | 12000.00
...Code language: plaintext (plaintext)结果集有一些重复行,例如职位 ID 为 5,薪水为 17000。这意味着有两名员工具有相同的职位 ID 和薪水。
以下语句使用 DISTINCT 运算符来移除职位 ID 和薪水中的重复值:
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
6 | 7800.00
...Code language: plaintext (plaintext)请注意,您在 job_id 列中仍然会看到重复值,因为 DISTINCT 运算符是使用 job_id 和 salary 两列的值来评估重复性,而不仅仅是 job_id 列中的值。
SQL DISTINCT 与 NULL #
在数据库世界中,NULL 是一个特殊的值,代表未知或缺失的数据。
与常规值不同,NULL 不等于任何东西,甚至不等于它自己。例如,以下表达式将产生 NULL,即未知:
SELECT
NULL = NULL;Code language: PHP (php)通常,DISTINCT 运算符将所有 NULL 值视为相同。因此,DISTINCT 运算符在结果集中只保留一个 NULL。
请注意,这种行为在不同的数据库产品之间可能会有所不同。
例如,以下语句返回员工的不重复电话号码:
SELECT DISTINCT
phone_number
FROM
employees
ORDER BY
phone_number DESC;Code language: SQL (Structured Query Language) (sql) phone_number
--------------
NULL
650.501.2876
650.501.1876
650.124.1224
650.123.4234
...Code language: plaintext (plaintext)请注意,查询在结果集中只返回一个 NULL。
摘要 #
- 在
SELECT子句中使用DISTINCT运算符,可以从表的一个或多个列中选择唯一值。
数据库 #
- PostgreSQL DISTINCT 运算符
- Oracle DISTINCT 运算符
- SQL Server DISTINCT 运算符
- MySQL DISTINCT 运算符
- SQLite DISTINCT 运算符
- Db2 DISTINCT 运算符
- MariaDB DISTINCT 运算符