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,但二者也有细微的区别,比如它们在查询结果集上、使用的具体业务场景上,以及性能上都是不同的。了解这些差异可以帮助我们根据实际需求选择更合适的方法。

相关推荐
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
常利兵4 小时前
Android内存泄漏:成因剖析与高效排查实战指南
android
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师4 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.5 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露5 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot