zoukankan      html  css  js  c++  java
  • 关于A left join B,A是否一定是主表?

     

    一般情况,我们作左连接 select * from A left join B  on A.id=B.a_id;一定认为A就是主表,其实还有另外的情况,我们若将sql改写成 select * from A left join B  on on A.id=B.a_id where B.id<cont(常数)。此时B表就作为连接的主表了。具体示例见下:

    新建表 A

     

    新建表B

     1.查询sql

    SELECT * FROM A a  LEFT JOIN   B  b ON a.category_id = b.id where b.id<8;此时查看查询计划,显示 b表为主表

    解释:where v.id<8,筛选出了更小的表B,所以按照left join 小表驱动大表的原则,此时把B表作为主表也不足为奇了。

     2.查询sql

    SELECT * FROM A a  LEFT JOIN   B  b ON a.category_id = b.id where b.id<16;此时查看查询计划,显示 a表为主表

    解释:where v.id<16,筛选出了的表B有15条>A(里面14条),所以按照left join 小表驱动大表的原则,此时把A表作为主表了。

     3.查询sql

    1)SELECT * FROM A a  LEFT JOIN   B  b ON a.category_id = b.id where b.id<14;此时查看查询计划,显示 a表为主表

    2)SELECT * FROM A a  LEFT JOIN   B  b ON a.category_id = b.id where b.id<=14;此时查看查询计划,显示 a表为主表

    按照我们前面说的小表驱动大表,此时where where b.id<14或者 where where b.id<=14,B表的条数为13或14(A表14条没变),但此时都是以A 。

    说明:在2表的连接时候相等记录条数时候有点小bug,具体原因待解决。。。。

  • 相关阅读:
    利用IDE自动生成Logger变量
    浏览器跨域请求
    linux shell 跟踪网站变动
    linux shell 查找网站中无效的链接
    linux shell 网页相册生成器
    Shell帮你掌管上千台服务(多线程)
    Ansible小实例
    Shell监控公网IP-变化邮件报警
    ffmpeg顺时针或逆时针旋转视频90,180度
    Download youtube videos with subtitles using youtube-dl
  • 原文地址:https://www.cnblogs.com/zhouj850/p/8321448.html
Copyright © 2011-2022 走看看