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.25 根据一列分组
【示例25】根据多个字段分组
根据不同产地,计算不同类型产品的平均价格。脚本如下:
SELECT category 产品类型编码,AVG(productprice) 平均价格,origin 产地 FROM productinfo GROUP BY category,origin;
【执行效果】
执行效果见图5.26。
图 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.27 WHERE条件和分组混用
GROUP BY子句是统计数据时常用的语句,使用该子句时有以下几点需要注意:
❑当查询中存在GROUP BY子句时,SELECT列表中只能存在分组函数,或出现在GROUP BY子句中的字段。
❑GROUP BY子句不允许出现在WHERE条件中,但允许出现其后,也就是可以和WHERE条件并列使用。