当前位置: 代码迷 >> SQL >> sql中的内联接、左连接、右连接、全连接
  详细解决方案

sql中的内联接、左连接、右连接、全连接

热度:39   发布时间:2016-05-05 13:29:00.0
sql中的内连接、左连接、右连接、全连接

表A:

???????
?AID ANAME????????????????BID
---- -------------------- ----------
?? 1?? a1??????????????????????????? 2
?? 2?? a2??????????????????????????? 3
?? 3?? a3??????????????????????????? 4
?? 4?? a4??????????????????????????? 5

?

表B:

? BID BNAME
----- -----
??? 2??? b1
??? 3??? b2
??? 6??? b5
??? 7??? b9
??? 8??? b9?????

?

?1、内连接仅选出两张表中相互匹配的记录;

? select a.*,b.* from A join b on a.bid=b.bid;或者 select a.*,b.* from A,b where a.bid=b.bid;

?

查询结果:结果行数等于两表bid相同记录数

? AID ANAME???????????????BID??????BID BNAME
---- -------------------- ---------- ---------- -----
?? 1 a1??????????????????????????? 2????????? 2???? b1
?? 2 a2??????????????????????????? 3????????? 3??? ?b2?

??????
2、左连接包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
select?a.*,b.* from a left join b on a.bid=b.bid;或select a.*,b.* from a,b where a.bid=b.bid(+);


?查询结果:结果行数等于左边表的记录数

?AID ANAME?????????????????BID??????BID BNAME
---- -------------------- ---------- ---------- ------
?? 1? a1??????????????????????????? 2????????? 2??? ?b1
?? 2 ?a2??????????????????????????? 3????????? 3??? ?b2
?? 4? a4??????????????????????????? 5
?? 3? a3??????????????????????????? 4

?

3、右连接包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。
select a.*,b.* from a right join b on a.bid=b.bid;或select a.*,b.* from a,b where a.bid(+)=b.bid;

?

查询结果:结果行数等于右边表的记录数
?AID????? ANAME?????????????????BID??????? BID? ?BNAME
---- -------------------- ---------- ---------- -----
?? 1?????? a1????????????????????????????? 2?????????? ?2??? ? b1
?? 2?????? a2???????????????????????????? ?3??????????? 3???? ?b2
?????????????????????????????????????????????????????????????6????? b5
?????????????????????????????????????????????????????????????7????? b9
?????????????????????????????????????????????????????????????8??????b9

?

4、全连接左右表中所有记录都会选出来。

?select a.*,b.* from a full outer join b on a.bid= b.bid;

?

查询结果:结果行数等于a表记录数+b表记录数-内连接结果行数
?AID ANAME????????BID??????? BID BNAME
---- -------------------- ---------- ---------- ------
?? 1 a1?????????????????????2????????? 2???? b1
?? 2 a2?????????????????????3????????? 3???? b2
?? 4 a4?????????????????????5
?? 3 a3?????????????????????4
???????????????????????????????????????????6???? b5
???????????????????????????????????????????7???? b9
???????????????????????????????????????????8???? b9

?

??
????? 数据库中的空值(NULL)。
  有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。
  空值不等同于字符串中的空格,也不是数字类型的0。因此,判断某个字段值是否为空值时不能使用=,<>这些判断符。必需有专用的短语:IS NULL 来选出有空值字段的记录,同理,可用 IS NOT NULL 选出不包含空值的记录。

?

问题:当有多个表之间进行左右连接时,如果用where来进行左右连接,他们的顺序改怎么处理

在只有两个表进行左右连接的时候好像没有区别。

当表>2时,

比如加c表:


? ID CNAME
---- -----
?? 2 cname

?

select?a.aname,b.bname,c.cname from a left join b on a.bid=b.bid left join c on b.bid=c.id;

和select?a.aname,b.bname,c.cname from a,b,c where a.bid=b.bid(+) and?b.bid=c.id(+);

?

?

select?a.aname,b.bname,c.cname from b left join?c on b.bid=c.id left join?a on a.bid=b.bid;

和select?a.aname,b.bname,c.cname from a,b,c where b.bid=c.id(+) and? a.bid=b.bid(+);

的记录数及不同了。

该怎么看用where修饰的左右连接的顺序问题呢?

  相关解决方案