数据分析师SQL-执行顺序
这是一个系列,更多内容请阅读数据分析师SQL系列
SQL执行顺序
首先SQL执行是有顺序的,而且这个顺序和初学SQL时的认知很不一样,以下面的SQL为例
select month(date_time), count(user_id) as user_cnt
from user_table
where city = '北京'
group by month(date_time)
having count(user_id) > 100
order by user_cnt
limit 5
SQL语句的顺序:
- 从user_table表中,找到城市为北京的用户
- 执行from
- 执行where
- 以月份进行分组,并且只选出用户数大于100的月份
- 执行group by
- 执行having
- select 投影
- 执行select
- 以用户数进行排序,选择前5行
- 执行order by
- 执行limit
混淆的地方
having
select month(date_time), count(user_id) as user_cnt
from user_table
where city = '北京'
group by month(date_time)
having user_cnt > 100
很多情况下,这条SQL在MySQL中是可以执行通过的,看起来也很正常。
但是学习了执行顺序后,select在having之后执行,那么这条语句应该执行失败才对,为什么?因为执行到having的时候,根本就不存在user_cnt。
至于为什么可以执行通过?搜一下就有答案。实践中,不要怕麻烦,尽量写标准的SQL,多敲几个字母花不了多少时间。
自定义变量
属于拓展内容了,但是也涉及了顺序,在MySQL中测试通过
找一个行数不多的表,试试下面的语句
set @num := 0;
select @num, @num := @num+1
from test
很自然的认为,先执行@num,再执行@num := @num + 1,而且从返回的结果来看,确实也“验证”了这种想法
但是去阅读下MySQL关于自定义变量的帮助文档,上面认为的顺序被明确地指出不被保证,也就是说根本就不存在这种顺序。
拓展资料
欢迎推荐你认为写的不错的MySQL文章,:)
我先来一篇
运维那些事-MySQL查询解析顺序
点评:不仅仅是这篇文章,这个网站都是宝藏
写出生活