前言

在实际开发中,数据表中经常会出现重复的数据。为了保证数据的准确性和简洁性,我们常常需要对查询结果进行去重操作。MySQL为我们提供了DISTINCT关键字,帮助我们轻松实现数据去重。

一、DISTINCT的基本用法

DISTINCT用于SELECT语句中,可以去除查询结果中的重复记录。其基本语法如下:

SELECT DISTINCT 列名1, 列名2, ... FROM 表名 WHERE 条件;
  • 如果只对一个字段去重,则只需写一个字段名。
  • 如果对多个字段去重,则只有所有字段值都相同时才会被视为重复。

示例1:单字段去重

假设有如下用户表users

idnamecity
1张三北京
2李四上海
3王五北京
4赵六广州
5张三北京

我们想查询所有不重复的城市:

SELECT DISTINCT city FROM users;

查询结果:

city
北京
上海
广州

示例2:多字段去重

如果我们想查询所有不重复的“姓名+城市”组合:

SELECT DISTINCT name, city FROM users;

查询结果:

namecity
张三北京
李四上海
王五北京
赵六广州

可以看到,只有完全相同的“姓名+城市”组合才会被去重。

二、实际开发中的案例

案例1:统计不同用户的注册城市数

假设我们需要统计每个城市有多少不同的用户注册,可以这样写:

SELECT city, COUNT(DISTINCT name) AS user_count
FROM users
GROUP BY city;

结果:

cityuser_count
北京2
上海1
广州1

案例2:去重后分页查询

有时候我们需要对去重后的结果进行分页,可以使用子查询:

SELECT * FROM (
    SELECT DISTINCT city FROM users
) AS t
LIMIT 0, 2;

这样可以得到前两条不重复的城市记录。

三、去重时排除NULL值

在MySQL中,DISTINCT会将所有NULL视为相同的一个值,因此如果某列有多条NULL记录,最终只会保留一条NULL。但有时我们希望去重时排除掉NULL,只统计非空的唯一值。

示例:去重且排除NULL

假设有如下数据:

idemail
1alice@a.com
2bob@b.com
3NULL
4alice@a.com
5NULL

如果我们只想查询所有不重复且非空的邮箱,可以这样写:

SELECT DISTINCT email FROM users WHERE email IS NOT NULL;

查询结果:

email
alice@a.com
bob@b.com

这样就排除了所有NULL值,只保留了非空且唯一的邮箱。

四、注意事项

  1. DISTINCT会影响查询性能,尤其是在大数据量、多字段去重时,建议合理使用。
  2. DISTINCT只能去除完全相同的记录,部分字段不同的数据不会被去重。
  3. 在聚合函数中也可以结合DISTINCT使用,如COUNT(DISTINCT 字段)
  4. DISTINCT本身不会自动排除NULL,只会将所有NULL视为一个重复值。
  5. 如需排除NULL,需结合WHERE 字段 IS NOT NULL条件使用。

五、总结

DISTINCT是MySQL中非常实用的去重工具,能够帮助我们快速过滤重复数据。在实际开发中,合理使用DISTINCT可以提升数据质量和查询效率,但也要注意其对性能的影响。

分类: MySQL 标签: MySQL去重DISTINCT

评论

暂无评论数据

暂无评论数据

目录