Mysql执行顺序基础学习

先贴出执行顺序列表:

1
2
3
4
5
6
7
8
9
10
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

开始对这个顺序的理解有些错误 在未完成一个句子查询之前 都是在对虚表进行操作 from优先 操作后产生一个虚表 接着后面的在对这个虚表进行操作 产生另一个虚表 后面依次进行操作

进行一个小实验:

1
select * from a where (select sleep(0.1));

看看效果:
Alt text
Alt text
先进行from操作 产生一个有23条数据的虚表 在进行where操作 对每一条数据进行比对 所以sleep的时间为 数据量*o.1
证明的话:

1
select * from (select sleep(0.1) union select 2 union select 1)a where (select sleep(1));

Alt text
这里有个问题:

1
select * from (select sleep(0.1) union select 2 union select 1)a where (select sleep(1)) or 1=1;

Alt text
可以看到 这个并没有像上面说的那样 这里不是太明白他是如何判断的 自己的猜想(扯蛋):mysql很聪明 在识别到where后面的or 1=1或者and 1=2(不等于) 就不执行另外一个条件 如果有师傅能解释一下 很感激

总结

按照上面的顺序依次执行 执行时都在操作前优先级执行后所得的虚表