积极答复者
请大家能够用通俗的语言和例子帮我说明一下。谢谢。

问题
-
小弟也学习SQL也有一段时间了。当然目前我只会一些最简单的查询与删除还有更新的语句。我在论坛经常看见比较一些什么事务日志。什么左连接。什么右连接。这些真的不懂呀。我现在最想明白左连接与右连接到底是如何回事?
我也谷歌搜索了。但是他们说的我还是不懂。(人比较笨)我就想知道哪一些情况要用左连接。哪一些情况又用右连接呢?
最有一点例子能够通俗的解释一下。谢谢
就比如下面这样二个表。我看到人家的语句。真是不明白到底是什么意思。到底何时用左连接,何时用右连接。看了好多文章还是不明白如何用。
表TA
a d
1 22
2 22
3 22
4 22
表TB
a b
1 m
2 c
2 c
3 c
3 m
3 m
4 c
4 m
select *
from ta join tb on ta.a=tb.a
首先请大家解释一下这个查询语句的意思。再详细说一下左连接与右连接。真的十分感谢。
答案
-
select *
from ta join tb on ta.a=tb.a
--這是內連接,兩個表同時滿足條件時,才出結果集
join=inner join
也可這樣寫
select *
from ta , tb
where ta.a=tb.a
參照MSDN語法和例子
http://msdn.microsoft.com/zh-cn/library/ms191472%28SQL.90%29.aspx
ROY WU(吳熹)- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15
-
select *
from ta join tb on ta.a=tb.a
--(左表)ta join tb(右表)
--left join 从左表找符合条件,不符合补null,左表的行数据为null,//null,null,?,?//结果行数等于左边
--right join 从右表找符合条件,不符合补null,右表的行数据为null,//?,?,null,null//结果行数等于右边
--full join 是综合两者
select * from ta left join tb on ta.a=tb.a where tb.a is null
select * from ta right join tb on ta.a=tb.a where ta.a is null
表TA
a d
1 22
2 12
表TB
a b
1 23
3 44
ta left join tb on ta.a=tb.a--左连接
循环TA表去匹配TB表ta.a=tb.a条件=>
1 22 1 m
2 12 null null --表TB没找到
等同于
bool found;
foreach(ta表)
{
found=false;
foreach(tb表)
{
if(ta表.a=tb表.a)
{
datatable.rows.add(ta.a,ta.d,tb.a,tb.b);//找到
found=true;
break;
}
}
if(!found)//未找到
datatable.rows.add(ta.a,ta.d,null,null);
}- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15
-
不知道你小时候上学有没有做过这样的作业:
有2竖物品,要你用连线连接起来,比如:
猴子 汽车
司机 香蕉
兔子 胡萝卜
你会把猴子和香蕉,司机和汽车,兔子和胡萝卜连接一起,这个就是连接(也叫内连接)
那么什么是左或者右连接呢?
改一下上面的问题,这样好说明。
猴子 汽车
司机 香蕉
兔子
这个时候你只能连接 猴子和香蕉,司机和汽车 兔子是空着的,这个结果就叫 左连接
如果你连接的结果是以右边为准得出 汽车和司机,香蕉和猴子,其他没了,这个叫右连接。
上面如果改成表,通过某个字段连接就是你要得到的东西了。说的明白么?
family as water- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15
全部回复
-
select *
from ta join tb on ta.a=tb.a
--這是內連接,兩個表同時滿足條件時,才出結果集
join=inner join
也可這樣寫
select *
from ta , tb
where ta.a=tb.a
參照MSDN語法和例子
http://msdn.microsoft.com/zh-cn/library/ms191472%28SQL.90%29.aspx
ROY WU(吳熹)- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15
-
select *
from ta join tb on ta.a=tb.a
--(左表)ta join tb(右表)
--left join 从左表找符合条件,不符合补null,左表的行数据为null,//null,null,?,?//结果行数等于左边
--right join 从右表找符合条件,不符合补null,右表的行数据为null,//?,?,null,null//结果行数等于右边
--full join 是综合两者
select * from ta left join tb on ta.a=tb.a where tb.a is null
select * from ta right join tb on ta.a=tb.a where ta.a is null
表TA
a d
1 22
2 12
表TB
a b
1 23
3 44
ta left join tb on ta.a=tb.a--左连接
循环TA表去匹配TB表ta.a=tb.a条件=>
1 22 1 m
2 12 null null --表TB没找到
等同于
bool found;
foreach(ta表)
{
found=false;
foreach(tb表)
{
if(ta表.a=tb表.a)
{
datatable.rows.add(ta.a,ta.d,tb.a,tb.b);//找到
found=true;
break;
}
}
if(!found)//未找到
datatable.rows.add(ta.a,ta.d,null,null);
}- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15
-
不知道你小时候上学有没有做过这样的作业:
有2竖物品,要你用连线连接起来,比如:
猴子 汽车
司机 香蕉
兔子 胡萝卜
你会把猴子和香蕉,司机和汽车,兔子和胡萝卜连接一起,这个就是连接(也叫内连接)
那么什么是左或者右连接呢?
改一下上面的问题,这样好说明。
猴子 汽车
司机 香蕉
兔子
这个时候你只能连接 猴子和香蕉,司机和汽车 兔子是空着的,这个结果就叫 左连接
如果你连接的结果是以右边为准得出 汽车和司机,香蕉和猴子,其他没了,这个叫右连接。
上面如果改成表,通过某个字段连接就是你要得到的东西了。说的明白么?
family as water- 已标记为答案 中國風MVP, Moderator 2010年1月21日 3:15