select查询中where、group by和having的作用时间介绍

来源:互联网 发布:python list加一列 编辑:程序博客网 时间:2024/05/16 01:39

select查询中可以同时出现wheregroup byhaving子句,本文通过一个例子进行介绍它们之间的区别和作用时间。

 

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分组后的结果在进行筛选。