摘要:在本教程中,您将学习如何使用 MySQL HAVING
子句为行组或聚合指定过滤条件。
MySQL HAVING 子句简介
HAVING
子句在SELECT
语句中用于指定一组行或聚合的过滤条件。
HAVING
子句通常与GROUP BY
子句一起使用,以根据指定条件过滤组。如果省略GROUP BY
子句, HAVING
子句的行为类似于WHERE
子句。
下面说明了HAVING
子句的语法:
SELECT
select_list
FROM
table_name
WHERE
search_condition
GROUP BY
group_by_expression
HAVING
group_condition;
Code language: SQL (Structured Query Language) (sql)
在此语法中,您在HAVING
子句中指定条件。
HAVING 子句评估 GROUP BY 子句返回的每个组。如果结果为 true,则该行将包含在结果集中。
请注意, HAVING
子句将筛选条件应用于每组行,而WHERE
子句将筛选条件应用于每个单独的行。
MySQL 在FROM
、 WHERE
、 SELECT
和GROUP BY
子句之后以及ORDER BY
和LIMIT
子句之前评估HAVING
子句:
请注意,SQL 标准指定在SELECT
子句之前和GROUP BY
子句之后评估HAVING
。
MySQL HAVING 子句示例
让我们举一些使用HAVING
子句的示例来看看它是如何工作的。我们将使用示例数据库中的orderdetails
表进行演示。

以下代码使用GROUP BY
子句从orderdetails
表中获取订单号、每个订单销售的商品数量以及每个订单的总销售额:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber;
Code language: SQL (Structured Query Language) (sql)

现在,您可以使用HAVING
子句查找总销售额大于1000
的订单,如下所示:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber
HAVING
total > 1000;
Code language: SQL (Structured Query Language) (sql)

可以使用OR
和AND
等逻辑运算符在HAVING
子句中形成复杂的条件。
以下示例使用HAVING
子句查找总金额大于1000
并且包含超过600
商品的订单:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING
total > 1000 AND
itemsCount > 600;
Code language: SQL (Structured Query Language) (sql)

假设您要查找所有已发货且总金额大于 1500 的订单,您可以使用INNER JOIN
子句将orderdetails
表与orders
表连接起来,并对status
列和total
聚合应用条件,如下所示询问:
SELECT
a.ordernumber,
status,
SUM(priceeach*quantityOrdered) total
FROM
orderdetails a
INNER JOIN orders b
ON b.ordernumber = a.ordernumber
GROUP BY
ordernumber,
status
HAVING
status = 'Shipped' AND
total > 1500;
Code language: SQL (Structured Query Language) (sql)

HAVING
子句仅在与GROUP BY
子句一起使用以生成高级报告的输出时才有用。例如,您可以使用HAVING
子句来回答诸如查找本月、本季度或今年总金额大于 10K 的订单数等问题。
概括
- 使用 MySQL
HAVING
子句和GROUP BY
子句来指定行组或聚合的过滤条件。