SQL的内连接与外连接

转载 2015年11月20日 15:57:57

     有两个表A和表B。
  表A结构如下:
  Aid:int;标识种子,主键,自增ID
  Aname:varchar
  数据情况,即用select * from A出来的记录情况如下图1所示:

 

表B结构如下:
  Bid:int;标识种子,主键,自增ID
  Bnameid:int
  数据情况,即用select * from B出来的记录情况如下图2所示:

图2:B表数据

  为了把Bid和Aid加以区分,不让大家有误解,所以把Bid的起始种子设置为100。
  有SQL基本知识的人都知道,两个表要做连接,就必须有个连接字段,从上表中的数据可以看出,在A表中的Aid和B表中的Bnameid就是两个连接字段。
  下图3说明了连接的所有记录集之间的关系:



图3:连接关系图
现在我们对内连接和外连接一一讲解。
  1.内连接:利用内连接可获取两表的公共部分的记录,即图3的记录集C
  语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
  运行结果如下图4所示:

图4:内连接数据

  其实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
  运行结果如下图5所示:


图5:左连接数据

  说明:
  在语句中,A在B的左边,并且是Left Join,所以其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1
  在图3中即记录集C中的存在的Aid为:2 3 6 7 8
  图1中即表A所有记录集A中存在的Aid为:1 2 3 4 5 6 7 8 9
  表A记录集A1中存在的Aid=(图1中即A表中所有Aid)-(图3中即记录集C中存在的Aid),最终得出为:1 4 5 9
  由此得出图5中A左连接B的记录=图3公共部分记录集C+表A记录集A1,
  最终得出的结果图5中可以看出Bnameid及Bid非NULL的记录都为图3公共部分记录集C中的记录;Bnameid及Bid为NULL的Aid为1 4 5 9的四笔记录就是表A记录集A1中存在的Aid。
  (2)右连接(Right JOIN):即图3公共部分记录集C+表B记录集B1。
  语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
 运行结果如下图6所示:
图6:右连接数据

  说明:
  在语句中,A在B的左边,并且是Right Join,所以其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1
  在图3中即记录集C中的存在的Aid为:2 3 6 7 8
  图2中即表B所有记录集B中存在的Bnameid为:2 3 6 7 8 11
  表B记录集B1中存在的Bnameid=(图2中即B表中所有Bnameid)-(图3中即记录集C中存在的Aid),最终得出为:11
  由此得出图6中A右连接B的记录=图3公共部分记录集C+表B记录集B1,
  最终得出的结果图6中可以看出Aid及Aname非NULL的记录都为图3公共部分记录集C中的记录;Aid及Aname为NULL的Aid为11的记录就是表B记录集B1中存在的Bnameid。
  总结:
  通过上面的运算解说,相信很多人已经想到,上面的情况(包括图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所得出的记录集也是一样的。

 

 


Another  Demo from  http://mouer.javaeye.com/blog/901153

在oracle的SQL语句常用的连接有内连接(inner join),外连接(outer join)等,内连接又包括等值连接,非等值连接,自连接;而外连接又分为左连接和右连接。其中默认的是内连接的等值连接。

内连接:利用内连接(等值)就可获取公共部分C,图中的数据集C.

select * from A inner join B on A.Aid=B.Bid;等价于select * from A,B where A.Aid=B.Bid 图中C的部分

外连接:分为左外连接(left join)与右外连接(right join)
左外连接:select * from A,B where A.Aid=B.Bid(+);等价于select * from A left outer joinB on A.id=B.id图中A+C的部分

右外连接:select * from A,B where A.Aid(+)=B.Bid;等价于select * from Aright outer joinB on A.id=B.id图中B+C的部分



SQL 内连接,外连接

  • 2009年11月05日 17:25
  • 269KB
  • 下载

SQL有外连接的时候注意过滤条件位置

2013年/5月/2日   奶奶的,为啥现在五一节只放3天,5月的天气最适合出游了,不过俺们这些苦逼的IT男是没法享受了。 一来到公司,项目经理就找到开发leader,说我们网站 页面很慢,让他...

sql内连接、外连接

  • 2012年04月18日 20:06
  • 2KB
  • 下载

sql内连接和外连接

  • 2016年12月14日 14:05
  • 385KB
  • 下载

简述SQL中的外连接

简述SQL中的“外连接”   1、SQL中外连接分为三种:左外连接、右外连接、全外连接。 2、英文书写格式: 左外连接:LEFT OUTER JOIN(LEFT JOIN); 右外连接:RIGHT O...

SQL 中的左外连接和+号的用法

Oracle 左连接、右连接、全外连接、(+)号作用 Oracle  外连接 (1)左外连接 (左边的表不加限制)        (2)右外连接(右边的表不加限制)  ...
  • pianzif
  • pianzif
  • 2014年04月28日 22:38
  • 6584

SQL优化经典案例----外连接where条件位置优化

SQL优化经典案例----外连接where条件位置优化   ---转载http://blog.sina.com.cn/s/blog_61cd89f60102efc9.html    ...

你真的会玩SQL吗?内连接、外连接

大多数人一般写多表查询会这样写select * from tbA ,tbB  没有用到JOIN关键字,太Low了,官网标准建议是用JOIN明确表间的关系,下面具体来讲。 连接类型: ...

SQL内连接、左外链接、右外连接、交叉链接区别

SQL内连接、左外链接、右外连接、交叉链接区别                                                                — —你可以做到任何事,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL的内连接与外连接
举报原因:
原因补充:

(最多只允许输入30个字)