图解SQL的各种连接join

来源:互联网 发布:把java程序打包成exe 编辑:程序博客网 时间:2024/04/28 22:40

表格摘自:http://blog.csdn.net/u012861978/article/details/52203818


不同的 SQL JOIN

连接类型

定义

 

Inner Join

内连接是最常见的一种连接,它也被称为普通连接,只连接匹配的行(仅对满足连接条件的CROSS中的列)。它又分为等值连接(连接条件运算符为"=")和不等值连接(连接条件运算符不为"=",例如between...and)。

 

Outer Join

Full Outer Join

FULL JOIN 会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替

Left Outer Join

LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

Right Outer Join

RIGHT JOIN返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。

 Cross Join

CROSS对两个表执行笛卡尔乘积。它为左表行和右表行的每种可能的组合返回一行。返回(左表行数*右表行数)行的表。

 

 

Appendix      

Natural Join

自然连接是一种特殊的等值连接,在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

自连接

某个表和其自身连接,常用在同一表内不同数据间对同一列的比较



原文:http://www.nowamagic.net/librarys/veda/detail/936


对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。我觉得清楚易懂,转过来。

假设我们有两张表,Table A是左边的表,Table B是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

1id name       id  name
2-- ----       --  ----
31  Pirate     1   Rutabaga
42  Monkey     2   Pirate
53  Ninja      3   Darth Vader
64  Spaghetti  4   Ninja

下面让我们来看看不同的Join会产生什么样的结果。

1SELECT FROM TableA INNERJOIN TableB
2ON TableA.name = TableB.name
3id  name       id   name
4--  ----       --   ----
51   Pirate     2    Pirate
63   Ninja      4    Ninja

Inner join
产生的结果集中,是A和B的交集。

Venn diagram of SQL inner join
01SELECT FROM TableA FULLOUTER JOIN TableB
02ON TableA.name = TableB.name
03id    name       id    name
04--    ----       --    ----
051     Pirate     2     Pirate
062     Monkey     null  null
073     Ninja      4     Ninja
084     Spaghetti  null  null
09null    null    1     Rutabaga
10null    null    3     Darth Vader

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

Venn diagram of SQL cartesian join
1SELECT FROM TableA LEFTOUTER JOIN TableB ONTableA.name = TableB.name
2id  name       id    name
3--  ----       --    ----
41   Pirate     2     Pirate
52   Monkey      null    null
63   Ninja      4     Ninja
74   Spaghetti   null    null

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

Venn diagram of SQL left join
1SELECT FROM TableA LEFTOUTER JOIN TableB ONTableA.name = TableB.nameWHERE TableB.id IS null
2id  name       id     name
3--  ----       --     ----
42   Monkey  null    null
54   Spaghetti   null    null

产生在A表中有而在B表中没有的集合。

join-left-outer.png
view source
print?
1SELECT FROM TableA FULLOUTER JOIN TableB ONTableA.name = TableB.nameWHERE TableA.id IS null ORTableB.id IS null
2id    name       id    name
3--    ----       --    ----
42     Monkey    null    null
54     Spaghetti null    null
6null    null    1     Rutabaga
7null    null    3     Darth Vader

产生A表和B表都没有出现的数据集。

join-outer.png

还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

1SELECT FROM TableA
2CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胰高血糖素高怎么办 胃部胀气老是排不出来怎么办 考研报名号忘了怎么办 高中学考不过关怎么办 100兆网速好慢怎么办 快穿之宿主太懒怎么办 眼睛第二天肿了怎么办 被奇异鸟公司骗怎么办 低保户名下有车怎么办 凤思奇遇没接到怎么办 小孩感冒鼻塞怎么办速效办法 额头上总长痘痘怎么办 p2p理财跑路了怎么办 南诏皇宫qte拉脱怎么办 轻柔鹏羽摧毁了怎么办 qq飞车账号封了怎么办 电脑玩游戏掉帧怎么办 手机玩游戏掉帧怎么办 讨债人到家里闹怎么办 老公出轨了他不承认怎么办 手机刷机卡住了怎么办 苹果刷机卡住了怎么办 红米返回键失灵怎么办 牧马人鼠标连点怎么办 雷蛇鼠标连点怎么办 赛睿鼠标连键怎么办 苹果5s死机了怎么办 苹果7p突然死机怎么办 手机3个按键失灵怎么办 机械键盘w键失灵怎么办 微信号被投诉了怎么办 罗技键盘坏了怎么办 吃了发红的甘蔗怎么办 哥哥揉我胸该怎么办 他老婆怀疑我了怎么办 老是怀疑老公有外遇怎么办 老婆我又没得换怎么办 百度云账号忘了怎么办 网易云密码忘了怎么办 百度网盘下载慢怎么办 网盘下载太慢怎么办