MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别

在MySQL中,我们经常需要对查询结果进行去重,而DISTINCTGROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用,但它们之间还是存在一些差异的。接下来,我们将通过创建测试数据和执行不同的查询来探讨这两种方法的区别。

目录

  1. 创建测试数据
  2. DISTINCT使用
  3. GROUP BY使用\](#GROUP BY使用)

  4. 总结

创建测试数据

首先,我们创建一个测试表pageview,并插入一些数据:

SQL代码:

sql 复制代码
-- 创建测试表
DROP TABLE IF EXISTS pageview;
CREATE TABLE pageview (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
    aid BIGINT NOT NULL COMMENT '文章ID',
    uid BIGINT NOT NULL COMMENT '(访问)用户ID',
    createtime DATETIME DEFAULT NOW() COMMENT '创建时间'
) DEFAULT CHARSET='utf8mb4';

-- 添加测试数据
INSERT INTO pageview(aid, uid) VALUES(1, 1);
INSERT INTO pageview(aid, uid) VALUES(1, 1);
INSERT INTO pageview(aid, uid) VALUES(2, 1);
INSERT INTO pageview(aid, uid) VALUES(2, 2);

DISTINCT使用

DISTINCT的基本语法如下:

sql 复制代码
SELECT DISTINCT column_name, column_name FROM table_name;

单列去重

根据aid(文章ID)去重:

SQL代码:

sql 复制代码
SELECT DISTINCT aid FROM pageview;

多列去重

根据aiduid联合去重:

SQL代码:

sql 复制代码
SELECT DISTINCT aid, uid FROM pageview;

聚合函数+去重

使用DISTINCT+聚合函数计算aid去重之后的总条数:

SQL代码:

sql 复制代码
SELECT COUNT(DISTINCT aid) FROM pageview;

GROUP BY使用

GROUP BY的基础语法如下:

sql 复制代码
SELECT column_name, column_name FROM table_name 
GROUP BY column_name;

单列去重

根据aid去重:

SQL代码:

sql 复制代码
SELECT aid FROM pageview GROUP BY aid;

DISTINCT相比,GROUP BY可以显示更多的列,而DISTINCT只能展示去重的列。

多列去重

根据aiduid联合去重:

SQL代码:

sql 复制代码
SELECT aid, uid FROM pageview GROUP BY aid, uid;

聚合函数 + GROUP BY

统计每个aid的总数量:

SQL代码:

sql 复制代码
SELECT aid, COUNT(*) FROM pageview GROUP BY aid;

distinct和group by的区别

查询结果集不同

使用DISTINCT去重时,查询结果集中只有去重列信息。而使用GROUP BY可以查询一个或多个字段。

使用业务场景不同

统计去重之后的总数量需要使用DISTINCT,而统计分组明细或在分组明细的基础上添加查询条件时,就得使用GROUP BY

性能不同

如果去重的字段有索引,那么GROUP BYDISTINCT都可以使用索引,此情况下它们的性能是相同的。而当去重的字段没有索引时,DISTINCT的性能可能会高于GROUP BY,因为在MySQL 8.0之前,GROUP BY有一个隐藏的功能会进行默认的排序,这样就会触发filesort从而导致查询性能降低。

总结

大部分场景下DISTINCT是特殊的GROUP BY,但二者也有细微的区别,比如它们在查询结果集上、使用的具体业务场景上,以及性能上都是不同的。了解这些差异可以帮助我们根据实际需求选择更合适的方法。

相关推荐
草莓熊Lotso1 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
Cx330❀1 小时前
从零实现Shell命令行解释器:原理与实战(附源码)
大数据·linux·数据库·人工智能·科技·elasticsearch·搜索引擎
岁岁种桃花儿8 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn9 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐9 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.10 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手10 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
STCNXPARM10 小时前
Linux camera之V4L2子系统详解
android·linux·camera·v4l2架构
2501_9445255411 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
踩坑小念11 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀