小弟今天遇到了两个看似相同的sql语句,其结果却不一样,请各位大哥帮帮解释一下!
-----------------------
A表 
a   b
1   'a'
2   'b'
3   'c'
-----------------------
b表
a   c
1   'a'
2   'b'
4   'd'
-----------------------1.select * from A join B on A.a=B.a where A.a=1  
2.select * from A join B on A.a=B.a and A.a=11.select * from A left join B on A.a=B.a where A.a=1  
2.select * from A left join B on A.a=B.a and A.a=1

解决方案 »

  1.   

    1.select * from A join B on A.a=B.a where A.a=1  
    2.select * from A join B on A.a=B.a and A.a=1
    ---------
    这个同
      

  2.   

    1.select * from A left join B on A.a=B.a where A.a=1  
    2.select * from A left join B on A.a=B.a and A.a=1
    ----
    这个也同,我说的是结果。1.select * from A left join B on A.a=B.a where B.a=1
    2.select * from A left join B on A.a=B.a and B.a=1
    ------
    这个可能就大相径庭了
      

  3.   

    这么理解吧,这个问题不好描述:on筛选是先筛选再联接
    where是联接后筛选这是逻辑上的理解,结果的预期也是这么理解,实际查询优化不是这样。
      

  4.   

    left join 
    join
    的区别
      

  5.   

    --1
    select * from [ta] a left join [tb]  b on a.id=b.id where a.id=1--2
    select * from [ta] a left join [tb]  b on a.id=b.id and a.id=4
    /*
    两者的区别:
    1是筛选了where=1 的a表之后的内容在和b做做连接
    2连接条件多了一个  a.id=1 这个是 a.id=1 的和 b.id=1的做匹配,但是会读出a的所有数据
      

  6.   

    --1
    select * from [ta] a  join [tb]  b on a.id=b.id where a.id=1--2
    select * from [ta] a  join [tb]  b on a.id=b.id and a.id=1
    /*
    这俩是一样的
    及取出
    select * from [ta] a where a.id=1

    select * from [tb] b where b.id=1
    之后再做内连接
      

  7.   

    这个第二的解释有些不合理
    应该是第一步先扫描取值
    select * from [ta]

    select * from [tb] b where b.id=1--看清楚了这里是从b 表取b.id=1
    然后再联接
      

  8.   


    只是这句稍稍有些问题
    select * from A left join B on A.a=B.a and A.a=1
    这个left的连接中对A的条件会被忽略