在本教程中,我们将学习如何使用sql distinct
运算符从结果集中删除重复数据项。
主键确保表没有重复的行。 但是,当您使用select
语句查询表中的一部分列时,可能会得到重复数据项。
要从结果集中删除重复数据项,请在select
子句中插入distinct
运算符,如下所示:
select distinct
column1, column2, ...
from
table1;
如果在distinct
运算符后使用一列,则数据库系统使用该列来计算重复。 如果使用两列或更多列,数据库系统将使用这些列的组合进行重复检查。
要删除重复项,数据库系统首先按select
子句中指定的每个列对结果集进行排序。 然后,它从上到下扫描表,以识别彼此相邻的重复项。 如果结果集很大,则排序和扫描操作可能会降低查询的性能。
我们将使用示例数据库中的employees
表来演示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 |
... ...
现在,从结果集中删除所有重复项。
以下语句从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 |
......
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
运算符从结果集中删除重复的行。