`
llmy
  • 浏览: 120937 次
  • 性别: Icon_minigender_2
  • 来自: 济南
社区版块
存档分类
最新评论

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

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(+);

的记录数及不同了。

 

多表左/右连接,表的连接顺序也可以影响查询速度

左连接时,应该把小表放在前面连接
例子:
A、B、C三表左连接
情况1:
A先和B连接,得到100条记录
100条记录再和C左连接
情况2:
A先和C连接,得到50条记录
50条记录再和B左连接

右连接时,把小表放在后面连接

 

http://blog.csdn.net/winter3125/article/details/5032871#comments

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics