HAVING 子句

要完成 GROUP BY 子句,使用 HAVING 子句来在构成组之后将一个或多个限制条件应用于这些组。HAVING 子句对组的影响类似于 WHERE 子句限定个别行的方式,使用 HAVING 子句的一个优点是可以在搜索条件中包括聚集,而在 WHERE 子句的搜索条件中去不能包含聚集。

每个 HAVING 条件将组的一列或一个聚集表达式与组的另一个聚集表达式或与常量作比较。可以使用 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
如果使用不带 GROUP BY 子句的 HAVING 子句,那么 HAVING 条件应用于满足搜索条件的所有行。也就是说,满足搜索条件的所有行组成了一个组。
下列查询(图 1的修改版本)只返回一行,即表中所有 total_price 值的平均数,如下所示。

图: 查询

SELECT AVG (total_price) average
          FROM items
          HAVING count(*) > 2;

图: 查询结果

         average
              
              $270.97

如果图 3图 1一样,在 Projection 子句中包含了非聚集列 order_num ,那么必须将 GROUP BY 子句与组列表中的列包含子啊一起。此外,如果不满足 HAVING 子句中的条件,那么输出将显示列标题以及一条消息指示没有找到任何行。

下列查询包含可以在 GBase 8s 版本的交互 SQL 中使用的所有 SELECT 语句子句(命名主变量的 INTO 子句只在 SQL API 中可用)。

图: 查询

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;
该查询连接 ordersitems 表;使用显示标号、表列名和用作列指示符的整数;对数据进行分组和排序;并将结果放置在临时表中,如下所示。

图: 查询结果

  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