(转)数据库 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
a
b
c
d
e;
select id from A group by id;
id
a
b
c
d
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需要读取的记录数量与分组的组数量一样多,也就是说比实际存在的记录数目要少很多。
(转)数据库 distinct 和 group by 的区别的更多相关文章
- mysql下distinct和group by区别对比
在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...
- 总结distinct、group by 、row_number()over函数用法及区别
distinct和group by 是一样的,查询去重,只能是全部重复的,也可以理解为针对单例,因为一行有一个字段不一样,他们就会认为这两行内容是不重复的.但是使用row_number()over这个 ...
- DISTINCT 与 GROUP BY 的比较
看了很多文章,这两个SQL语句在不同的数据库上面的实现上可能有相同或有不同,但是应当要明确它们在功能概念上的区别,最终得出结论: GROUP BY 用来使用聚集函数获得值,比如 AVG, MAX, M ...
- count(distinct) 与group by 浅析
x在传统关系型数据库中,group by与count(distinct)都是很常见的操作.count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都 ...
- 关于distinct 和group by的去重逻辑浅析
在数据库操作中,我们常常遇到需要将数据去重计数的工作.例如: 表A,列col A C A B C D A B 结果就是一共出现4个不同的字母A.B.C.D 即结果为4 大体上我们可以选择count(d ...
- over partition by与group by 的区别
(本文摘自scottpei的博客) over partition by与group by 的区别 今天看到一个老兄的问题, 大概如下: 查询出部门的最低工资的userid 号 表结构: D号 ...
- MySQL中distinct和group by性能比较[转]
MySQL中distinct和group by性能比较[转] 之前看了网上的一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论(仅在个人计算机上测试,可能不全面,仅供参考) 测试过程: 准备一张 ...
- mysql distinct跟group by性能
mysql distinct和group by性能 1,测试前的准备 //准备一张测试表 mysql> CREATE TABLE `test_test` ( -> `id` int ...
- 数据库水平拆分和垂直拆分区别(以mysql为例)
数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例) 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据 ...
随机推荐
- 重新认识Intent
相信android开发工程师,对Intent一定不陌生,在整个开发中随时都用到了,今天我们总结一下Intent. 1. 为什么需要Intent? 在android Intent机制是协助应用间的交互与 ...
- AngularJs练习Demo13Provider_factory
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- 树形dp hdu1561
有的堡垒攻克需要攻克另一个堡垒,形成一个森林,最多攻克m个堡垒,求获得宝物的最大价值. 1,以0做根将森林形成树: 2,用背包计算当前节点下需要攻克k个堡垒能获得的宝物最大价值,但是注意同一个根节点的 ...
- IIS自定义404错误页显示“系统找不到指定的文件”解决方法
在IIS站点属性里面设置了自定义的404错误页面为一个文件之后,有时一直不生效,总是提示这样一句话:“系统找不到指定的文件”. 其实这种错误也只是在某些网站程序中出现,其实解决办法很简单.这是由于II ...
- CVE-2014-3153 com.geohot.towelroot
futex-prevent-requeue-pi-on-same-futex.patch futex: Forbid uaddr == uaddr2 ) If uaddr == uaddr2, the ...
- 一个poi操作实现导出功能的类
public class ExportExcel<T> { public void exportExcel(Collection<T> dataset, OutputStrea ...
- OC .(点)与->(箭头)用法区别
这两天同学总是问OC里.和->的用法区别,当时回答的不是很好,周末查了一下,大概清楚了,在这里记录一笔. 先看这个例程 #import <Foundation/Foundation.h&g ...
- BeanUtils框架浅析
一.使用步骤: 1.添加jar包: commons-beanutils-1.8.0.jar commons-logging.jar 2.使用setProperty()方法对javabean设置属性值 ...
- android手机端保存xml数据
1.前面写的这个不能继续插入数据,今天补上,当文件不存在的时候就创建,存在就直接往里面添加数据. 2.代码如下: <pre name="code" class="j ...
- AMS1117典型电路
AMS1117(3.3V.5V) 封装: 常见应用连接: 1.输入旁路电容Input Bypass Capacitor:A 10uF tantalum on the input is a suitab ...