MySQL DISTINCT:去重(过滤重复数据)

在使用 MySQL SELECT 语句查询数据的时候返回的是所有匹配的行。

例如,查询 tb_students_info 表中所有 age 的执行结果如下所示。

  1. mysql> SELECT age FROM tb_students_info;
  2. +------+
  3. | age |
  4. +------+
  5. | 25 |
  6. | 23 |
  7. | 23 |
  8. | 22 |
  9. | 24 |
  10. | 21 |
  11. | 22 |
  12. | 23 |
  13. | 22 |
  14. | 23 |
  15. +------+
  16. 10 rows in set (0.00 sec)

可以看到查询结果返回了 10 条记录,其中有一些重复的 age 值,有时出于对数据分析的要求,需要消除重复的记录值。这时候就需要用到 DISTINCT 关键字指示 MySQL 消除重复的记录值,语法格式为:

SELECT DISTINCT <字段名> FROM <表名>;

例 1

查询 tb_students_info 表中 age 字段的值,返回 age 字段的值且不得重复,输入的 SQL 语句和执行结果如下所示。

mysql> SELECT DISTINCT age FROM tb_students_info;
+------+
| age  |
+------+
|   25 |
|   23 |
|   22 |
|   24 |
|   21 |
+------+
5 rows in set (0.11 sec)

由运行结果可以看到,这次查询结果只返回了 5 条记录的 age 值,且没有重复的值。

实例2

在使用mysql时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user:

MySQL DISTINCT:去重(过滤重复数据) - 图1

用distinct来返回不重复的用户名:select distinct name,id from user;,这样的结果为:

MySQL DISTINCT:去重(过滤重复数据) - 图2

distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by :

select id,name from user group by name;

group by 是分组查询 关键字

distinct 是去重查询关键字