文档章节

SQL的内连接与外连

sms95
 sms95
发布于 2015/04/29 20:32
字数 1296
阅读 6
收藏 0

转自:http://pangaoyuan.javaeye.com/blog/713177

有两个表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的部分



© 著作权归作者所有

共有 人打赏支持
sms95
粉丝 1
博文 31
码字总数 22644
作品 0
长沙
私信 提问
5Python全站之路系列之MySL连表查询

Python全栈之路系列之MySQL连表查询 普通的连表查询,把一个的结果当作另外一个的参数 SELECT * FROM personnel.person_info where personnel.person_info.part_nid in (SELECT nid from per...

Edenwy
2017/05/15
0
0
Hibernate查询、 检索、 抓取 (Fetch)

一、HQL 在hql中关键字不区分大小写,但属性和类名区分大小写 简单属性查询 * 单一属性查询,返回结果集属性列表 * 多个属性查询,返回集合元素是对象数组,数组长度取决于select中属性个数 ...

程海峰
2013/06/04
0
0
Django查询优化之select_related和prefetch_related

一、select_related查询优化 select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能。本文通过D...

daibaiyang119
2017/10/30
0
0
PowerPivot 和 SQL Azure 快速入门

公告:本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题,会影响阅读体验。如遇此情况,请访问原博客。 PowerPivot是一款微软Excel 2010 的可下载 插件 ,其强大功能允许您...

晨曦之光
2012/03/09
0
0
mysql 连接查询(俗称连表查询)

连接查询的分类 本文讨论中用到的测试数据 create table student( id int primary key auto_increment, name varchar(10) ); insert into student values (null,'xiaohong'), (null,'xiaomi......

20130902
05/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0
深入理解Plasma(四):Plasma Cash

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。 深入理解Plasma(1):...

HiBlock
昨天
1
0
命令参数的三大风格:Posix、BSD、GNU

今天读到命令行中参数的风格有三大类,即Unix/Posix、BSD、GNU。分别有以下特征: Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 BSD风格,即命令后的参数,可...

大别阿郎
昨天
2
0
PHP生成图片验证码

PHP生成图片验证码 /** * PHP生成图片验证码 * Class VerifyImage */class VerifyImage{ // 生成随机字串 private $verifyCode; // 图片对象 private $image; /**...

DrChenXX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部