# 1. 什么是HAVING关键字?
在MySQL中HAVING子句用于筛选满足指定条件的数据行。它与WHERE子句一样,都是用来指定SQL语句的条件,但是HAVING子句是约束分组的,而WHERE子句是约束行的。通常,使用HAVING子句的时候需要结合GROUP BY子句一起使用。
下面我们通过几个例子来具体介绍HAVING关键字。
# 2. 语法格式
HAVING子句一般放在GROUP BY子句后面,语法格式如下:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
上面语法格式中,
- column_name表示要查询的列名;
- aggregate_function表示聚合函数,可以是SUM、COUNT、AVG、MAX、MIN等;
- table_name表示要查询的表名;
- WHERE子句用来指定查询条件;
- GROUP BY子句用来指定对哪个列进行分组;
- HAVING子句用来指定过滤分组结果的条件。
# 3. 示例
假设我们有一个学生成绩表students,包含以下字段:
- id:学生ID,int类型;
- name:学生姓名,varchar类型;
- sex:性别,varchar类型;
- course:课程名称,varchar类型;
- score:课程成绩,int类型。
我们对这个表进行统计,输出每个姓名为Tom的学生在每门课程上的成绩总和。
SELECT name, course, SUM(score) AS sum_score
FROM students
WHERE name='Tom'
GROUP BY name, course
HAVING sum_score > 60;
上面的SQL语句中,我们使用了SUM聚合函数对score字段进行求和,然后使用GROUP BY子句按照name和course进行分组,最后使用HAVING子句过滤出总成绩大于60的结果。
# 4. HAVING与WHERE的不同之处
HAVING和WHERE都可以用来限制查询结果,但是二者的区别在于:
- WHERE是用来限制行的,即在查询之前进行限制;
- HAVING是用来限制组的,即在查询之后进行限制。
例如,我们现在有一张学生成绩表students,需要查询每个学生的总分,如果总分大于某个值,就输出该学生的信息。
- 使用WHERE限制行的方法:
SELECT name, sex, SUM(score) AS sum_score
FROM students
WHERE SUM(score) > 60
GROUP BY name, sex;
这种写法是有问题的,因为使用WHERE子句会在GROUP BY之前进行限制,也就是说无法对聚合后的结果进行筛选。
- 使用HAVING限制组的方法:
SELECT name, sex, SUM(score) AS sum_score
FROM students
GROUP BY name, sex
HAVING SUM(score) > 60;
在使用GROUP BY子句进行分组之后,使用HAVING子句对分组后的结果进行筛选,可以得到正确结果。
# 5. 总结
- HAVING子句用于筛选满足指定条件的分组结果;
- HAVING子句必须和GROUP BY子句一起使用;
- WHERE子句用于在查询之前筛选符合条件的行;
- HAVING子句用于在GROUP BY之后筛选符合条件的分组结果;
- 在使用聚合函数时,如果想要筛选分组结果,必须使用HAVING子句,而不能使用WHERE子句。