sql中内联 和外联 区别
作者:admin 日期:2007-12-21
这个概念一般看书不好理解。其实夜简单。有例子就简单了。
比如:
表A(主表)
cardid username
16 aa
23 bb
25 cc
29 dd
30 ee
表B(子表)
countid cardid score
1 16 34
2 25 300
3 29 1.5
在 cardid 列上联接 A 表和 B 表。
分别用内联、外联试试。
内联:
Select cardid FROM A INNER JOIN B ON (A.cardid<>B.cardid)
那么这样查询就会交叉地拿A和B去比较,上例来说就是拿『16,23,25,29,30』和16,25,29比。那么显然<>的结果是: 23,25,29,30,16,25,29,30。。。不符合我们的要求。因为内联本来就只有找相同的功能,没有找不同的功能。
左外联:
Select cardid FROM A LEFT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
这里会拿左表(A)的所有行去和B比较,上例来说是『16,23,25,29,30』先和16比较,然后再和23比较。它将包括所有A表内容,而对应的B表,符合条件就打印,否则没有的话会为null。所以这样就按要求得到了为null的值,也就是缺少的。
右外联:
Select cardid FROM A RIGHT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
这里会拿右表(B)的所有行去和A比较,上例来说是16,25,29和『16,23,25,29,30』比较。结果只包含B表的所有行。在这里显然不符合要求。
但Select cardid FROM B RIGHT OUTER JOIN A ON (B.cardid=A.cardid) Where B.cardid IS NULL是对的。事实上右外联都是通过转换为左外联实现的。
------------------------------------------------------
Select * FROM A INNER JOIN B ON (A.cardid<>B.cardid)
Select * FROM A LEFT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
Select * FROM A RIGHT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
运行结果:
一:
23 bb 1 16 34
25 cc 1 16 34
29 dd 1 16 34
30 ee 1 16 34
16 aa 2 25 300
23 bb 2 25 300
29 dd 2 25 300
30 ee 2 25 300
16 aa 3 29 1
23 bb 3 29 1
25 cc 3 29 1
30 ee 3 29 1
二:
23 bb NULL NULL NULL
30 ee NULL NULL NULL
三:
(无数据)
比如:
表A(主表)
cardid username
16 aa
23 bb
25 cc
29 dd
30 ee
表B(子表)
countid cardid score
1 16 34
2 25 300
3 29 1.5
在 cardid 列上联接 A 表和 B 表。
分别用内联、外联试试。
内联:
Select cardid FROM A INNER JOIN B ON (A.cardid<>B.cardid)
那么这样查询就会交叉地拿A和B去比较,上例来说就是拿『16,23,25,29,30』和16,25,29比。那么显然<>的结果是: 23,25,29,30,16,25,29,30。。。不符合我们的要求。因为内联本来就只有找相同的功能,没有找不同的功能。
左外联:
Select cardid FROM A LEFT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
这里会拿左表(A)的所有行去和B比较,上例来说是『16,23,25,29,30』先和16比较,然后再和23比较。它将包括所有A表内容,而对应的B表,符合条件就打印,否则没有的话会为null。所以这样就按要求得到了为null的值,也就是缺少的。
右外联:
Select cardid FROM A RIGHT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
这里会拿右表(B)的所有行去和A比较,上例来说是16,25,29和『16,23,25,29,30』比较。结果只包含B表的所有行。在这里显然不符合要求。
但Select cardid FROM B RIGHT OUTER JOIN A ON (B.cardid=A.cardid) Where B.cardid IS NULL是对的。事实上右外联都是通过转换为左外联实现的。
------------------------------------------------------
Select * FROM A INNER JOIN B ON (A.cardid<>B.cardid)
Select * FROM A LEFT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
Select * FROM A RIGHT OUTER JOIN B ON (B.cardid=A.cardid) Where B.cardid IS NULL
运行结果:
一:
23 bb 1 16 34
25 cc 1 16 34
29 dd 1 16 34
30 ee 1 16 34
16 aa 2 25 300
23 bb 2 25 300
29 dd 2 25 300
30 ee 2 25 300
16 aa 3 29 1
23 bb 3 29 1
25 cc 3 29 1
30 ee 3 29 1
二:
23 bb NULL NULL NULL
30 ee NULL NULL NULL
三:
(无数据)
评论: 0 | 引用: 0 | 查看次数: 2928
发表评论
你没有权限发表留言!
订阅
上一篇
下一篇
文章来自:
Tags: 




