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