使⽤SQLDISTINCT删除重复数据项
在本教程中,我们将学习如何使⽤SQL DISTINCT运算符从结果集中删除重复数据项。
1. SQL DISTINCT运算符简介
主键确保表没有重复的⾏。但是,当您使⽤SELECT语句查询表中的⼀部分列时,可能会得到重复数据项。
要从结果集中删除重复数据项,请在SELECT⼦句中插⼊DISTINCT运算符,如下所⽰:
SELECT DISTINCT
column1, column2, ...
FROM
table1;
如果在DISTINCT运算符后使⽤⼀列,则数据库系统使⽤该列来计算重复。如果使⽤两列或更多列,数据库系统将使⽤这些列的组合进⾏重复检查。
要删除重复项,数据库系统⾸先按SELECT⼦句中指定的每个列对结果集进⾏排序。然后,它从上到下扫描表,以识别彼此相邻的重复项。如果结果集很⼤,则排序和扫描操作可能会降低查询的性能。
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值
值在SQL中是⼀个特别的值。它在某些情况下⽤作标记,⽐如:缺少信息或信息不适⽤。因此,NULL⽆法与任何值进⾏⽐较。即使NULL也不等于它⾃⼰。如果列中有两个或多个NULL值,数据库系统是否将它们视为相同或不同的值?
通常,DISTINCT运算符将所有NULL值视为相同的值。因此在结果集中,DISTINCT运算符只保留⼀个NULL值,并从结果集中删除其它
的NULL值。
以下语句返回员⼯的不同电话号码。
SELECT DISTINCT
phone_number
FROM
employees;
执⾏上⾯查询语句,得到以下结果 -
+----------------+
| phone_number |
+----------------+
情侣物品
| 0532-******** |
| 0551-******* |
| 0571-******** |
......
| NULL |
| 0351-******* |
| 021-******** |
杏仁孕妇可以吃吗| 010-******** |
| 0755-******** |
| 0755-******** |
| 0513-******** |
| 0898-******** |
| 022-******** |
+----------------+
34 rows in t
请注意,它只返回⼀个NULL值。
在本教程中,您学习了如何使⽤DISTINCT运算符从结果集中删除重复的⾏。