使用SQL DISTINCT删除重复数据项

在本教程中,我们将学习如何使用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_idsalary列的数据。

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_id5salary17000两行记录。

现在,如果将DISTINCT运算符添加到SELECT子句,则数据库系统将使用job_idsalary列中的值来计算重复项。 它只保留一个行记录,如上面的屏幕截图所示。

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运算符从结果集中删除重复的行。

 

上一篇:常用网站总结(更新中)


下一篇:编写SQL语句,检索并列出已订购产品(prod_id)的清单