MySQL DISTINCT语句去除重复记录数据

MySQL DISTINCT子句概述

当从表中查询数据时,可能会获得重复的行。为了消除这些重复的行,咱们可在SELECT语句中使用DISTINCT子句。html

DISTINCT子句的语法以下:mysql

SELECT DISTINCT
    columns
FROM
    table_name
WHERE
    where_conditions;

MySQL DISTINCT示例

让咱们来看看如何使用DISTINCT子句从 employee 表中查询员工惟一姓名(有同名只显示一个)的简单例子。sql

首先,咱们使用SELECT语句从 employee 表查询员工的姓名,以下所示:函数

SELECT
    employee_name,job_title,office_id
FROM
    employee
ORDER BY employee_name;

执行结果以下所示 - 

上面的结果,有些员工的姓名相同,如这里有两个员工叫刘德华,可是他们所在部门和职位都不同。学习

要去除重复的姓名,只须要在SELECT语句中添加DISTINCT子句,以下:spa

SELECT DISTINCT
    employee_name
FROM
    studymysql.employee
ORDER BY employee_name;

执行结果以下所示 - 

咱们使用 DISTINCT 子句以后,重复的姓名(如:刘德华)在结果集中已经消除了,这里的结果集中只有一个"刘德华"了。code

MySQL DISTINCT和NULL值

若是一个列函有NULL值,在该列上使用DISTINCT子句,MySQL的DISTINCT子句将并消除全部其它的NULL值只保留一个NULL值。htm

例如,在 customer 表中,咱们有不少行的 province  列的值是NULL。当咱们使用DISTINCT子句来查询客户的状态,就会看到一个惟一的NULL值,以下查询:排序

SELECT DISTINCT
    province
FROM
    studymysql.customer;

执行结果以下所示 - 
教程

MySQL DISTINCT子句与多列

在DISTINCT子句和可使用多个列。在这种状况下,MySQL使用全部列的组合来肯定结果集中的行的惟一性。

例如,要得到 customer 表中 city 和 province 惟一性组合,可使用下面的查询:

SELECT DISTINCT
    province,city
FROM
    studymysql.customer
WHERE
    province IS NOT NULL
ORDER BY province,city;

执行结果以下所示 - 

若是不使用DISTINCT子句,会获得 province 和 city 的重复组合以下:

SELECT
    province,city
FROM
    studymysql.customer
WHERE
    province IS NOT NULL
ORDER BY province,city;

执行结果以下所示,有好些记录行是重复的 - 

DISTINCT子句 vs. GROUP BY子句

若是在SELECT语句中使用GROUP BY子句,但不使用聚合函数,那么GROUP BY子句的查询行为相似于DISTINCT子句。

下面的语句是使用GROUP BY子句从 customer 表中查询客户的惟一省份(province)。

SELECT
    province
FROM
    studymysql.customer
GROUP BY province;

执行结果中已通过滤重复的行,以下所示 - 

也能够经过使用DISTINCT子句实现相似的效果:

SELECT DISTINCT
    province
FROM
    studymysql.customer;

执行结果中已通过滤重复的行,以下所示 - 

通常来讲,DISTINCT子句是GROUP BY子句的一个特例。 GROUP BY子句与DISTINCT子句之间的区别是,在GROUP BY子句对结果集排序,而DISTINCT子句没有。

若是添加 ORDER BY子句到查询语句中而且使用DISTINCT子句,那么能够对结果集进行排序,这与使用GROUP BY子句在语句中返回的惟一值是同样的。

SELECT DISTINCT
    province
FROM
    studymysql.customer
ORDER BY province;

执行结果中已通过滤重复的行,以下所示 - 

MySQL DISTINCT和聚合函数

DISTINCT子句能够与聚合函数一块儿使用,如:SUMAVG 和 COUNT,在MySQL应用聚合函数到结果集以前去除重复行。

例如,查询计算省份在 "广东" 的全部城市数量,可使用如下查询:

SELECT
    COUNT(DISTINCT city)
FROM
    studymysql.customer
WHERE
    province='广东';

执行结果(广东地区的客户他们分别在:广州,深圳和珠海这三个城市)以下所示 - 

MySQL DISTINCT 与 LIMIT子句

若是使用DISTINCT子句与LIMIT子句一块儿查询,当MySQL查询出LIMIT子句中指定的惟一的行数后将当即中止搜索。

下面将查询 customer 表中选择 ciyt 字段为非空(NOT NULL)的前5个惟一值。

SELECT DISTINCT
    city
FROM
    studymysql.customer
WHERE
    city IS NOT NULL
LIMIT 5;

执行结果以下所示 - 

在本教程中,咱们已经学习了使用MySQL DISTINCT子句的各类方式,如:消除重复行和计算非NULL值的行数。

相关文章
相关标签/搜索