sql多表查询之一:Where 和 On的秘密
对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术。什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某几个字段进行互联管理的时候,这就不得不说说sql多表查询中Where 和 On的秘密。
在了解sql多表查询中Where 和 On的秘密之前,让我们先来温习一下连接基础吧
按列a把两表连接,请问各种连接方式的结果的结果?
语法呢?
左 select * from @a Aa left join @b Bb on Aa.a=Bb.a
右 select * from @a Aa right join @b Bb on Aa.a=Bb.a
内 select * from @a Aa join @b Bb on Aa.a=Bb.a
完全 select * from @a Aa full join @b Bb on Aa.a=Bb.a
迪卡尔 select * from @a,@b
是不是很简单呢,接下来我们来看sql多表查询中Where 和 On的秘密:)
大家想想,依据下表
下面语句出来的结果是什么?
select * from @a _a left join @b _b on _a.id=_b.id where _b.name=1
select * from @a _a left join @b _b on _a.id=_b.id and _b.name=1
先想想,再看结果吧^_*
sql多表查询中Where 和 On的秘密在SQLserver 中的执行顺序是: 先join后where
所以,当条件写在where里,结果如下:
条件写在on里,结果如下:
Where 和 On是不是很有趣,你也试试吧!
下一个
请说出下面语句各返回多少记录
select * from @a a left join @b b on a.id=b.id where a.id=1
select * from @a a left join @b b on a.id=b.id and b.id=1
select * from @a a left join @b b on a.id=b.id and a.id=1
select * from @a a left join @b b on a.id=1
先想想,再看答案:P
— select * from @a a left join @b b on a.id=b.id where a.id=1
— 原因是先执行连接条件,再执行where部分,所以只有1条记录
— select * from @a a left join @b b on a.id=b.id and b.id=1
— 原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条
— select * from @a a left join @b b on a.id=b.id and a.id=1
— 原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条
— select * from @a a left join @b b on a.id=1
— 原因是在做完迪卡尔后,满足a.id=1 条件的有3条,但left join是对没有附和条件的加null处理,所以最后结果是5条