SELECT
语句中使用MySQL DISTINCT子句来消除结果集中的重复行。MySQL DISTINCT子句简介
从表中查询数据时,可能会出现重复的行。要删除这些重复行,请使用SELECT语句中的DISTINCT
子句。
使用该DISTINCT
子句的语法如下:
1
2
3
4
5
6
|
SELECT DISTINCT
columns
FROM
table_name
WHERE
where_conditions;
|
MySQL DISTINCT示例
让我们看一个使用该DISTINCT
子句从employees
表中选择员工唯一姓氏的简单示例。
首先,我们employees
使用以下SELECT
语句从表中查询员工的姓氏:
1
2
3
4
5
|
SELECT
lastname
FROM
employees
ORDER BY lastname;
|
有些员工姓氏相同 Bondur
,Firrelli
等等。
要删除重复的姓氏,请将该DISTINCT
子句添加到SELECT
语句中,如下所示:
1
2
3
4
5
|
SELECT DISTINCT
lastname
FROM
employees
ORDER BY lastname;
|
当我们使用该DISTINCT
子句时,结果集中将删除重复的姓氏。
MySQL DISTINCT和NULL值
如果列具有NULL
值并且您使用该DISTINCT
列的子句,则MySQL会保留一个NULL
值并消除另一个值,因为该DISTINCT
子句将所有NULL
值视为相同的值。
例如,在customers
表中,我们有许多行,其 state
列具有NULL
值。当我们使用该DISTINCT
子句查询客户的状态时,我们将看到唯一的状态和NULL
值作为以下查询:
1
2
3
4
|
SELECT DISTINCT
state
FROM
customers;
|
MySQL DISTINCT有多个列
您可以将该DISTINCT
子句与多个列一起使用。在这种情况下,MySQL使用所有列的组合来确定结果集中行的唯一性。
例如,要从customers
表中获取城市和州的唯一组合,请使用以下查询:
1
2
3
4
5
6
7
|
SELECT DISTINCT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY state , city;
|
如果没有该DISTINCT
条款,您将获得州和城市的重复组合,如下所示:
1
2
3
4
5
6
7
|
SELECT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY state , city;
|
DISTINCT子句与GROUP BY子句
如果在语句中使用GROUP BY子句SELECT
而不使用聚合函数,则该GROUP BY
子句的行为类似于DISTINCT
子句。
以下语句使用该GROUP BY
子句从customers
表中选择客户的唯一状态。
1
2
3
4
5
|
SELECT
state
FROM
customers
GROUP BY state;
|
您可以使用以下DISTINCT
子句来实现类似的结果:
1
2
3
4
|
SELECT DISTINCT
state
FROM
customers;
|
一般来说,该DISTINCT
条款是该条款的特例GROUP BY
。之间的区别DISTINCT
条款,GROUP BY
条款是该GROUP BY
条款排序结果集,而DISTINCT
条款不。
如果将ORDER BY子句添加到使用该 DISTINCT
子句的语句,则结果集将进行排序,并且与使用GROUP BY
子句的语句返回的结果集相同。
1
2
3
4
5
|
SELECT DISTINCT
state
FROM
customers
ORDER BY state;
|
MySQL DISTINCT和聚合函数
在MySQL将聚合函数应用于结果集之前,您可以使用DISTINCT
带有聚合函数的子句(例如,SUM,AVG和COUNT)来删除重复的行。
例如,要计算美国客户的唯一状态,请使用以下查询:
1
2
3
4
5
6
|
SELECT
COUNT(DISTINCT state)
FROM
customers
WHERE
country = ‘USA’;
|
带有LIMIT子句的MySQL DISTINCT
如果您使用DISTINCT
带有LIMIT子句的子句,MySQL会在找到LIMIT
子句中指定的唯一行数时立即停止搜索。
以下查询选择表中的前5个非null唯一状态customers
。
1
2
3
4
5
6
7
|
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;
|
在本教程中,我们向您展示了使用MySQL DISTINCT
子句的各种方法,例如消除重复行和计算非NULL值。
