SQL Server Having子句

在本教程中,将学习如何使用SQL Server HAVING子句根据指定的条件筛选组。

HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件列表过滤分组。 以下是HAVING子句的语法:

SELECT
    select_list
FROM
    table_name
GROUP BY
    group_list
HAVING
    conditions;

在此语法中,GROUP BY子句将行汇总为分组,HAVING子句将一个或多个条件应用于这些每个分组。 只有使条件评估为TRUE的组才会包含在结果中。 换句话说,过滤掉条件评估为FALSEUNKNOWN的组。

因为SQL Server在GROUP BY子句之后处理HAVING子句,所以不能通过使用列别名来引用选择列表中指定的聚合函数。以下查询将失败:

SELECT
    column_name1,
    column_name2,
    aggregate_function (column_name3) column_alias
FROM
    table_name
GROUP BY
    column_name1,
    column_name2
HAVING
    column_alias > value;

必须明确使用HAVING子句中的聚合函数表达式,如下所示:

SELECT
    column_name1,
    column_name2,
    aggregate_function (column_name3) alias
FROM
    table_name
GROUP BY
    column_name1,
    column_name2
HAVING
    aggregate_function (column_name3) > value;

SQL Server HAVING示例

下面举一些例子来理解HAVING子句的工作原理。

1. HAVING子句与COUNT函数示例

请参阅示例数据库中的以下orders表:

以下声明查找每年至少下过两个订单的客户:

SELECT
    customer_id,
    YEAR (order_date),
    COUNT (order_id) order_count
FROM
    sales.orders
GROUP BY
    customer_id,
    YEAR (order_date)
HAVING
    COUNT (order_id) >= 2
ORDER BY
    customer_id;

执行上面查询语句,得到以下结果:

在上面查询示例中,

  • 首先,GROUP BY子句按客户和订单年份对销售订单进行分组。 COUNT()函数返回每个客户每年下达的订单数。
  • 其次,HAVING子句筛选出订单数至少为2的所有客户。

2. HAVING子句与SUM()函数的例子

请考虑以下order_items表:

以下语句查找净值大于20000的销售订单:

SELECT
    order_id,
    SUM (
        quantity * list_price * (1 - discount)
    ) net_value
FROM
    sales.order_items
GROUP BY
    order_id
HAVING
    SUM (
        quantity * list_price * (1 - discount)
    ) > 20000
ORDER BY
    net_value;

执行上面查询语句,得到以下结果:

在这个例子中:

  • 首先,SUM函数计算销售订单的净值。
  • 其次,HAVING子句过滤净值小于或等于20000的销售订单。

3. HAVING子句与MAX和MIN函数的示例

请参阅以下products表:

以下语句首先查找每个产品类别中的最大和最小价格。 然后,它筛选出最大价格大于4000或最小价格小于500的类别:

SELECT
    category_id,
    MAX (list_price) max_list_price,
    MIN (list_price) min_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    MAX (list_price) > 4000 OR MIN (list_price) < 500;

执行上面查询语句,得到以下结果:

4. HAVING子句与AVG()函数示例

以下语句查找平均价格介于5001000之间的产品类别:

SELECT
    category_id,
    AVG (list_price) avg_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    AVG (list_price) BETWEEN 500 AND 1000;

执行上面查询语句,得到以下结果:


上一篇: SQL Server数据分组 下一篇: SQL Server子查询语句