因为了解过一些 SQL 执行顺序,对该 SQL 有些不解的地方,为什么 having 后可用 select 中起的别名
经 google 后得知触发了临时表,有懂得小伙伴烦请告知一下那个情况,如果还能能给解释一下,就更万分感谢了
牛客网简单类题目: https://www.nowcoder.com/practice/ddbcedcd9600403296038ee44a172f2d
select
university,
avg(question_cnt) as avg_question_cnt,
avg(answer_cnt) as avg_answer_cnt
from
user_profile
group by
university
having
avg_question_cnt < 5
or
avg_answer_cnt < 20
8 种触发临时表的情况: https://www.w3cschool.cn/hjikt5/cir4pozt.html
1 、UNION 查询;
2 、用到 TEMPTABLE 算法或者是 UNION 查询中的视图;
3 、ORDER BY 和 GROUP BY 的子句不一样时;
4 、表连接中,ORDER BY 的列不是驱动表中的;
5 、DISTINCT 查询并且加上 ORDER BY 时;
6 、SQL 中用到 SQL_SMALL_RESULT 选项时;
7 、FROM 中的子查询;
8 、子查询或者 semi-join 时创建的表;
1
shubiao OP 鄙人是一位优秀的八股文选手,看过《从根上了解 InnoDB 》,却没通篇看完《 SQL 必知必会》,最近在补 SQL 。
可以往底层了解释,请不吝指教 |
2
privatetan 2022-04-01 16:34:03 +08:00
答:group by 触发了临时表的创建;
having 查询可改成 子查询 , 即: select * from ( select university, avg(question_cnt) as avg_question_cnt, avg(answer_cnt) as avg_answer_cnt from user_profile group by university ) where avg_question_cnt < 5 or avg_answer_cnt < 20) |
3
shubiao OP @privatetan 我翻了一些文章都是来来回回直接列各种情况,而且还列不全,比如就没有说单独的 group by 就会触发临时表。 能给推荐些文章、书吗
|
4
shubiao OP 上面 sql 有点瑕疵,正确写法
SELECT * FROM ( SELECT university, avg( question_cnt ) AS avg_question_cnt, avg( answer_cnt ) AS avg_answer_cnt FROM user_profile GROUP BY university ) t1 WHERE avg_question_cnt < 5 OR avg_answer_cnt < 20 |
5
shubiao OP 子查询也会触发内部临时表
|