MySQL DISTINCT
简介:在本教程中,您将学习如何在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值。