SQL学习笔记02 极客时间 SQL必知必会50讲

04丨使用DDL创建数据库&数据表时需要注意什么?

05丨检索数据:你还在SELECT * 么?

先交作业 select name,mp_max from heros order by hp_max desc limit 5;
 然后就是楼下一个同学问的问题,我也有些疑惑,就是这个
SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

对于这个语句,我还有一点疑问:既然HAVING的执行是在SELECT之前的,那么按理说在执行HAVING的时候SELECT中的count(*)应该还没有被计算出来才对啊,为什么在HAVING中就直接使用了num>2这个条件呢?
希望老师百忙之中能抽空帮忙解释一下,谢谢老师

作者回复: 很好的问题,实际上在Step4和Step5之间,还有个聚集函数的计算。
如果加上这个计算过程,完整的顺序是:
1、FROM子句组装数据
2、WHERE子句进行条件筛选
3、GROUP BY分组
4、使用聚集函数进行计算;
5、HAVING筛选分组;
6、计算所有的表达式;
7、SELECT 的字段;
8、ORDER BY排序
9、LIMIT筛选
所以中间有两个过程是需要计算的:聚集函数 和 表达式。其余是关键字的执行顺序,如文章所示。

06丨数据过滤:SQL数据过滤都有哪些方法?

      提升查询效率的一个很重要的方式,就是约束返回结果的数量,还有一个很有效的方式,就是指定筛选条件,进行过滤。过滤可以筛选符合条件的结果,并进行返回,减少不必要的数据行。

感谢 https://time.geekbang.org/column/article/102541

发布了78 篇原创文章 · 获赞 32 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/caofengtao1314/article/details/105384323