mysql having关键字怎么用

# 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子句。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签