首页 > 数据库 >MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别

时间:2025-01-02 19:54:40浏览次数:3  
标签:pageview GROUP uid distinct group DISTINCT MySQL aid SELECT

MySQL中distinct和group by去重的区别

请添加图片描述

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

目录

  1. 创建测试数据
  2. DISTINCT使用
  3. [GROUP BY使用](#GROUP BY使用)
  4. [distinct和group by的区别](#distinct和group by的区别)
  5. 总结

创建测试数据

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

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的基本语法如下:

SELECT DISTINCT column_name, column_name FROM table_name;

单列去重

根据aid(文章ID)去重:

SQL代码:

SELECT DISTINCT aid FROM pageview;

多列去重

根据aiduid联合去重:

SQL代码:

SELECT DISTINCT aid, uid FROM pageview;

聚合函数+去重

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

SQL代码:

SELECT COUNT(DISTINCT aid) FROM pageview;

GROUP BY使用

GROUP BY的基础语法如下:

SELECT column_name, column_name FROM table_name 
GROUP BY column_name;

单列去重

根据aid去重:

SQL代码:

SELECT aid FROM pageview GROUP BY aid;

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

多列去重

根据aiduid联合去重:

SQL代码:

SELECT aid, uid FROM pageview GROUP BY aid, uid;

聚合函数 + GROUP BY

统计每个aid的总数量:

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

标签:pageview,GROUP,uid,distinct,group,DISTINCT,MySQL,aid,SELECT
From: https://blog.csdn.net/2401_85373732/article/details/144893732

相关文章

  • MySQL架构原理、多实例
    实验环境体系结构(C/S客户端/服务器)连接方式:TCP/IP方式(本地、远程(需要授权))mysql-u用户名-p密码-hMySQLIP地址-P3306Socket套接字方式(仅本地)mysql-u用户名-p密码-S/tmp/mysql.sock数据库实例mysqld后台守护进程MasterThread (主线程)workerThread (工作线......
  • ubuntu安装MySql 和 MySQL Workbench
    直接按官网指导下载安装。一、mysql安装进入https://www.mysql.com/downloads/选择MySQLCommunity(GPL)Downloads»找到MySQLAPTRepository下载 (mysql-apt-config_0.8.33-1_all.deb)按InstallingMySQLonLinuxUsingtheMySQLAPTRepository指导安装增加M......
  • oracle数据库SQL函数替换成mysql中的函数
    mysql:anddevice_typelikeCONCAT('%',#{deviceType},'%')oracle:anddevice_typelike'%'||#{deviceType}||'%'---------------------------------------------------------------------------oracle:####时间转字符串to_cha......
  • mysql5.5安装
    回忆一下mysql5.5安装配置方法,整理mysql5.5安装配置教程笔记,分享给大家。MySQL下载地址:http://dev.mysql.com/downloads/installer/1、首先进入的是安装引导界面2、然后进入的是类型选择界面,这里有3个类型:Typical(典型)、Complete(完全)、Custom(自定义)。这里建议 选择“自定......
  • 添加mysql 8.0的gpgkey
    在安装mysql8.0的存储库后,执行aptupdate的时候会出现报错:Err:1http://repo.mysql.com/apt/ubuntubionicInRelease                                                ......
  • mysql 可以删除 binlog 文件吗
    在MySQL中,可以删除binlog文件,以下是一些常见的删除方法及其注意事项:使用PURGE语句基本语法:可以使用PURGEBINARYLOGS语句来删除binlog文件。例如,PURGEBINARYLOGSTO'binlog.000010'; 会删除所有早于binlog.000010的binlog文件。另外,PURGEBINARYLOGSBEFORE'2023......
  • MySQL中的锁类型,乐观锁和悲观锁是什么
    MySQL中的锁类型丰富多样,可以根据不同的分类标准来划分。以下是对MySQL中锁类型的详细归纳,以及对乐观锁和悲观锁的具体解释:一、MySQL中的锁类型1.按锁的粒度划分表锁:开销小,加锁快;锁定力度大,发生锁冲突的概率高,并发度最低;不会出现死锁。行锁:开销大,加锁慢;会出现死锁;锁定粒......
  • MySQL概述和安装
    MySQL版本企业选择1、规范GA版本:稳定的发布版本2、版本类型E:企业版,收费版本,SR,偏传统行业C:社区版,开源版本,互联网企业的选择3、企业版本选择一般新上的环境,会选择GA6-12月版本4、企业主流版本5.6版本:5.6.345.6.365.6.38(Sep13,2017) 5.6.405.7版本:5.7.20(Sep......
  • MySQL日志体系的深度解析:功能与差异
    优质博文:IT-BLOG-CN一、binlogbinlog记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select。存储着每条变更的SQL语句和XID事务Id等等。binlog日志文件如下:[root@192.168.10.11]#mysqlbinlogmysql-binlog.0000012..........#at......
  • MySQL DBA需要掌握的 7 个问题
    1. MySQL适用的场景是什么?数据量建议单实例T级或以内,不依赖存储过程、函数、触发器的传统oltp场景都适用,因为是一个相对轻量级的数据库灾备使用MySQL各类的高可用方案即可,比如主从、mha、mgr等。2. MySQL巡检应该怎么做?优先关注哪些参数?可以从以下几个方面去做:服务器配......