avatar

正进一步

只有喜欢,才会全情投入,才会成功!!!

不关注架构设计细节的程序员不是一个好架构师

  • Home
  • Tags
  • Categories
  • Archives
  • 2018寄语
日进一步_Group_By与分组过滤Having学习

WHERE过滤行,而HAVING过滤分组。HAVING支持所有WHERE操作符,HAVING子句中能使用聚集函数。WHERE在数据分组前进行过滤。HAVING在数据分组后进行过滤
where 可以单独用. having 必须跟group by一起用.
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
当在查询中没有使用GROUP BY子句时,数据库就把数据表 中的所有行为作为一个组来处理


1
2
3
select sno,count(pno) from sc where grade>=90 group by sno having count(pno)>=2
select customer from orders group by customer having sum(orderPrice)<2000
select customer,sum(orderPrice) from orders where customer in ('Bush','Adams') group by customer having sum(orderPrice)>1500
1
2
3
4
5
6
select from_unixtime(ctime,'%Y-%m-%d') as dorderby,count(ctime)  as count
from order
where ctime > 1511712000 and status not in (3,9,18,20,30) and serv_type=0
group by from_unixtime(ctime,'%Y-%m-%d')
having count(ctime)>150
order by dorderby desc

group by可以可以使用函数; 并且可以将这个参数应用到select中.
order by 使用的列的名字是对结果集和默认中选出来的.

Group_By和Having_Where_Order_by语句的执行顺序

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

首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数),

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