在本教程中,将学习如何使用SQL Server HAVING
子句根据指定的条件筛选组。
HAVING
子句通常与GROUP BY子句一起使用,以根据指定的条件列表过滤分组。 以下是HAVING
子句的语法:
SELECT
select_list
FROM
table_name
GROUP BY
group_list
HAVING
conditions;
在此语法中,GROUP BY
子句将行汇总为分组,HAVING
子句将一个或多个条件应用于这些每个分组。 只有使条件评估为TRUE
的组才会包含在结果中。 换句话说,过滤掉条件评估为FALSE
或UNKNOWN
的组。
因为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()函数示例
以下语句查找平均价格介于500
和1000
之间的产品类别:
SELECT
category_id,
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
category_id
HAVING
AVG (list_price) BETWEEN 500 AND 1000;
执行上面查询语句,得到以下结果: