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 条款:

MySQL 有

请注意,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;

MySQL HAVING - GROUP BY 实例
MySQL HAVING - GROUP BY 实例

现在,您可以 1000 使用以下 HAVING 子句找到哪个订单的总销售额大于总销售额:

SELECT 
    ordernumber,
    SUM(quantityOrdered) AS itemsCount,
    SUM(priceeach*quantityOrdered) AS total
FROM
    orderdetails
GROUP BY 
   ordernumber
HAVING 
   total > 1000;

MySQL HAVING 实例
MySQL HAVING 实例

可以在 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;

MySQL HAVING 与 INNER JOIN 实例
MySQL HAVING 与 INNER JOIN 实例

该 HAVING 子句仅在您将其与 GROUP BY 子句一起使用以生成高级报告的输出时才有用。例如,您可以使用该 HAVING 子句来回答诸如查找本月、本季度或本年度总金额大于 10K 的订单数量等问题。

结论

  • 使用 HAVING 带有 GROUP BY 子句的 MySQL子句为行组或聚合指定过滤条件。