qq_37888418
qq_37888418
采纳率0%
2019-01-15 22:26 阅读 600

关于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条回答 默认 最新

  • qq_40345147 日常500 2019-01-16 03:49

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

    点赞 评论 复制链接分享
  • yangmin1 yangmin1 2019-01-16 09:35

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

    点赞 评论 复制链接分享
  • mango_love mango_love 2019-01-16 10:07

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

    点赞 评论 复制链接分享
  • FengQingYunLing 风清云凌 2019-01-16 10:17

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

    点赞 评论 复制链接分享
  • Chris_csdn ChrisCHh 2019-01-17 12:26

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

    点赞 评论 复制链接分享

相关推荐