我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL去重中distinct和group by的区别浅析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL去重中distinct和group by的区别浅析

今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字。于是一小时过去了。。。。(菜鸟一个,大家轻点骂)

我把问题的过程用sql语句演示给大家演示一下

首先我使用的是myBATis-plus,代码如下

QueryWrapper<ProjectCompany> wrapper = new QueryWrapper<>();
        wrapper.select("DISTINCT project_id,company_id,company_name,is_delete").eq("project_id",projectId).eq("is_delete","0");

即     "DISTINCT project_id,company_id,company_name,is_delete" 

查出的结果

MySQL去重中distinct和group by的区别浅析

id=null。这是我不希望看到的。没有id的话,下面的业务就不好走了。

于是我在distinct后面加上了id,distinct查出来的数据就是全部数据了,相当于distinct没起作用。冥思苦想一小时。。。。

后来想到了group by分组,于是用了一下

LambdaQueryWrapper<ProjectCompany> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ProjectCompany::getProjectId,projectId).eq(ProjectCompany::getIsDelete,"0").groupBy(ProjectCompany::getProjectId);

发现查出来的数据也进行去重了,id也有值

所以就很好奇 distinct和group by有啥区别,大概总结以下几点:

distinct适合查单个字段去重,支持单列、多列的去重方式。 单列去重的方式简明易懂,即相同值只保留1个。 
多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。

而 group by 可以针对要查询的全部字段中的部分字段去重,它的作用主要是:获取数据表中以分组字段为依据的其他统计数据。

补充:mysql中distinct和group by去重性能对比

前言

  • MySQL:5.7.17
  • 存储引擎:InnoDB
  • 实验目的:本文主要测试在某字段有无索引、各种不同值个数情况下,记录对此字段其使用DISTINCT/GROUP BY去重的查询语句执行时间,对比两者在不同场景下的去重性能,实验过程中关闭MySQL查询缓存。
  • 实验表格:
表名记录数查询字段有无索引查询字段不同值个数DISTINCTGROUP BY
tab_1100000N3  
tab_2100000Y3  
tab_3100000N10000  
tab_4100000Y10000  

实验过程

1)创建测试表

表创建语句:

DROP TABLE IF EXISTS `tab_1`;
CREATE TABLE `tab_1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tab_2`;
CREATE TABLE `tab_2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `tab_3`;
CREATE TABLE `tab_3` LIKE `tab_1`;

DROP TABLE IF EXISTS `tab_4`;
CREATE TABLE `tab_4` LIKE `tab_2`;

2)生成测试数据

表数据插入过程:

DROP PROCEDURE IF EXISTS generateRandomData;
delimiter $$
-- tblName为插入表,field为插入字段,num为插入字段值上限,count为插入的记录数
CREATE PROCEDURE generateRandomData(IN tblName VARCHAR(30),IN field VARCHAR(30),IN num INT UNSIGNED,IN count INT UNSIGNED)
BEGIN
	-- 声明循环变量
	DECLARE i INT UNSIGNED DEFAULT 1;
	-- 循环插入随机整数1~num,共插入count条数据
	w1:WHILE i<=count DO
		set i=i+1;
		set @val = FLOOR(RAND()*num+1);
		set @statement = CONCAT('INSERT INTO ',tblName,'(`',field,'`) VALUES(',@val,')');
		PREPARE stmt FROM @statement;
		EXECUTE stmt;
	END WHILE w1;
END $$
delimiter ;

调用过程随机生成测试数据:

call generateRandomData('tab_1','value',3,100000);
INSERT INTO tab_2 SELECT * FROM tab_1;

call generateRandomData('tab_3','value',10000,100000);
INSERT INTO tab_4 SELECT * FROM tab_3;

3)执行查询语句,记录执行时间

查询语句及对应执行时间如下:

SELECT DISTINCT(`value`) FROM tab_1;
SELECT `value` FROM tab_1 GROUP BY `value`;

SELECT DISTINCT(`value`) FROM tab_2;
SELECT `value` FROM tab_2 GROUP BY `value`;

SELECT DISTINCT(`value`) FROM tab_3;
SELECT `value` FROM tab_3 GROUP BY `value`;

SELECT DISTINCT(`value`) FROM tab_4;
SELECT `value` FROM tab_4 GROUP BY `value`;

4)实验结果

表名记录数查询字段有无索引查询字段不同值个数DISTINCTGROUP BY
tab_1100000N30.058s0.059s
tab_2100000Y30.030s0.027s
tab_3100000N100000.072s0.073s
tab_4100000Y100000.047s0.049s

实验结论

MySQL 5.7.17中使用distinct和group by进行去重时,性能相差不大

实验过程及结论,如有不足之处,欢迎指正,此实验结论仅供参考。

总结

到此这篇关于MySQL去重中distinct和group by区别浅析的文章就介绍到这了,更多相关MySQL去重distinct和group by区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL去重中distinct和group by的区别浅析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL去重中distinct和group by的区别浅析

今天无意中听到有同事在讨论,distinct和groupby有什么区别,下面这篇文章主要给大家介绍了关于MySQL去重中distinct和group by区别的相关资料,需要的朋友可以参考下
2022-11-13

MySQL中distinct和group by去重效率区别浅析

目录一、distinct二、group by三、distinct 和 group by 比较总结一、distinctdistinct的作用在mysql中,distinct关键字的主要作用就是对数据库表中一个或www.cppcns.com
2023-03-03

MySQL中distinct和group by去重效率区别浅析

distinct与groupby均可用于去重,下面这篇文章主要给大家介绍了关于MySQL中distinct和group by去重效率区别的相关资料,文中介绍的非常详细,需要的朋友可以参考下
2023-03-03

Mysql: distinct去重 group by的区别

单纯的去重操作使用distinct,速度是快于group by的。 distinct支持单列、多列的去重方式。  单列去重的方式简明易懂,即相同值只保留1个。  多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。
Mysql: distinct去重 group by的区别
2018-10-31

MySQL中distinct和group by去重效率区别是什么

本篇内容介绍了“MySQL中distinct和group by去重效率区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、disti
2023-07-05

MySQL 中 SELECT DISTINCT 与 GROUP BY 的区别?

SELECT DISTINCT 可用于给出不同的值。用它来删除重复的记录并它也可以与聚合函数一起使用。例如:MAX、AVG等。这个都可以应用在单个列上。现在,我正在创建一个表以对列使用 SELECT DISTINCT。创建一个表CRE
2023-10-22

Hive数据去重的两种方式 (distinct和group by)

目录1.distinct消除重复行2.group by 分组语句3.区别总结实现数据去重有两种方式 :distinct 和 group by1.distinct消除重复行distinct支持单列、多列的去重方式。单列去重的方式简明易懂
2023-01-03

Hive数据去重的两种方式 (distinct和group by)

数据库中表存在重复数据,需要清理重复数据,下面这篇文章主要给大家介绍了关于Hive数据去重的两种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-03

JavaScript中? ?、??=、?.和 ||的区别浅析

在 JS 中,?? 运算符被称为非空运算符,下面这篇文章主要给大家介绍了关于JavaScript中? ?、??=、?.和 ||区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

浅析Mysql和Oracle分页的区别

目录mysql使用limit进行分页oracle使用rownum进行分页Mysql与Oracle级联查询Mysql省市区级联查询Mysql与Oracle插入数据存在修改不存在新增MySQL使用limit进行分页select * from
2022-12-07

Android中WebChromeClient和WebViewClient的区别浅析

1、WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:onLoadResource 、onPageStart 、onPageFinish 、onReceiveError 、onReceivedHttpA
2022-06-06

浅析git中push和commit的区别

在Git中,push和commit是两个非常重要的术语,它们都是版本控制系统中的操作命令。但是,这两个命令之间存在一些区别。本文将会介绍Git push和commit的区别。Git Commit在Git中,commit是指将更改记录在本地存
2023-10-22

编程热搜

目录