原文: SQL HAVING – How to Group and Count with a Having Statement
在 SQL 中,你可以在 GROUP BY 之后使用 HAVING 关键字根据指定条件查询数据库。与其他关键字一样,它返回满足条件的数据并过滤掉其余的数据。
引入 HAVING 关键字是因为 WHERE 子句无法与聚合函数一起使用。因此,你必须将 HAVING 子句与聚合函数一起使用,而不是 WHERE。
将 HAVING 子句与 GROUP BY 关键字一起使用,你可以将数据库中的数据排列为多个组。因此,你可以在大型数据库中使用它。
如何使用 HAVING 关键字
假设我在 student_scores 数据库中有一个名为 students 的表。SELECT * FROM students 返回以下内容:

你可以通过运行 SELECT name, score FROM students 仅获取姓名和分数。

然后,你可以使用 HAVING 关键字根据条件过滤掉一些学生,例如,那些得分大于 70 的人。
但在此之前,你必须像这样使用 GROUP BY 子句:
GROUP BY name, score
这不会返回任何东西。所以你需要引入 HAVING 关键字:
HAVING score > 70
现在,我可以找到分数高于 70 的学生:

完整的查询如下所示:
SELECT name, score
FROM students
GROUP BY name, score
HAVING score > 70
我也可以通过这种方式获得分数超过 90 的学生:
SELECT name, score
FROM students
GROUP BY name, score
HAVING score > 90
该表还有一个年龄(age)列,因此我可以通过这种方式获取 14 岁以上的学生:
SELECT name, age
FROM students
GROUP BY name, age
HAVING age > 14

如果将 WHERE 与聚合函数一起使用,则会发生错误
SELECT name, count(*)
FROM students
GROUP BY name
WHERE COUNT(*) > 0

如果你使用 HAVING,错误就会消失:
SELECT name, count(*)
FROM students
GROUP BY name
HAVING COUNT(*) > 0

你可以使用任何你想要的运算符!
并不是只能使用比较操作符。因此,我可以通过将 HAVING 语句更改为 HAVING age = 13 来获得 13 岁的学生:

我以这种方式得到了 90 分的学生:
SELECT name, score
FROM students
GROUP BY name, score
HAVING score = 90

如果未满足有关语句中的条件,则不会返回行:
SELECT name, score
FROM students
GROUP BY name, score
HAVING score = 100

如果你使用 HAVING 而不使用 GROUP BY,则会发生错误
SELECT COUNT(*)
FROM students
HAVING score > 80

在这种情况下,你必须使用 WHERE 子句:
SELECT COUNT(*)
FROM students
WHERE score > 80

小结
在本文中,你学习了如何使用 HAVING 关键字查询数据库。
请记住,你必须将 HAVING 子句与 GROUP BY 一起使用,这样你才能获得所需的数据,就像你在本文中看到的那样。
在不能使用 HAVING 子句的情况下,你可能需要使用 WHERE。
感谢你阅读本文。