(转)数据库 distinct 和 group by 的区别

这两者本质上应该没有可比性,distinct 取出唯一列,group by 是分组,但有时候在优化的时候,在没有聚合函数的时候,他们查出来的结果也一样。 
举例来说可能方便一点。 
A表 
id num 
a 1 
b 2 
c 3 
a 4 
c 7 
d 3 
e 5

如果只选出id列,用distinct和group by 一样的。 
select distinct(id) from A; 
id 




e; 
select id from A group by id; 
id 




e; 
不同之处可能在于group by有排序功能。 
但是如果需要加上另一列num,结果不同。 
group by 是分组语句,如果用 
select id,num from A group by id,num; 
这样的结果在本例中与不加group by是一样的,因为num各个不同。 
但是如果 
select id,num from A group by id; 
注意该语句是错误语句,因为num没有使用聚组函数,例如:sum(求和),avg(求平均数) 
select id,sum(num) from A group by id; 
id sum(num) 
a 5 
b 2 
c 10 
d 3 
e 5

用distinct不显示重复的行。 
在本例中 
select distinct id,num from A;的结果也和不加distinct一致。 
因为id,num没有重复的行,而不是只看id。

group by 功能更强大一些,另外推荐使用group by。 
因为distinct会导致全表扫描,而group by如果索引建的

恰当的话,会有性能上的提高。

那DISTINCT 和GROUP BY哪个效率更高?

DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作还要为其他聚集函数进行准备工作。从这一点上将,GROUP BY操作做的工作应该比DISTINCT所做的工作要多一些。

但实际上,GROUP BY 效率会更高点,为什么呢?对于DISTINCT操作,它会读取了所有记录,而GROUP BY需要读取的记录数量与分组的组数量一样多,也就是说比实际存在的记录数目要少很多。

时间: 2024-12-28 23:04:55

(转)数据库 distinct 和 group by 的区别的相关文章

Mongodb中数据聚合之基本聚合函数count、distinct、group

在之前的文章<Mongodb中数据聚合之MapReduce>中,我们提到过Mongodb中进行数据聚合操作的一种方式--MapReduce,但是在大多数日常使用过程中,我们并不需要使用MapReduce来进行操作,不然有点杀鸡用牛刀的感觉,在这边文章中,我们就简单说说用自带的聚合函数进行数据聚合操作的实现. Mongodb中自带的基本聚合函数有三种:count.distinct和group.下面我们分别来讲述一下这三个基本聚合函数. (1)count 作用:简单统计集合中符合某种条件的文档数量

sum over用法,以及与group by的区别

1.sum over用法 sum(col1) over(partition by col2 order by col3 ) 以上的函数可以理解为:按col2 进行分组(partition ),每组以col3 进行排序(order),并进行连续加总(sum) 表a,内容如下: B   C  D 02 02 1 02 03 2 02 04 3 02 05 4 02 01 5 02 06 6 02 07 7 02 03 5 02 02 12 02 01 2 02 01 23 执行:SELECT   b

开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译)

开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表 浪天涯博主翻译: referential integrity 参考完整性transactions 事物unicode 统一码interface 命令 界面 接口data size db limit 数据库数据大小限制temporary table 临时表支持materialized view 物化视图(快照)indexes 索引union 联合查询intersect 交集查询except exce

数据库水平拆分和垂直拆分区别(以mysql为例)

数据库水平拆分和垂直拆分区别(以mysql为例) 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万 垂直拆分: 解决问题: 表与表之间的io竞争 不解决问题: 单表中数据量增长出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上 水平拆分: 解决问题: 单

sql中order by和group by的区别

order by 和 group by 的区别: 1,order by 从英文里理解就是行的排序方式,默认的为升序. order by 后面必须列出排序的字段名,可以是多个字段名. 2,group by 从英文里理解就是分组.必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段. 3,在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数.where条件用于group by之前,having用于group by 之后对结果进行筛选. 扩展资料: 一.ord

述 SQL 中的 distinct 和 row_number() over() 的区别及用法

1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,显示多条记录,这就有违咱们的初衷啦!因此,为了避免这种情况的发生,咱们就需要进行"去重"处理啦,那么何为"去重"呢?说白了,就是对同一字段让拥有相同内容的记录只显示一条记录. 那么,如何实现"去重"的功能呢?对此,咱们有两种方式可以实现该

详述 SQL 中的 distinct 和 row_number() over() 的区别及用法

1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,显示多条记录,这就有违咱们的初衷啦!因此,为了避免这种情况的发生,咱们就需要进行"去重"处理啦,那么何为"去重"呢?说白了,就是对同一字段让拥有相同内容的记录只显示一条记录. 那么,如何实现"去重"的功能呢?对此,咱们有两种方式可以实现该

SQL compute by 的使用 主要是针对与 GROUP BY 的区别

GROUP BY子句有个缺点,就是返回的结果集中只有合计数据,而没有原始的详细记录.如果想在SQL SERVER中完成这项工作,可以使用COMPUTE BY子句.COMPTE生成合计作为附加的汇总列出现在结果集的最后.当与BY一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总. 下列 SELECT 语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计: USE pubsSELECT type, price, advanceFROM 

关于SQL语句中的distinct和group by

两种都能实现去重功能.区别: distinct只是将重复的行从结果中出去: group by是按指定的列分组,一般这时在select中会用到聚合函数. distinct是把不同的记录显示出来 group by是在查询时先把纪录按照类别分出来再查询. group by 必须在查询结果中包含一个聚集函数,而distinct不用.