小弟今天遇到了两个看似相同的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
-----------------------
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
2.select * from A join B on A.a=B.a and 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
------
这个可能就大相径庭了
where是联接后筛选这是逻辑上的理解,结果的预期也是这么理解,实际查询优化不是这样。
join
的区别
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的所有数据
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
之后再做内连接
应该是第一步先扫描取值
select * from [ta]
和
select * from [tb] b where b.id=1--看清楚了这里是从b 表取b.id=1
然后再联接
只是这句稍稍有些问题
select * from A left join B on A.a=B.a and A.a=1
这个left的连接中对A的条件会被忽略