关于sql语句的执行顺序的疑问

如果按照下面这个顺序
一、sql执行顺序
(1)from
(2) on
(3) join
(4) where
(5)group by(开始使用select中的别名,后面的语句中都可以使用)
(6) avg,sum....
(7)having
(8) select
(9) distinct
(10) order by

第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表)
第二步:接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2

那比如 select * from A left join B on A.id = B.id where A.id = 10 这条语句,在where中明确指定了id,那mysql也会先执行A表和B表的笛卡尔集吗,那如果A,B两张表数据特别多 岂不是很慢?

5个回答

SQL语句的执行顺序考虑的是为了执行结果的正确性,而不是提高效率,提高效率使用存储过程,索引等解决。如果不遵守执行顺序规则连查询的结果都不一定正确,就不用谈效率了

SQL语句的执行顺序考虑的是为了执行结果的正确性,,提高效率游标,索引等解决。

https://blog.csdn.net/mango_love/article/details/44836829
sql执行顺序请参考这篇文章,
至于内连接是可以用where来筛选的,如果你担心的查询慢的情况那是很正常,因为你这种是一对多的情况,所以你还不如先把那个条件筛选后再去关联查询,这样会快不少,希望可以帮到您

你这是伪命题,你可以采用其它的方法啊,如果是你这种场景的话,mysql底层就是这样执行的,要不然要去理解他的原理干嘛
你可以分开查
或者 id=10写到on里面 都比你这快

是的,先执行:A left join B on A.id = B.id,后执行 where A.id = 10 ,最后选择 select *

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!