-
SQL去重语句【distinct】和【group by】究竟用哪个?
2020-12-18 13:51:30一般是采用 distinct 或者 group by 进行去重操作 但是!!! 该用哪一个呢? distinct和group by的用法 俗话说:“知己知彼”,先了解它们的用法,才能知道在什么情况下用哪个 已经知道用法的,可以直接跳过这一节...
我是帮助主人快速定位的目录录~
问题抛出
当一个表中有重复数据时,该怎么在查询时去重呢?
一般是采用 distinct 或者 group by 进行去重操作
但是!!!
该用哪一个呢?distinct和group by的用法
俗话说:“知己知彼”,先了解它们的用法,才能知道在什么情况下用哪个
已经知道用法的,可以直接跳过这一节啦~distinct
select distinct 字段[,字段2,...] from 表
- distinct可以对一个字段或多个字段进行去重
- distinct必须在select后的首位
- distinct后面的所有字段都会作为去重的字段,即使字段由()括起来
-- 只有field1和field2都重复时,才认为其是重复数据 -- 例如上图的第一条和第十条数据就是重复数据 select distinct field1,field2 from testDistinct; select distinct (field1),field2 from testDistinct;
运行结果(第一条和第二条的运行结果相同):
只是将第十条数据去掉了,field1字段还是有多个重复数据
你不会还以为第二条语句的执行结果是这个吧(偷笑.jpg):
group by
select * from 表 GROUP BY 字段[,字段2,...];
- group by可以对一个字段或多个字段进行分组(变相去重)
- 查询的字段和分组的字段互不影响,即可以查询所有字段,但只对某个字段进行去重
distinct也可以实现这个效果,只是需要子查询等方式
将distinct查询的去重后的数据作为条件再次查询表,得到想要的字段group by本身是分组的,它的 “不务正业” 也说明了 “代码是死的,人是活的” 这句话,嘿嘿
它能够去重,是利用了它 只显示同组的第一条数据 这个特性
例如:select * from testDistinct GROUP BY field1;
结果:
发现:field1为1的数据本来有很多条,但是只剩下第一条数据。用哪个?
了解了 distinct 和 group by 的用法,就该聊聊怎么用了
两者各有千秋- distinct适合各种重复数据去重,只是查询显示数据和去重不能同时做。毕竟有时候我想要看到的字段不全是需要查重的字段
- group by适合做分类统计
– 例如一个班级表,一个班级对应多个学生,我想要知道有多少个班级
– 也适合查询和去重一步到位,但是一般要以两个字段为条件,毕竟group by只会显示一组里的一条数据,你需要做的是让group by认为每条正常不重复的数据就是一组
举个例子吧~
下面是学校的某张表,记录了每个年级有几个班
第5条是重复数据(失败数据,没有任何用)
需求:
把重复数据(第5条)去掉select type_id, type_name, sonType_id, sonType_name from testTable GROUP BY type_id,sonType_id;
小弟无能,distinct的语句没法写出来,有能实现的,可以留言,感谢ATA -
SQL语句distinct去重使用方法
2019-08-15 16:08:57很多时候数据库查出来的数据会出现重复的情况。 不过这些情况用distinct就可以解决。 表A: id name 1 a ...1.对于单列的去重 select distinct name from A 执行之后的结果: nam...很多时候数据库查出来的数据会出现重复的情况。
不过这些情况用distinct就可以解决。表A:
id name 1 a 2 b 3 c 4 b 1 a 表B:
province city 河北省 石家庄市 河北 省石家庄市
1.对于单列的去重
select distinct name from A
执行之后的结果:
name a b c
2.对于多列的去重
实例1:
select distinct id,name from A
执行之后的结果如下:
id name 1 a 2 b 3 c 4 b 实例2:
select distinct province,city from B
执行之后的结果:
province city 河北省 石家庄市 河北 省石家庄市 由此可见,distinct去重是根据每一列进行去重,作用于province 和 city 两个字段,不是province 和 city 两列“字符串拼接”后再去重的。
distinct规范
distinct必须写在字段前面。
select id,name distinct from A
这样写就会报错。
-
declare sql语句_SQL去重是用DISTINCT好,还是GROUP BY好?
2020-11-26 12:39:33点击上方SQL数据库开发,关注获取SQL视频教程SQL专栏SQL基础知识汇总SQL高级知识汇总我们知道DISTINCT可以去掉重复数据,GROUP BY在分组后也会去掉重复数据,那这两个关键字在去掉重复数据时的效率,究竟谁会更高...点击上方SQL数据库开发,关注获取SQL视频教程
SQL专栏
SQL基础知识汇总
SQL高级知识汇总
我们知道DISTINCT可以去掉重复数据,GROUP BY在分组后也会去掉重复数据,那这两个关键字在去掉重复数据时的效率,究竟谁会更高一点?
1.使用DISTINCT去掉重复数据我们先看下面这个例子:
SELECT DISTINCT UnitPrice
FROM [Sales].[SalesOrderDetail]
WHERE UnitPrice>1000;执行完之后的结果如下:
接下来,我们将这个表里的数据增大到194万条,再重复上面的实验。
--将表SalesOrderDetail插入到一张物理表中
SELECT * INTO Sales.Temp_SalesOrder
FROM [Sales].[SalesOrderDetail] ;
--通过新增的物理表进行自循环插入3次,将数据增加到1941072行
DECLARE @i INT;
SET @i=0
WHILE @i<4
BEGIN
--这里没有将SalesOrderDetailID这个自增长的放在列中,是为了让系统自动填充不同的数字进去,保证唯一性。
INSERT INTO Sales.Temp_SalesOrder
(SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,rowguid,ModifiedDate)
SELECT
SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,NEWID(),ModifiedDate
FROM Sales.Temp_SalesOrder
SET @i=@i+1;
END;
SELECT COUNT(1) FROM Sales.Temp_SalesOrder;(提示:可以左右滑动代码)
将SalesOrderDetailID的自增长属性取消掉之后,插入1000条自身的数据,这样我们就可以得到1000条重复的SalesOrderDetailID,相比1942072条记录占比很小了
如下图,将自增长标识的是换成否后即可插入了。
INSERT INTO sales.Temp_Salesorder
SELECT TOP 1000 * FROM sales.Temp_Salesorder;数据插入完整后,我们在将上一讲的内容重复一下,看看效果如何?
A.在没建索引的情况下,我们只查询UnitPrice这一列
SELECT UnitPrice FROM Sales.Temp_SalesOrder ;
我们看一下执行情况:
接下来是鉴证奇迹的时刻了,我们加DISTINCT在UnitPrice前面试试
SELECT DISTINCT UnitPrice FROM sales.Temp_Salesorder;
和之前的实验结果一致,在执行时间没有多大差别的情况下,分析时间成倍的减少了。
B.当SalesOrderDetailID取消掉自增长属性后就和普通列一样了。
我们来重复上面的步骤:
SELECT SalesOrderDetailID FROM sales.Temp_Salesorder
执行完后结果如下:
与上面的UnitPrice没使用DISTINCT情况基本一致。
然后我们给SalesOrderDetailID加上DISTINCT后会怎么样呢?
SELECT DISTINCT SalesOrderDetailID
FROM sales.Temp_Salesorder我们可以看到如下执行情况:
从上图可以看到,DISTINCT已经排除了1000条记录,但是在执行时花的时间比没加DISTINCT更久了。
通过上述两个实验,我们可以得出这样一条结论:在重复量比较高的表中,使用DISTINCT可以有效提高查询效率,而在重复量比较低的表中,使用DISTINCT会严重降低查询效率。所以并不是所有的DISTINCT都是降低效率的,当然你得提前判断数据的重复量。
2.GROUP BY与DISTINCT去掉重复数据的对比
GROUP BY与DISTINCT类似,经常会有一些针对这两个哪个效率高的争议,今天我们就将这两个在不同重复数据量的效率作下对比。
A.重复数据量多的情况下,对UnitPrice进行去重
SELECT DISTINCT UnitPrice FROM sales.Temp_Salesorder;
SELECT UnitPrice FROM sales.Temp_Salesorder GROUP BY UnitPrice;将上述两条语句一起执行,结果如下:
可以看出两条语句对应的执行时间GROUP BY比DISTINCT效率高一点点。
B.重复数据量少的情况下,对SalesOrderDetailID进行去重
SELECT DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
SELECT SalesOrderDetailID FROM sales.Temp_Salesorder
GROUP BY SalesOrderDetailID也是同时执行上述两条语句,其结果如下:
作者对上述语句同时执行多次,针对重复量多的UnitPrice,GROUP BY总的处理效率比DISTINCT高一点点,但是针对重复量低的SalesOrderDetailID,DISTINCT就比GROUP BY快一点了,而如果随着整体数据量的增加,效果会越来越明显。
今天的内容就讲到这里,小伙伴可以动手尝试一下。如有不明白的可以在下方留言一起探讨。
——End——
后台回复关键字:1024,获取一份精心整理的技术干货后台回复关键字:进群,带你进入高手如云的交流群。推荐阅读
一款免费比Navicat还要好用,功能强大的数据库管理工具
GitHub上最励志的计算机自学教程
刚刚用华为鸿蒙跑了个“hello world”!
SQL学习路线图,首次公开
思科前员工删库跑路,损失达 1600 多万
孙悟空无姓无名的时候,阎王生死簿是怎么写的呢?
这是一个能学到技术的公众号,欢迎关注
点击「」了解SQL训练营
-
SQL语句distinct的多个字段去重问题
2018-09-13 14:52:25select distinct name, id from table 或者 select name,id from table group by name 像这样是错误的写法,distinct不起作用的 曲线救国写法: select name,id from table where id in ( select min(id) ...经典例子
select distinct name, id from table
或者
select name,id from table group by name
像这样是错误的写法,distinct不起作用的
曲线救国写法:
select name,id from table where id in (
select min(id) from table group by name
)
思想:将需要去重的字段添加到where条件中,取出唯一id
然后就可以获得去重之后的两个字段了
不过我这边是你需要去重一个字段,展示两个字段的情况
还可以看如下文章
-
select去重 sqlserver_sql语句怎么去重保留一条记录
2020-12-29 15:40:29sql语句如何去重保留一条记录啊我有一个表,里面有一列里的数据有重复,可能重复有两条或以上,有的只有一条记录,但是sql语句如何实现把重复的删掉并且保留一条记录?------最佳解决方案--------------------1、... -
sql-distinct去重语句
2018-10-29 15:14:12select distinct(name) from exercise; select distinct(name),myorder from temp.exercise; select distinct(name),myorder,time from temp.exercise; select distinct name,myorder,time from temp.... -
sql语句之distinct去重
2020-07-24 15:56:07关于去重,首先我想到的是distinct关键字 1,作用于单列去重 SELECT distinct(wg.id) FROM ws_goods wg LEFT JOIN ws_good_price gp ON gp.goodsId = wg.id WHERE wg.goodsCategoryOneId = 74 AND wg.... -
问个去重的sql语句,不是distinct能解决的
2018-08-16 16:56:52比如有以下数据表 name type aaa 1,2,3,1 bbb 2,2,3 我想把type里出现的重复数据去除,得到 name type aaa 1,2,3 bbb 2,3 -
sql语句去重distinct、统计(count、sum)
2020-12-24 11:46:441、查询数组并去重用distinct()函数 select distinct(字段名) from 表名 2、count(*) 和 sum() (1)、count(*) 函数是用于统计数据的条数 select count(*) as count from A where id>0 (2)、sum() 统计某个... -
sql数据库去重语法_数据库去重语句
2021-01-15 03:41:48sql语句去重sql语句通过DISTINCT关键字去重, 用于返回唯一不同的值。DISTINCT关键字需要搭配SELECT 语句使用,语法为SELECT DISTINCT 列名称 FROM 表名称。如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就... -
sql语句distinct的用法
2019-05-18 22:40:39在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同...(比如订单或者是想要查看所有订单中的用户id,此时一个用户可能有多个纪录,所以用与去重,不然通过其他方法再去重很麻烦) ... -
mysql中sql语句去重_mysql 查询语句去重 通过sql去重
2021-01-28 00:28:03url 在表中具有唯一性;由于定时任务的多进程/代码的多...SELECT COUNT(1) FROM test_error_tmpUNION ALLSELECT COUNT(DISTINCT url) FROM test_error_tmp;COUNT(1)4097240910差62SELECT * FROM (SELECT COUNT(1) ... -
SQL DISTINCT 去重
2019-04-10 23:01:11SQL DISTINCT 去重 DISTINCT : 去重复,去掉重复的数据,在查询语句中使用。 如图: user表 将uid去重后 SELECT DISTINCT uid , name FROM `user` -
sqlserver去重记录_sqlserver 去重查询distinct
2020-12-24 13:39:18比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。select distinct name from table得到的结果是:nameac好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:s... -
SQL去重distinct方法解析
2019-02-23 13:50:00一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,...2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UP... -
Oracle数据去重(不是distinct)
2016-09-27 11:37:42常用的Sql * Plus 命令: -show user;//显示当前进行连接的用户名 -show parameter db_name;//显示当前操作的数据库名 -conn [ect];//连接数据库 -desc[ribe] 对象名;//查看指定对象的详细信息 第二章:简单语句... -
SQL server 常用语句,去重distinct用法
2020-03-30 11:47:34使用SQL server 数据库也有好多年,现在还在用!...(1)查询语句数据,进行去重 (估计很多都懂) select distinct * from table (2)删除表重复记录(所有字段重复,记录保留1条) ,使用临时表方式: ... -
SQL 去重不用distinct如何实现?
2017-07-10 20:48:271、今日面试问到SQL语句去重关键字?一时只想起来distinct【果然一定要注意总结啊 答:用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会... -
Mysql常用sql语句(4)- distinct 去重数据
2020-05-09 18:07:00测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 我们使用select进行数据查询时是会返回所有匹配的记录,如果表中某些字段没有做唯一性约束,那么这些字段的值就可能... -
mysql中sql语句去重_MySQL常用sql语句-----数据表的查询操作
2021-02-02 03:31:171.查询指定字段select c_id,c_age,c_name from t_student;select c_id as 编号,c_name as 姓名,c_age...2.去重查询select distinct c_address from t_studentselect distinct c_address,c_name from t_student3.比较... -
sql语句按照字段去重
2019-08-01 11:37:27DISTINCT sql语句按照字段去重 引用自:https://www.w3school.com.cn/sql/sql_distinct.asp 2019年8月1日 11:37:26 -
[绍棠] SQL去重distinct方法解析
2020-01-13 09:39:42一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,...2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UP... -
sql语句去重
2018-07-27 16:03:41这是最简单的一种情况,用关键字distinct就可以去掉 example: select distinct * from table(表名) where (条件) CREATE TABLE 临时表 AS (select distinct * from 表名); drop table 正式表; insert...