答案是可以。
我们在书写sql语句的时候关键字的顺序是
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
ORDER BY ...
然而在今天学习的时候有一个需求是:显示出emp表中平均工资大于2000的部门编号与平均工资
第一次编写的sql是
SELECT e.department_id ,AVG(e.salary)
FROM employees e
WHERE AVG(e.salary) > 2000
GROUP BY e.department_id;
这条sql看起来似乎没有什么问题,但是运行后报了一个错误:
SQL 错误 [1]: [SQLITE_ERROR] SQL error or missing database (misuse of aggregate: AVG())
misuse of aggregate:翻译为泛滥使用
那么就很明了了,是AVG函数用的方式不对,查了一下资料后得出结论:
在where中使用聚合函数,是不被允许的。
但是从需求出发想要得到平均工资大于2000的结果就必须使用AVG()函数,
这是就想到了在分组之后使用条件查询,即在group by之后使用having
这时sql就应该写成
SELECT e.department_id ,AVG(e.salary)
FROM employees e
GROUP BY e.department_id;
HAVING AVG(e.salary) > 2000;
这时候就能查找出我们想要的结果:
进行到这里我又多想了一下,我不对结果进行分组,是否能在where中使用聚合函数呢??
代码如下;
SELECT e.department_id ,AVG(e.salary)
FROM employees e
WHERE AVG(e.salary) > 2000;
运行时仍然报同样的错误:
这样就重新验证了上面的结论:where字句中不能聚合函数
从以上案例我们得到的结论是:
where能和group by组合使用,但是在where字句中不能使用聚合函数,如果涉及到分组和子查询中使用聚合函数的情况,可以先用group by分组,在使用having进行子查询的方式解决。
– 补充 2022010.28
今天在看书的时候看到了一个有趣的问题:
having可以用在group by前面?
我们知道having要和group by配合使用,而且通常情况下是把having用在group by后面,但是今天看到一个问题是having可以用在group by前面,抱着怀疑的态度去试验了一下发现还真是可以。
很有意思,分享给大家~
而且having在group by前和在后使用的两种情况下的结果是一致的。