原文: 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 返回以下内容:

ss1-6

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

ss2-6

然后,你可以使用 HAVING 关键字根据条件过滤掉一些学生,例如,那些得分大于 70 的人。

但在此之前,你必须像这样使用 GROUP BY 子句:

GROUP BY name, score

这不会返回任何东西。所以你需要引入 HAVING 关键字:

HAVING score > 70

现在,我可以找到分数高于 70 的学生:

ss3-6

完整的查询如下所示:

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
ss4-7

如果将 WHERE 与聚合函数一起使用,则会发生错误

SELECT name, count(*)
FROM students
GROUP BY name
WHERE COUNT(*) > 0
ss5-7

如果你使用 HAVING,错误就会消失:

SELECT name, count(*)
FROM students
GROUP BY name
HAVING COUNT(*) > 0
ss6-6

你可以使用任何你想要的运算符!

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

ss7-5

我以这种方式得到了 90 分的学生:

SELECT name, score 
FROM students 
GROUP BY name, score 
HAVING score = 90
ss8-5

如果未满足有关语句中的条件,则不会返回行:

SELECT name, score 
FROM students 
GROUP BY name, score 
HAVING score = 100
ss9-4

如果你使用 HAVING 而不使用 GROUP BY,则会发生错误

SELECT COUNT(*)
FROM students 
HAVING score > 80
ss10-4

在这种情况下,你必须使用 WHERE 子句:

SELECT COUNT(*)
FROM students 
WHERE score > 80
ss11-4

小结

在本文中,你学习了如何使用 HAVING 关键字查询数据库。

请记住,你必须将 HAVING 子句与 GROUP BY 一起使用,这样你才能获得所需的数据,就像你在本文中看到的那样。

在不能使用 HAVING 子句的情况下,你可能需要使用 WHERE

感谢你阅读本文。