【转】inner join,left out join,right out join三者的不同用法

jion 语句有三种,inner join, left outer join 和 right outer join 都可以简写,分别为jion,left join,right jion。

jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联接在一起新生成的表,而一般的select 语句没有这个功能。
1) 内连接,inner join ... on
语句格式:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号)
INNER JOIN 表3 ON 表1.字段号=表3.字段号)
INNER JOIN 表4 ON Member.字段号=表4.字段号)
INNER JOIN 表X ON Member.字段号=表X.字段号
例:

SELECT *
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) 
INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) 
INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) 
NNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
ORDER BY MemberDate DESC

 

内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。

2)左外连接,left outer join ... on
语句格式:

  FROM [表名1] LEFT JOIN [表名2]
  ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]

 

其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN 和LEFT JOIN 相反。

外连接的功能是,把LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也保留,而右边表的字段为null.

3)右外连接,right outer join ... on
与 left join左右相反。

4)全连接,full join ... on(不常使用,只能用于outer)

功能结合了以上三种联军,先执行一次inner join,然后把两个表的多余字段都保留,但连接的对应字段为null.
如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个表联接起来:
FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)
INNER JOIN 表3 ON 表1.序号=表3.序号

通俗的讲:
A left join B 的连接的记录数与A表的记录数同
A right join B 的连接的记录数与B表的记录数同
A left join B 等价B right join A

table A: 
Field_K, Field_A 
1          a 
3          b 
4         c

table B: 
Field_K, Field_B 
1        x 
2         y 
4         z 

select a.Field_K, a.Field_A, b.Field_K, b.Field_B 
from a left join b on a.Field_K=b.Field_K 

Field_K       Field_A   Field_K    Field_B 
---------- ---------- -------- ---------- 
1      a      1      x 
3      b      NULL    NULL 
4      c      4      z

select a.Field_K, a.Field_A, b.Field_K, b.Field_B 
from a right join b on a.Field_K=b.Field_K

Field_K    Field_A  Field_K    Field_B 
---------- ---------- ---------- ---------- 
1      a      1      x 
NULL    NULL     2      y 
4      c      4      z

举个例子:

假设a表和b表的数据是这样的。 
a       b 
id name  id stock  
1  a    1 15 
2   b    2 50 
3   c  

select * from a inner join b on a.id=b.id

这个语法是连接查询中的内连接,它产生的结果是

两个表相匹配的记录出现在结果列表中。

根据上面的表,出现的结果是这样的

a.id name       b.id    stock 
1   a          1    15 
2   b         2    50

----------------------------

select * from a,b where a.id=b.id 
这个语法是内连接的另外一种写法,其执行结果与inner join 一样
-------------------------------- 
select * from a left/right join b on a.id=b.id 
这个是外连接语法中的左外连接或右外连接 
如果是左外连接的话,它将显示a表的所有记录, 
select a.*,b.* from a left join b on a.id=b.id 
查询的结果是这样的: 
a.id name   b.id    stock 
1   a     1       15 
2   b     2      50 
3   c      null    null 

-------------------------------------------- 
如果是右外连接的话,它将显示b表的所有记录, 
select a.*,b.* from a right join b on a.id=b.id 
查询的结果是这样的: 
a.id name    b.id    stock 
1   a        1       15 
2   b        2       50 
--
select a.*,b.* from a left join b on a.k = b.k 
select a.*,b.* from a left outer join b on a.k =b.k

----------上面两种一样left join是left outer join的简写 
select a.*,b.* from a left inner join b on a.k = b.k 
没有这种写法,错误的语句.

 

 

 

posted @ 2013-01-18 17:12  Peyton  阅读(330)  评论(0编辑  收藏  举报