Sql简介 专题
专题目录
您的位置:database > Sql简介专题 > SQL DISTINCT运算符
SQL DISTINCT运算符
作者:--    发布时间:2019-11-20

在本教程中,我们将学习如何使用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_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运算符从结果集中删除重复的行。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册