select查询中可以同时出现where、group by和having子句,本文通过一个例子进行介绍它们之间的区别和作用时间。
Book表中的数据如下:
对Book表执行如下查询:
select 类别, AVG(定价) from Book
where 出版社 = '机械工业出版社'
group by 类别
having AVG(定价)>40
该查询的执行顺序如下:
(1)首先,使用where中的条件对Book表的元组进行筛选,然后投影select后面出现的列,此时得到的一个临时结果如下图:
(2)然后,使用group by子句中的“类别”字段对结果分组,结果如下图:
接下来,计算三个类别各自的平均价格,得到结果如下图:
(3)最后,使用having子句中的条件对上面的结果进行筛选,从中选择平均价格大于40的元组。最后的查询结果如下图:
having是对group by分组后的结果在进行筛选,因此,在having子句中也可以出现不是聚合函数的条件。
如
select 类别, AVG(定价) from Book
where 出版社 = '机械工业出版社'
group by 类别
having 类别 = '计算机'
结果如下:
总结:
(1)where中的条件是对数据源的元组进行筛选。
(2)group by对筛选的结果进行分组,分组后再对where后的聚合函数进行统计。where子句后面的字段如果不在聚合函数中,一定要出现在group by的后面,而group by后面的字段可以不出现在where后。
(3)having是对group by分组后的结果在进行筛选。
本文详细介绍了SQL查询中where、group by和having子句的使用和执行顺序。通过实例展示了它们如何筛选数据、进行分组统计以及在聚合结果上进行过滤。where子句用于初步筛选数据,group by对筛选结果进行分组,having则在分组后对结果进行进一步筛选。

1912

被折叠的 条评论
为什么被折叠?



