SQL考虑的问题之sql中where/groupby/having/orderby顺序

SQL语句中的WHERE、GROUP BY、HAVING和ORDER BY执行顺序为:WHERE过滤数据,GROUP BY进行分组,HAVING筛选分组后的结果,最后ORDER BY进行排序。HAVING在聚合函数中使用,WHERE则不能。在GROUP BY后,COUNT(*)返回每组的记录数而非总条数。ORDER BY不能对GROUP BY后的结果直接排序,必须先用HAVING或子查询。

sql语句中 Group By , Having, Where ,Order by执行顺序

1.Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。

首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数)
然后通过Group By关键字后面指定的分组条件将筛选得到的视图进行分组

接着系统根据Having关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉
最后按照Order By语句对视图进行排序,这样最终的结果就产生了。
在这四个关键字中,只有在Order By语句中才可以使用最终视图的列名,如:

SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount
FROM T_TEST_FRUITINFO
WHERE (ProductPlace = N'china')
ORDER BY IDE
这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。

2.需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下: 
执行where子句查找符合条件的数据; 
使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。 
having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。 
having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

3.在group by 中用count(*) 获取条数 ,你会很神奇的发现你获取的不是总条数,而是每个组的条数,count(*)的结果是分组以后每组中的记录的条数,而不是分组的数目,但是如果你要获取总条数的话就会很麻烦,

group by 获取总记录数

适用于没有having的条件情况

select count(distinct(column)) from table #可以用到索引

子查询

select count(*) from (select dealer_id  from card GROUP BY dealer_id)as tmp;

group by 里面的count是指每个分组里面的数量

1

select count(*) as tmp from table group by ziduan having tmp>2

 用ziduan分组,把分组中数量大于2的选出来 having tmp>2

1

select count(*) as tmp from table group by ziduan order by tmp desc limit 1

  用ziduan分组,把分组中数量最大的一组选出来,  用分组里面的个数排序

参考:https://blog.youkuaiyun.com/niusi1288/article/details/94040017

 

sql中where/groupby/having/orderby顺序

分析sql语句的执行顺序

SELECT col_a/(*)/(聚合函数) FROM tb WHERE 条件 
GROUP BY col_a HAVING COUNT(*)>5 ORDER BY sum DESC
LIMIT 10;

一般,WHERE在前,GROUP BY在后,即先进行筛选,然后进行分组;

HAVING只能跟在GROUP BY之后,对分组后的聚合结果进行筛选;HAVING的前提是分组;WHERE在最前,最先对原始数据进行一遍筛选;

WHERE的条件里只能用已有的列进行条件判断,不允许使用聚合函数。HAVING之后可以允许使用聚合函数;

聚合函数包括count(),sum(),avg(),max(),min()

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。

例子

SELECT A.name,COUNT(order_number) AS count_sum
FROM orders A, customer B
WHERE A.coustomer_id=B.id
GROUP BY customer_id
HAVING COUNT(order_number)>5
ORDER BY count_sum DESC
LIMIT 5;

或者(等价于)

SELECT A.name,COUNT(order_number) AS count_sum
FROM orders A, customer B
WHERE A.coustomer_id=B.id
GROUP BY customer_id
HAVING count_sum>5
ORDER BY count_sum DESC
LIMIT 5;

参考:https://link.jianshu.com/?t=http://blog.youkuaiyun.com/superhosts/article/details/39298529

参考:https://www.jianshu.com/p/42cf6f5b30c1

 

mysql 中order by 与group by的顺序

ysql 中order by 与group by的顺序 是:

select
from
where
group by
order by

 

注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。

例:

select sum(click_num) as totalnum,max(update_time) as update_time,count(*) as totalarticle from article_detail where userid =1 group by userid order by update_time desc

 

转载自:http://blog.youkuaiyun.com/huoshi5151/article/details/8580364

参考:https://blog.youkuaiyun.com/yong472727322/article/details/78960402

 

sql语句select group by order by where一般先后顺序

写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...参考:https://blog.youkuaiyun.com/qq_23864697/article/details/80765371

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值