MySQL HAVING 子句限制了 GROUP BY 子句返回的记录或行的数量。要使用 HAVING 子句,我们必须使用 GROUP BY。这是因为 HAVING 是在 GROUP BY 之后应用的。
您不能使用 WHERE 来检查聚合数据的条件。对于 HAVING 子句,我们必须使用 GROUP BY。请参阅 GROUP BY 以了解分组。
MySQL HAVING 子句语法
HAVING 子句的语法可以写成:
SELECT [Column1],...[ColumnN],
Aggregate_Function(Column_Name)
FROM [Source]
WHERE [Conditions] -- Optional
GROUP BY [Column1],...[ColumnN]
HAVING [Conditions] -- Condition is on Aggregate Function(Column_Name)
- Column1…N:从表(多表)中选择列。
- 聚合函数:使用任何 聚合函数。COUNT、SUM、AVG、AVG、MIN、MAX、STD 和 VARIANCE 是我们可以使用的函数。
- GROUP BY:不是聚合函数一部分的列必须放在 GROUP BY 之后。
- HAVING:我们可以提供过滤器或对从 GROUP BY 获得的聚合数据应用条件。
MySQL HAVING 子句单条件示例
为了演示 HAVING 子句过滤聚合数据,我们将使用下面显示的数据。

MySQL HAVING SUM 子句示例
在此示例中,我们将单个列用作 GROUP 列,并使用 SUM 函数 来聚合值。接下来,我们使用 HAVING 子句来限制结果。 在此,GROUP BY 语句按学历对客户进行分组。然后,它检查收入总和是否大于 100000。
SELECT Qualification,
SUM(Income),
SUM(Sales)
FROM customer
GROUP BY Qualification
HAVING SUM(Income) > 100000;

HAVING 子句 AVG 函数示例
在此示例中,我们使用了 AVG 函数。在这里,它检查平均收入是否大于或等于 60000。
SELECT Qualification,
AVG(Income),
AVG(Sales)
FROM customer
GROUP BY Qualification
HAVING AVG(Income) >= 60000;

MySQL HAVING 子句 MIN 示例
在此示例中,我们在 HAVING 子句中使用了 MIN 函数。以下查询返回每个学历的最低收入、最高收入、最低销售额和最高销售额,其中最低收入大于 50000。
SELECT Qualification,
MIN(Income),
MAX(Income),
MIN(Sales),
MAX(Sales)
FROM customer
GROUP BY Qualification
HAVING MIN(Income) > 50000;

HAVING MAX 示例
这一次,我们在 GROUP BY 中使用了多个列。接下来,我们在 HAVING 子句中使用了 MAX 函数 和 MIN 函数。
下面的 HAVING 子句查询返回每个学历的最低年收入、最高收入、最低销售额和最高销售额,其中最低收入高于 50000。
SELECT Qualification,
Occupation,
MIN(Income),
MAX(Income)
MIN(Sales),
MAX(Sales)
FROM customer
GROUP BY Qualification, Occupation
HAVING MAX(Sales) > 100;

HAVING 多条件
在此示例中,我们将在 HAVING 子句中使用多个条件。首先,GROUP BY 语句按学历和职业对客户进行分组。然后,它检查销售额总和是否大于 100 且销售额总和是否小于 5000。
SELECT Qualification,
Occupation,
SUM(Income),
MIN(Income),
MAX(Income),
SUM(Sales),
MIN(Sales),
MAX(Sales)
FROM customer
GROUP BY Qualification, Occupation
HAVING SUM(Sales) > 100 AND SUM(Sales) < 5000
ORDER BY SUM(Income);

MySQL HAVING ORDER BY 子句
我们也可以将 ORDER BY 与 HAVING 子句一起使用。在这里,结果按总收入升序排序。
SELECT Qualification,
Occupation,
SUM(Income),
MIN(Income),
MAX(Income),
SUM(Sales),
MIN(Sales),
MAX(Sales)
FROM customer
GROUP BY Qualification, Occupation
HAVING SUM(Sales) > 100 AND SUM(Sales) < 5000
ORDER BY SUM(Income);

命令提示符示例
在此 HAVING 子句示例中,我们使用命令提示符显示结果。
SELECT Qualification, Occupation,
SUM(Income),
AVG(Income),
MIN(Income),
MAX(Income)
FROM Customer
GROUP BY Qualification, Occupation
HAVING MIN(Sales) > 100;
