MySQL DISTINCT

时间:2019-11-20 08:52:04  来源:igfitidea点击:

简介:在本教程中,您将学习如何在SELECT语句中使用MySQL DISTINCT子句消除结果集中的重复行。

MySQL DISTINCT子句简介

从表中查询数据时,您可能会得到重复的行。
为了删除这些重复的行,请在SELECT语句中使用DISTINCT子句。

这是DISTINCT子句的语法:

SELECT DISTINCT
    select_list
FROM
    table_name;

MySQL DISTINCT示例

让我们看一个简单的示例,该示例使用DISTINCT子句从employees表中选择唯一的员工姓氏。

首先,使用以下SELECT语句从employees表中查询雇员的姓氏:

SELECT 
    lastname
FROM
    employees
ORDER BY 
    lastname;

如输出中清楚所示,一些员工的姓氏相同,例如Bondur,Firrelli。

该语句使用DISTINCT子句从employees表中选择唯一的姓:

SELECT 
    DISTINCT lastname
FROM
    employees
ORDER BY 
    lastname;

从输出中可以看到,结果集中消除了重复的姓氏。

MySQL DISTINCT和NULL值

如果一列具有NULL值,并且对该列使用DISTINCT子句,则MySQL仅保留一个NULL值,因为DISTINCT将所有NULL值视为相同值。

例如,在客户表中,我们有许多行,其状态列的值为NULL。

当您使用DISTINCT子句查询客户的状态时,您将看到唯一状态和NULL,如下查询:

SELECT DISTINCT state
FROM customers;

MySQL DISTINCT多列

您可以将DISTINCT条款用于多列。
在这种情况下,MySQL使用这些列中值的组合来确定结果集中行的唯一性。

例如,要从客户表中获得城市和州的唯一组合,请使用以下查询:

SELECT DISTINCT
    state, city
FROM
    customers
WHERE
    state IS NOT NULL
ORDER BY 
    state, 
    city;

没有DISTINCT条款,您将获得州和城市的重复组合,如下所示:

SELECT 
    state, city
FROM
    customers
WHERE
    state IS NOT NULL
ORDER BY 
    state , 
    city;

DISTINCT子句与GROUP BY子句

如果在SELECT语句中使用GROUP BY子句而不使用聚合函数,则GROUP BY子句的行为类似于DISTINCT子句。

以下语句使用GROUP BY子句从客户表中选择客户的唯一状态。

SELECT 
    state
FROM
    customers
GROUP BY state;

您可以通过使用DISTINCT子句获得类似的结果:

SELECT DISTINCT
    state
FROM
    customers;

一般来说,DISTINCT条款是GROUP BY子句的特例。
DISTINCT子句与GROUP BY子句之间的区别在于GROUP BY子句对结果集进行排序,而DISTINCT子句则不对结果集进行排序。

注意,MySQL 8.0删除了GROUP BY子句的隐式排序。
因此,如果您使用MySQL 8.0+,则会发现上述带有GROUP BY子句的查询的结果集未排序。

如果将ORDER BY子句添加到使用DISTINCT子句的语句中,则对结果集进行排序,并且该结果集与使用GROUP BY子句的语句返回的结果集相同。

SELECT DISTINCT
    state
FROM
    customers
ORDER BY 
    state;

MySQL DISTINCT和聚合函数

您可以将DISTINCT子句与聚合函数(例如SUM,AVG和COUNT)一起使用,以在将聚合函数应用于结果集之前删除重复的行。

例如,要计算美国客户的唯一状态,请使用以下查询:

SELECT 
    COUNT(DISTINCT state)
FROM
    customers
WHERE
    country = 'USA';

带有LIMIT子句的MySQL DISTINCT

如果您将DISTINCT子句与LIMIT子句一起使用,当MySQL找到LIMIT子句中指定的唯一行数时,它将立即停止搜索。

以下查询在customers表中选择前五个非空唯一状态。

SELECT DISTINCT
    state
FROM
    customers
WHERE
    state IS NOT NULL
LIMIT 5;

在本教程中,我们向您展示了使用MySQL DISTINCT子句的各种方法,例如消除重复的行和计算非NULL值。