在本教程中,我们将学习如何使用SQL DISTINCT
运算符从结果集中删除重复数据项。
1. SQL DISTINCT运算符简介
主键确保表没有重复的行。 但是,当您使用SELECT
语句查询表中的一部分列时,可能会得到重复数据项。
要从结果集中删除重复数据项,请在SELECT
子句中插入DISTINCT
运算符,如下所示:
SELECT DISTINCT
column1, column2, ...
FROM
table1;
如果在DISTINCT
运算符后使用一列,则数据库系统使用该列来计算重复。 如果使用两列或更多列,数据库系统将使用这些列的组合进行重复检查。
要删除重复项,数据库系统首先按SELECT
子句中指定的每个列对结果集进行排序。 然后,它从上到下扫描表,以识别彼此相邻的重复项。 如果结果集很大,则排序和扫描操作可能会降低查询的性能。
更多教程请访问http://www.manongzj.com
2. SQL DISTINCT示例
我们将使用示例数据库中的employees
表来演示DISTINCT
运算符的工作原理。
3. SQL DISTINCT一列示例
以下语句从employees
表中检索薪水数据,并按降序对其进行排序。
SELECT
salary
FROM
employees
ORDER BY salary DESC;
执行上面查询语句,得到以下结果 -
+--------+
| salary |
+--------+
| 24000 |
| 17000 |
| 17000 |
| 14000 |
| 13500 |
| 13000 |
... ...
如上所见,有重复的薪资数据,例如17,000
,因为两个或更多员工的薪水相同。 要删除重复项,请将DISTINCT
运算符添加到SELECT
子句,如下所示:
SELECT
DISTINCT salary
FROM
employees
ORDER BY salary DESC;
执行上面查询语句,得到以下结果 -
+--------+
| salary |
+--------+
| 24000 |
| 17000 |
| 14000 |
| 13500 |
| 13000 |
| 12000 |
... ...
现在,从结果集中删除所有重复项。
4. SQL DISTINCT多列示例
以下语句从employees
表中检索job_id
和salary
列的数据。
SELECT
job_id,
salary
FROM
employees
ORDER BY
job_id,
salary DESC;
执行上面查询语句,得到以下结果 -
+--------+--------+
| job_id | salary |
+--------+--------+
| 1 | 8300 |
| 2 | 12000 |
| 3 | 4400 |
| 4 | 24000 |
| 5 | 17000 |
| 5 | 17000 |
... ...
上面查询结果集中,有两行记录相同:job_id
是5
和salary
是17000
两行记录。
现在,如果将DISTINCT
运算符添加到SELECT
子句,则数据库系统将使用job_id
和salary
列中的值来计算重复项。 它只保留一个行记录,如上面的屏幕截图所示。
SELECT DISTINCT
job_id,
salary
FROM
employees
ORDER BY
job_id,
salary DESC;
执行上面查询语句,得到以下结果 -
+--------+--------+
| job_id | salary |
+--------+--------+
| 1 | 8300 |
| 2 | 12000 |
| 3 | 4400 |
| 4 | 24000 |
| 5 | 17000 |
| 6 | 9000 |
| 6 | 8200 |
......
5. SQL DISTINCT和NULL值
NULL值在SQL中是一个特别的值。 它在某些情况下用作标记,比如:缺少信息或信息不适用。 因此,NULL
无法与任何值进行比较。 即使NULL
也不等于它自己。 如果列中有两个或多个NULL
值,数据库系统是否将它们视为相同或不同的值?
通常,DISTINCT
运算符将所有NULL
值视为相同的值。 因此在结果集中,DISTINCT
运算符只保留一个NULL
值,并从结果集中删除其它的NULL
值。
以下语句返回员工的不同电话号码。
SELECT DISTINCT
phone_number
FROM
employees;
执行上面查询语句,得到以下结果 -
+----------------+
| phone_number |
+----------------+
| 0532-86011111 |
| 0551-4243311 |
| 0571-87622362 |
......
| NULL |
| 0351-2233611 |
| 021-66050000 |
| 010-67237328 |
| 0755-28114518 |
| 0755-83587526 |
| 0513-83512816 |
| 0898-31686222 |
| 022-26144822 |
+----------------+
34 rows in set
请注意,它只返回一个NULL
值。
在本教程中,您学习了如何使用DISTINCT
运算符从结果集中删除重复的行。