MySQL中distinct和group by去重的区别

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 驱动研发模式升级,蓝凌软件探索效率提升之道

深圳市蓝凌软件股份有限公司(以下简称蓝凌软件),自2001年成立以来,一直走在数智化办公领域的前沿。作为国家认定的高新技术企业、知识管理国家标准的参编者以及信创供应商10强之一,蓝凌软件始终以“让组织更智慧”为使…

GPU 进阶笔记(四):NVIDIA GH200 芯片、服务器及集群组网

大家读完觉得有意义记得关注和点赞!!! 1 传统原厂 GPU 服务器:Intel/AMD x86 CPU NVIDIA GPU2 新一代原厂 GPU 服务器:NVIDIA CPU NVIDIA GPU 2.1 CPU 芯片:Grace (ARM)2.2 GPU 芯片:Hopper/B…

SpringMVC(二)原理

目录 一、配置Maven(为了提升速度) 二、流程&&原理 SpringMVC中心控制器 完整流程: 一、配置Maven(为了提升速度) 在SpringMVC(一)配置-CSDN博客的配置中,导入Maven会非…

jest使用__mocks__设置模拟函数不生效 解决方案

模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…

在K8S中,节点状态notReady如何排查?

在kubernetes集群中,当一个节点(Node)的状态变为NotReady时,意味着该节点可能无法运行Pod或不能正确相应kubernetes控制平面。排查NotReady节点通常涉及以下步骤: 1. 获取基本信息 使用kubectl命令行工具获取节点状态…

python3中推导式:列表推导式

一. 简介 python中的推导式,是一种简洁创建列表,字典,集合,元组等数据类型的方式。本文简单来学习一下,python中的列表推导式。 Python 支持各种数据结构的推导式:列表(list)推导式,字典(dict…

springboot集成qq邮箱服务

springboot集成qq邮箱服务 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。 1.3 获取授权码 进入上图中的【管理服务】后:在【安全设置中生成授权码】,也可以直接点击【继续生成…

UE4.27 Android环境下获取手机电量

获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…

解释dash中的layout = go.Layout( yaxis={domain: [0, 0.50]}, yaxis2={domain: [0.51

在 Dash 中,layout 是用来配置图表布局的重要对象,其中 go.Layout 是 Plotly 的布局类,用于设置图表的整体外观和属性。 您提供的代码片段是用来设置图表的 Y轴域(domain)范围 和 多Y轴布局 的。 代码解释 layout g…

Word2Vec解读

Word2Vec: 一种词向量的训练方法 简单地讲,Word2Vec是建模了一个单词预测的任务,通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow,现在假设spiked这个单词被删掉了,现在要预测这个位置原本的单词是…

VBA批量插入图片到PPT,一页一图

Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题,以及解决方案,原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览: …

【Linux报告】实训一:GNME桌面环境的设置及应用

实训一:GNME桌面环境的设置及应用 【练习1】在图形模式和文本模式下登录Linux系统。 1、开启Linux虚拟机。 答:打开此虚拟机如图所示 2、观察屏幕上显示的启动信息。 3、当系统启动到图形界面时,用普通用户身份登录。 答:如图…

【sql】CAST(GROUP_CONCAT())实现一对多对象json输出

数据库:mysql 5.7版本以上 问题:一对多数据,实现输出一条数据,并将多条数据转换成json对象输出,可以实现一对多个字段。 项目中关系较为复杂,以下简化数据关系如下: t1是数据表,t…

MySQL UNION

关于《MySQL UNION》的操作,我查找到了一些有用的信息。 MySQL的UNION操作符用于将两个或多个SELECT语句的结果组合到一个结果集中,并去除重复的行。每个SELECT语句的列数和对应位置的数据类型必须相同。其基本语法格式如下: SELECT column…

SQL 中的 EXISTS

我们先从 SQL 中最基础的 WHERE 子句开始。 比如下面这条 SQL 语句: 很显然,在执行这条 SQL 语句的时候,DBMS 会扫描 Student 表中的每一条记录,然后把符合 Sdept IS 这个条件的所有记录筛选出来,并放到结果集里面去…

《深度学习梯度消失问题:原因与解决之道》

在深度学习的训练过程中,梯度消失是一个常见且棘手的问题,它会严重影响模型的训练效果和性能。以下是对该问题的原因分析与解决办法。 梯度消失问题的原因 首先是激活函数选择不当。像Sigmoid和Tanh这类传统激活函数,在输入值较大或较小时&…

动态规划解决整数拆分问题

代码随想录链接:代码随想录 思路: (1).确定dp数组的含义: dp[i]:分拆数字i,可以得到的最大乘积为dp[i] (2).确定递推公式: dp[i]最大乘积是怎么得到: 其实可以从1遍历j,然后有两种渠道得到dp[i]. 一个是j * (i - j)直接相乘。 一个是j * dp[i - …

设计模式の状态策略责任链模式

文章目录 前言一、状态模式二、策略模式三、责任链模式 前言 本篇是关于设计模式中的状态模式、策略模式、以及责任链模式的学习笔记。 一、状态模式 状态模式是一种行为设计模式,核心思想在于,使某个对象在其内部状态改变时,改变该对象的行为…

无人机飞手培训机构大量新增,考取飞手证参军入伍还有优势吗?

尽管无人机飞手培训机构大量新增,考取飞手证参军入伍仍然具有显著优势。以下是对这一观点的详细阐述: 一、无人机飞手证在军队中的通用优势 1. 法规遵从与安全保障: 根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关法规&#xff0…