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;Code language: SQL (Structured Query Language) (sql)

在此语法中,您在HAVING子句中指定条件。

HAVING 子句评估 GROUP BY 子句返回的每个组。如果结果为 true,则该行将包含在结果集中。

请注意, HAVING子句将筛选条件应用于每组行,而WHERE子句将筛选条件应用于每个单独的行。

MySQL 在FROMWHERESELECTGROUP BY子句之后以及ORDER BYLIMIT子句之前评估HAVING子句:

MySQL 有

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

试试看

MySQL HAVING - GROUP BY example

现在,您可以使用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)

试试看

MySQL HAVING example

可以使用ORAND等逻辑运算符在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)

试试看

MySQL HAVING with INNER JOIN example

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

概括

  • 使用 MySQL HAVING子句和GROUP BY子句来指定行组或聚合的过滤条件。
本教程有帮助吗?