一,实例引入
写一个SQL语句,一个表中有姓名、课程、成绩,请你查询出平均分大于60分的同学的名字。
SELECT name
FROM student_scores
GROUP BY name
HAVING AVG(score) > 60;
这条SQL语句的工作原理如下:
FROM student_scores
:指定查询的表名。GROUP BY name
:按照学生的姓名对成绩进行分组,这样每个学生的成绩就会聚集在一起。HAVING AVG(score) > 60
:筛选出那些平均成绩超过60分的学生。注意这里使用HAVING
而不是WHERE
,因为HAVING
用于对分组后的结果进行条件过滤,而WHERE
用于对行进行条件过滤。
二,where和having的区别在哪?为什么上文不用where筛选结果?
HAVING
和WHERE
子句在SQL中都用于添加条件过滤,但它们的使用场景和作用对象不同:
WHERE子句
- 使用场景:
WHERE
子句用于在对数据进行分组前,筛选表中的行。它可以过滤掉不满足条件的行,确保只有满足条件的行才会被包括在分组或计算中。 - 作用对象:
WHERE
子句直接作用于原始数据表中的每一行数据。它在数据被分组前进行过滤。 - 示例:假设想从一个包含员工信息的表中选出所有工资大于5000的员工记录。
SELECT name, salary
FROM employees
WHERE salary > 5000;
HAVING子句
- 使用场景:
HAVING
子句用于在对数据进行分组并且计算如求和、平均等聚合操作后,筛选满足特定条件的分组。它是唯一一种可以在分组聚合结果上应用条件过滤的子句。 - 作用对象:
HAVING
子句作用于分组聚合后的结果集。它在数据被分组并且对分组进行了聚合计算(如COUNT
,SUM
,AVG
等)之后进行过滤。 - 示例:假设想从一个包含员工信息和部门的表中选出平均工资大于5000的部门。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
主要区别
- 作用时间点:
WHERE
子句在数据分组前对行进行筛选,而HAVING
子句在数据经过分组和聚合函数处理后对结果进行筛选。 - 作用对象:
WHERE
子句作用于原始数据的每一行,HAVING
子句作用于聚合后的数据。 - 应用场合:当需要过滤的条件是基于单行数据的时候使用
WHERE
,当过滤条件基于聚合结果,如SUM
、AVG
时使用HAVING
。