数据库去重DISTINCT
前言
在实际开发中,数据表中经常会出现重复的数据。为了保证数据的准确性和简洁性,我们常常需要对查询结果进行去重操作。MySQL为我们提供了DISTINCT
关键字,帮助我们轻松实现数据去重。
一、DISTINCT的基本用法
DISTINCT
用于SELECT语句中,可以去除查询结果中的重复记录。其基本语法如下:
SELECT DISTINCT 列名1, 列名2, ... FROM 表名 WHERE 条件;
- 如果只对一个字段去重,则只需写一个字段名。
- 如果对多个字段去重,则只有所有字段值都相同时才会被视为重复。
示例1:单字段去重
假设有如下用户表users
:
id | name | city |
---|---|---|
1 | 张三 | 北京 |
2 | 李四 | 上海 |
3 | 王五 | 北京 |
4 | 赵六 | 广州 |
5 | 张三 | 北京 |
我们想查询所有不重复的城市:
SELECT DISTINCT city FROM users;
查询结果:
city |
---|
北京 |
上海 |
广州 |
示例2:多字段去重
如果我们想查询所有不重复的“姓名+城市”组合:
SELECT DISTINCT name, city FROM users;
查询结果:
name | city |
---|---|
张三 | 北京 |
李四 | 上海 |
王五 | 北京 |
赵六 | 广州 |
可以看到,只有完全相同的“姓名+城市”组合才会被去重。
二、实际开发中的案例
案例1:统计不同用户的注册城市数
假设我们需要统计每个城市有多少不同的用户注册,可以这样写:
SELECT city, COUNT(DISTINCT name) AS user_count
FROM users
GROUP BY city;
结果:
city | user_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
假设有如下数据:
id | |
---|---|
1 | alice@a.com |
2 | bob@b.com |
3 | NULL |
4 | alice@a.com |
5 | NULL |
如果我们只想查询所有不重复且非空的邮箱,可以这样写:
SELECT DISTINCT email FROM users WHERE email IS NOT NULL;
查询结果:
alice@a.com |
bob@b.com |
这样就排除了所有NULL
值,只保留了非空且唯一的邮箱。
四、注意事项
DISTINCT
会影响查询性能,尤其是在大数据量、多字段去重时,建议合理使用。DISTINCT
只能去除完全相同的记录,部分字段不同的数据不会被去重。- 在聚合函数中也可以结合
DISTINCT
使用,如COUNT(DISTINCT 字段)
。 DISTINCT
本身不会自动排除NULL
,只会将所有NULL
视为一个重复值。- 如需排除
NULL
,需结合WHERE 字段 IS NOT NULL
条件使用。
五、总结
DISTINCT
是MySQL中非常实用的去重工具,能够帮助我们快速过滤重复数据。在实际开发中,合理使用DISTINCT
可以提升数据质量和查询效率,但也要注意其对性能的影响。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据