数据库去重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可以提升数据质量和查询效率,但也要注意其对性能的影响。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据