MySQL HAVING 子句
在本教程中,您将学习如何使用 MySQL HAVING 子句为行组或聚合组指定过滤条件。
总结_:_在本教程中,您将学习如何使用 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;
在此语法中,您在 HAVING 子句中指定条件。
HAVING 子句评估 GROUP BY 子句返回的每个组。如果结果为真,则该行包含在结果集中。
请注意,该 HAVING 子句将过滤条件应用于每组行,而该 WHERE 子句将过滤条件应用于每个单独的行。
MySQL的评估 HAVING 后条款 FROM , WHERE , SELECT 以及 GROUP BY 条款和之前 ORDER BY 和 LIMIT 条款:
请注意,SQL 标准指定了 HAVING 在 SELECT 子句之前和之后 进行评估 GROUP BY 。
MySQL HAVING 子句实例
让我们举一些使用 HAVING 子句的例子来看看它是如何工作的。我们将使用示例数据库中的 orderdetails 表进行演示。

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

现在,您可以 1000 使用以下 HAVING 子句找到哪个订单的总销售额大于总销售额:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber
HAVING
total > 1000;

可以在 HAVING 子句中使用 OR 和等逻辑运算符形成复杂的条件 AND 。
以下实例使用该 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;

假设您要查找所有已发货且总金额大于 1500 的订单,您可以使用子句将表与表连接 orderdetails 起来,并对列和聚合应用条件, 如以下查询所示: orders INNER JOIN 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;

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