5.4 GROUP BY和HAVING子句

GROUP BY子句和HAVING子句同WHERE不一样,它们两个都用于组的查询。使用分组查询可以统计数据,例如利用GROUP BY配合分组函数,可以同时查询出每种类型产品的平均价格。至于什么是分组函数(集合函数),在第6章会做介绍。

5.4.1 GROUP BY子句语法及使用

GROUP BY用于归纳汇总相关数据,它不属于WHERE子句。也就是说,GROUP BY子句可以直接在FROM后面,也可以在WHERE条件后面。它在5.1.1小节基本语法中的表示方式是group_by_clause,下面把它细分。细分后的语法格式如下:


GROUP BY

{expr

|{ROLLUP|CUBE}({expr[,expr]…})

}


【语法说明】

❑expr:通常表示数据库列名。

❑ROLLUP|CUBE:GROUP BY子句的扩展,可以返回小计和总计记录。

GROUP BY语句和分组函数一起使用,它可以根据某一列进行分组,也可以根据某几列进行分组。

【示例24】根据某一个字段分组查询

计算出不同类型产品的平均价格。脚本如下:


SELECT category,AVG(productprice) 平均价格 FROM productinfo GROUP BY category;


【执行效果】

执行效果见图5.25。

5.4 GROUP BY和HAVING子句 - 图1

图 5.25 根据一列分组

【示例25】根据多个字段分组

根据不同产地,计算不同类型产品的平均价格。脚本如下:


SELECT category 产品类型编码,AVG(productprice) 平均价格,origin 产地 FROM productinfo GROUP BY category,origin;


【执行效果】

执行效果见图5.26。

5.4 GROUP BY和HAVING子句 - 图2

图 5.26 根据多个字段分组

虽然GROUP BY子句不允许出现在WHERE子句中,但是允许出现在WHERE子句后面。也就是说,被分组的数据是经过WHERE子句筛选过的。

【示例26】WHERE条件和分组混用

根据不同产地,计算价格高于1000的、不同类型产品的平均价格。脚本如下:


SELECT category,AVG(productprice) 平均价格,origin FROM productinfo WHERE productprice>1000 GROUP BY category,origin;


【执行效果】

执行效果见图5.27。

5.4 GROUP BY和HAVING子句 - 图3

图 5.27 WHERE条件和分组混用

GROUP BY子句是统计数据时常用的语句,使用该子句时有以下几点需要注意:

❑当查询中存在GROUP BY子句时,SELECT列表中只能存在分组函数,或出现在GROUP BY子句中的字段。

❑GROUP BY子句不允许出现在WHERE条件中,但允许出现其后,也就是可以和WHERE条件并列使用。