SQL执行顺序

文章未经允许,不可转载

这是一个系列,更多内容请阅读数据分析师-SQL系列

SQL执行顺序

首先SQL执行是有顺序的,而且这个顺序和初学SQL时的认知很不一样,以下面的SQL为例

1
2
3
4
5
6
7
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

1
2
3
4
5
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中测试通过
找一个行数不多的表,试试下面的语句

1
2
3
set @num := 0;
select @num, @num := @num+1
from test

很自然的认为,先执行@num,再执行@num := @num + 1,而且从返回的结果来看,确实也“验证”了这种想法

但是去阅读下MySQL关于自定义变量的帮助文档,上面认为的顺序被明确地指出不被保证,也就是说根本就不存在这种顺序。

拓展资料

欢迎推荐你认为写的不错的MySQL文章,:)

我先来一篇
运维那些事-MySQL查询解析顺序

点评:不仅仅是这篇文章,这个网站都是宝藏

您的支持将鼓励我继续创作!