一、sql查询语句执行顺序
(8)Select(9)distinct 字段名1,字段名2,(6)[fun(字段名)] (1)from 表1(3)<join类型>join 表2 (2)on <join条件> (4)where <where条件> (5)group by <字段> (7)having <having条件> (10)order by <排序字段> (11)limit <起始偏移量,行数>
二、关键字执行顺序
也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.
这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。
MySQL会先执行from,根据on关键字去筛选表,筛选出的结果再进行join,生成一个临时表。然后去执行where条件去筛选临时表。然后就可以对数据进行group by进行分组,执行having对数据进行进一步筛选,然后select去筛选目标列了,之后需要使用distinct进行去重这样一个表的查询基本就结束了。然后就是对数据进行排序的order by ,排完顺序自然就是取分页了。这样就会将一个完整的sql执行完毕了。
三、on为什么执行在join前面?
对于left jion 和 right join
首先from可以获得主表信息,然后join此时也获得了另一个表信息,执行join时要生成中间表,如果先进行join而不是on,此时则是两个大表之间进行笛卡尔乘积(sql里面表与表之间进行关联时是通过笛卡尔乘积生成中间表),而如果先通过on进行条件筛选,然后再进行join关联,则计算量会大大减少。虽然没有执行join,但是可以通过jion知道是哪些表进行关联,然后通过执行on进行筛选,然后再执行join进行表与表之间的笛卡尔乘积。
对于inner join 和 cross join
对于inner join 和 cross join 在他们后面使用on条件时,mysql都会将on后面的条件优化到where里,on条件相当于是一个where条件
四、关键字对于sql优化的启示
我们知道更多的数据在越早的阶段被过滤掉越好,sql性能也越高。
1.能写在on里的条件,不要写在where里,能写在where里的条件不写在having里
很容易就可以看出来先执行on再执行where最后执行haing,所以条件越靠前月有利于sql的执行。
2.能使用left join 或者right join 的不使用inner join 或者 cross join
其实我们在inner join 或者cross join中使用on其实就是使用where,因为mysql的执行优化器最后都回将on解析成where