我们上一章讲到了sQL单行函数。实际上sQL函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
- 要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
\- 要求2:HAVING 必须声明在GROUP BY的后面。
\- 要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。
#练习:查询各个部门中最高工资比10000高的部门信息
#错误写法
SELECT department_id,MAX(salary)
FROM employees
WHERE MAX(salary) > 10000
GROUP BY department_id;#要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
#要求2:HAVING 必须声明在GROUP BY的后面。
#要求3:开发中,我们使用HAVING的前提是sQL中使用了GROUP BY。#正确的写法:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
#练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
#方式1:
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary) > 10000 ;
#方式2:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40) ;
#练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
#方式1:
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary) > 10000 ;
#方式2:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40) ;
问题一:有组函数只能使用HAVING,没有组函数的也可以使用HAVING,WHERE还有用嘛?
问题二:WHERE也行,HAVING也行,建议使用哪一种呢?哪一种效率高呢?
下一篇:C++基础——运算符重载函数2