详解MySQL中DISTINCT去重的核心注意事项

2025-06-18 17:50

本文主要是介绍详解MySQL中DISTINCT去重的核心注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据...

DISTINCT 六大注意事项

1. 作用范围:所有 SELECT 字段

SELECT DISTINCT a, b FROM table;  -- 对(a,b)组合整体去重

误以为只作用于第一个字段:

-- 错误理解:以为只对name去重
SELECT DISTINCT name, class FROM students;  

实际效果:对 (name, class) 组合去重(如 ('张三','一班') 和 ('张三','二班') 算不同记录)

2. NULL 值的特殊处理

INSERT INTO students (name, class, score) VALUES (NULL, '三班', 90);

​​​​​​​SELECT DISTINCT name FROM students;

结果:

+--------+
| name   |
+--------+
| 张三   |
| 李四   |
| 王五   |
| NULL   |  -- NULL被视为独立值保留
+--------+

3. 性能陷阱(大数据量)

-- 当表有百万行时慎用
SELECT DISTINCT text_column FROM huge_table; 

优化方案:android

-- 先通过WHERE缩小范围再去重
SELECT DISTINCT text_column 
FROM huge_table 
WHERE create_time > '2023-01-01';

-- 或添加索引(对text类型有限制)
ALTER TABLE huge_table ADD INDEX idx_text(text_column(20)); -- 前缀索引

4. 与 ORDER BY 的优先级

SELECT DISTINCT class 
FROM studeChina编程nts 
ORDER BY score DESC; -- 错误!score不在SELECT中

正确写法:

-- 方案1:排序字段必须在SELECT中
SELECT DISTINCT class, MAX(score) AS max_score 
FROM students 
GROUP BY class 
ORDER BY max_score DESC;

-- 方案2:子查询
SELECT DISTINCT class FROM (
  SELECT class, score FROM students ORDER BY score DESC
) AS tmp;

5. 聚合函数中的 DISTINCT

-- 统计不重复的班级数量
SELECT COUNT(DISTINCT class) FROM students; 

-- 错误用法(语法无效):
SELECT DISTINCT COUNT(class) FROM students; 

6. 不可用于部分字段计算

-- 尝试计算不同班级的平均分(错误!)
SELECT DISTINCT class, AVG(score) FROM students; 

正确做法:必须配合 GROUP BY

SELECT class, AVG(score) 
FROM students 
GROUP BY class;  -- 这才是标准解法

高级注意点

7. 与 LIMIT 的配合问题

SELECT DISTINCT class FROM students LIMIT 2;

结果不确定性:

返回的 2 条记录是随机的(除非指定 ORDER BY),不同执行可能结果不同。

8. 临时表空间占用

DISTINCT 操作会在内存/磁盘创建临时表存储唯一值

当去重字段总数据量超过 tmp_table_size 时,性能急剧下降

查看阈值:

http://www.chinasem.cn
SHOW VARIABLES LIKE 'tmp_table_size'; -- 默认16MB

对比 GROUP BY 去重

特性DISTINCTGROUP BY
是否可搭配聚合函数✅ (如SUM/AVG)
结果排序无序可按分组键排序
执行效率简单场景更快复杂聚合时更优
索引利用可使用索引必须用分组字段索引

最佳实践总结

小数据量:直接 DISTINCT 简洁高效

需要聚合计算:用 GROUP BY 替代

精确去重计数:优先 COUNT(DISTINCT column)

排序需求:必须显式写 ORDER BY

超大数据:先过滤再去重 + 合理索引

实战检验

http://www.chinasem.cn单表 orders 结构:

CREATE TABLE orders (
    id INT PRIMARY KEY,
    product_id INT,
    user_id INT,
    amount DECIMAL(10,2),
    coupon_code VARCHAR(20) -- 允许为NULL
javascript);

问题:

如何高效获取使用过不同优惠券的用户ID列表(含NULL)?

写出你的解决方案:

SELECT _______________________________
FROM orders;

答案(折叠):

-- 方案1:基础写法
SELECT DISTINCT user_id, coupon_code 
FROM orders 
WHERE coupon_code IS NOT NULL; -- 若需包含NULL则去掉WHERE

​​​​​​​-- 方案2:大数据量优化(添加联合索引)
ALTER TABLE orders ADD INDEX idx_user_coupon(user_id, coupon_code);
SELECT DISTINCT user_id, coupon_code FROM orders;

到此这篇关于详解mysql中DISTINCT去重的核心注意事项的文章就介绍到这了,更多相关MySQL DISTINCT去重内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于详解MySQL中DISTINCT去重的核心注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155122

相关文章

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2