编写高级 SELECT 语句 / GROUP BY 和 HAVING 子句 |
要完成 GROUP BY 子句,使用 HAVING 子句来在构成组之后将一个或多个限制条件应用于这些组。HAVING 子句对组的影响类似于 WHERE 子句限定个别行的方式,使用 HAVING 子句的一个优点是可以在搜索条件中包括聚集,而在 WHERE 子句的搜索条件中去不能包含聚集。
每个 HAVING 条件将组的一列或一个聚集表达式与组的另一个聚集表达式或与常量作比较。可以使用 HAVING 来对列值或组列表中的聚集值设置条件。
图: 查询
SELECT order_num, COUNT(*) number, AVG (total_price) average FROM items GROUP BY order_num HAVING COUNT(*) > 2;
图: 查询结果
order_num number average 1003 3 $319.67 1004 4 $354.00 1005 4 $140.50 1006 5 $89.60 1007 5 $339.20 1013 4 $35.95 1016 4 $163.50 1017 3 $194.67 1018 5 $226.20 1021 4 $403.50 1022 3 $77.33 1023 6 $137.33
图: 查询
SELECT AVG (total_price) average FROM items HAVING count(*) > 2;
图: 查询结果
average $270.97
如果图 3与图 1一样,在 Projection 子句中包含了非聚集列 order_num ,那么必须将 GROUP BY 子句与组列表中的列包含子啊一起。此外,如果不满足 HAVING 子句中的条件,那么输出将显示列标题以及一条消息指示没有找到任何行。
图: 查询
SELECT o.order_num, SUM (i.total_price) price, paid_date - order_date span FROM orders o, items i WHERE o.order_date > '01/01/98' AND o.customer_num > 110 AND o.order_num = i.order_num GROUP BY 1, 3 HAVING COUNT (*) < 5 ORDER BY 3 INTO TEMP temptab1;
图: 查询结果
order_num price span 1017 $584.00 1016 $654.00 1012 $1040.00 1019 $1499.97 26 1005 $562.00 28 1021 $1614.00 30 1022 $232.00 40 1010 $84.00 66 1009 $450.00 68 1020 $438.00 71