原文: 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
。
感谢你阅读本文。