MySQL HAVING子句

时间:2019-11-20 08:52:05  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL HAVING子句为行或聚合组指定过滤条件。

MySQL HAVING子句简介

在SELECT语句中使用HAVING子句为一组行或集合指定过滤条件。

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子句中指定条件。
如果由group by子句生成的行导致group_condition评估为true,则查询会将其包括在结果集中。

请注意,HAVING子句将过滤条件应用于每组行,而WHERE子句将过滤条件应用于每行。

MySQL在FROM,WHERE,SELECT和GROUP BY子句之后以及ORDER BY和LIMIT子句之前评估HAVING子句。

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

现在,您可以使用HAVING子句查找总销售额大于1000的订单,如下所示:

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

您可以使用逻辑运算符(例如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;

假设您要查找所有处于装运状态且总金额大于1500的订单,则可以使用INNER JOIN子句将orderdetails表与orders表结合起来,并在status列和total 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子句来回答一些问题,例如查找本月,本季度或今年总销售量超过1万的订单。

在本教程中,您学习了如何将MySQL HAVING子句与GROUP BY子句一起使用来为行或聚合组指定过滤条件。