数据库内联、左联和外联的区别

在关系型数据库中,数据分布在许多相关的表中,所以有时候的查询会涉及到多表查询。

INNER JOIN(内联):两个表a,b 相连接,取出符合连接条件的字段

LEFT JOIN(左联):先返回左表的所有行,再加上符合连接条件的匹配行

RIGHT JOIN(右联):先返回右表的所有行,再加上符合连接条件的匹配行


一、内连接——最常用 

定义:仅将两个表中满足连接条件的行组合起来作为结果集。 
在内连接中,只有在两个表中匹配的行才能在结果集中出现 
关键词:INNER JOIN 
格式:SELECT 列名表 FROM 表名1 [INNER] JOIN 表名2 ON或WHERE 条件表达式 
说明: 
(1)列名表中的列名可以出自后面的两个表,但如果两个表中有同名列,应在列名前标明出处,格式为:表名.列名 
(2)若连接的两个表名字太长,可以为它们起个别名。 格式为:表名 AS 别名 

(3)INNER是默认方式,可以省略

二、外连接 
1、左(外)连接 
定义:在内连接的基础上,还包含左表中所有不符合条件的数据行,并在其中的右表列填写NULL 
关键字:LEFT JOIN
eg:select * from   user left outer join product on user.uid =product.pid
注意: 

当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。

当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行

如果将条件放到where子句 中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:

eg:

条件在join子句

select *from   t_institution i left outer join t_teller t on i.inst_no = t.inst_no and i.inst_no = “5801”

结果是:
inst_no     inst_name             inst_no     teller_no   teller_name
5801        天河区                5801        0001        tom
5801        天河区                5801        0002        david
5802        越秀区
5803        白云区

条件在where子句
select * from   t_institution i left outer join t_teller t on i.inst_no = t.inst_no where i.inst_no = “5801”

结果是:
inst_no     inst_name             inst_no     teller_no   teller_name
5801           天河区                    5801          0001               tom
5801           天河区                    5801          0002              david

2、右(外)连接 
定义:
在内连接的基础上,还包含右表中所有不符合条件的数据行,并在其中的左表列填写NULL 
关键字:RIGHT JOIN 
3、完全连接 
定义:
在内连接的基础上,还包含两个表中所有不符合条件的数据行,并在其中的左表、和右表列填写NULL 
关键字:FULL JOIN

三、交叉连接 
定义:
将两个表的所有行进行组合,连接后的行数为两个表的乘积数。(笛卡尔积) 
关键词:CROSS JOIN 

格式:FROM 表名1 CROSS JOIN 表名2

用图说话:

数据库内联、左联和外联的区别_第1张图片


1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C

语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid

其实select * from A,B where A.Aid=B.Bnameid与Select * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。


2.外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN)

   (1)左连接(Left JOIN):即图3公共部分记录集C+表A记录集A1。     
      语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid

      

左连接数据

      

说明:

            在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1
            由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1,
          
   (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。
      语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid

            在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1
            
总结:
通过上面的运算解说,相信很多人已经想到,上面的情况(包括图3的关系图)说明的都只是A在B的左边的情况,
以下语句B在A的右边的又会出现什么情况呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid
其实对图3左右翻转一下就可以得出以下结论:
select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的记录集是一样的

select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的记录集也是一样的。

eg:

-------------------------------------------------
  a表     id   name     b表     id   job   parent_id   
              1   张3                   1     23     1   
              2   李四                 2     34     2   
              3   王武                 3     34     4       

  a.id同parent_id   存在关系   

 1) 内连接   
  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   

  2)左连接   
  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   
  3   王武                  null   

 3) 右连接   
  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id       
  结果是     
  1   张3                   1     23     1   
  2   李四                  2     34     2   
  null                       3     34     4   

 4) 完全连接   
  select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   
  结果是     
  1   张3                  1     23     1   
  2   李四                 2     34     2   
  null                   3     34     4   
  3   王武                 null

你可能感兴趣的:(数据库)