MySQL HAVING子句
简介:在本教程中,您将学习如何使用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子句一起使用来为行或聚合组指定过滤条件。