[No000083]图解SQL的各种连接join让你对SQL的连接一目了然

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

假设我们有两张表,TableA是左边的表,TableB是右边的表。

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


1


id


name


id


name


2


--


----


--


----


3


1


Pirate


1


Rutabaga


4


2


Monkey


2


Pirate


5


3


Ninja


3


Darth Vader


6


4


Spaghetti


4


Ninja

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

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


1


SELECT * FROM TableA INNER JOIN TableB


2


ON TableA.name = TableB.name


3


id


name


id


name


4


--


----


--


----


5


1


Pirate


2


Pirate


6


3


Ninja


4


Ninja

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


01


SELECT * FROM TableA FULL OUTER JOIN TableB


02


ON TableA.name = TableB.name


03


id


name


id


name


04


--


----


--


----


05


1


Pirate


2


Pirate


06


2


Monkey


null


null


07


3


Ninja


4


Ninja


08


4


Spaghetti


null


null


09


null


null


1


Rutabaga


10


null


null


3


Darth Vader

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


01


SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name


02


ON TableA.name = TableB.name


03


id


name


id


name


04


--


----


--


----


05


1


Pirate


2


Pirate


06


2


Monkey


null


null


07


3


Ninja


4


Ninja


08


4


Spaghetti


null


null


09


null


null


1


Rutabaga


10


null


null


3


Darth Vader


01


SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name


02


id


name


id


name


03


--


----


--


----


04


1


Pirate


2


Pirate


05


2


Monkey


null


null


06


3


Ninja


4


Ninja


07


4


Spaghetti


null


null


01


SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null


02


id


name


id


name


03


--


----


--


----


04


2


Monkey


null


null


05


4


Spaghetti


null


null

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


01


SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null


02


id


name


id


name


03


--


----


--


----


04


2


Monkey


null


null


05


4


Spaghetti


null


null


06


null


null


1


Rutabaga


07


null


null


3


Darth Vader

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

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


01


SELECT * FROM TableA


02


CROSS JOIN TableB

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

时间: 2024-11-06 04:03:20

[No000083]图解SQL的各种连接join让你对SQL的连接一目了然的相关文章

SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)

SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有如下表: 一个为投票主表,一个为投票者信息表-记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准-1:如右接连 right join 或 right outer join:我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存

图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示

SQL内连接-外连接join,left join,right join,full join

1.创建测试表test1及test2 SQL> CREATE TABLE TEST1(ID NUMBER,NAME VARCHAR2(20)); 表已创建. SQL> create table test2(id number, country varchar2(10)); 表已创建. INSERT INTO TEST1 VALUES(1,'name1'); INSERT INTO TEST1 VALUES(2,'name2'); INSERT INTO TEST1 VALUES(3,'name

[15]SQL 连接(JOIN)

[15]SQL 连接(JOIN) SQL join 用于把来自两个或多个表的行结合起来. SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN). SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行. 下面是选自 "Websites" 表的数据: +----+--------------+---------------------------+-------+

SQL的各种连接Join详解

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN).SQL LEFT JOIN.SQL  RIGHT JOIN.SQL FULL JOIN,其中前一种是内连接,后三种是外链接. 假设我们有两张表,Table A是左边的表,Table B是右边的表. id name 1 Google 2 淘宝 3 微博 4 Facebook id address 1 美国 5 中国 3 中国 6 美国 一

2014-08-13 SQL语句之Left Join

今天是在吾索实习的第26天.这天在处理数据库数据的时候发现了一个不错的语句就是Left Join,即左连接.  其功能是:即使右表中没有匹配,也从左表返回所有的行.也就是说,显示的行数与左表一致,且当右表没有相应数据时,会用NULL或0补上.如下: 如此类推,右连接Right Join亦然. 2014-08-13 SQL语句之Left Join,布布扣,bubuko.com

sql中的inner join ,left join ,right join

左连接LEFT JOIN, 也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的数据是否满足连接条件,均输出左端表中的内容.不满足连接条件的 ,连接字段栏位将对应为空值,这样可以观察到满足条件的和不满足条件的信息. 右连接 RIGHT JOIN 右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的数据是否满足连接条件,均输出右表中的内容. 内连接 INNER JOIN 只输出满足条件的内容 sql之lef

SQL中的Filter, join, semi-join等概念的释义

经常在工作中用到,虽然当年在数据库原理课程中学习过,不过基本已经还给老师了.工作这么多年,感觉自己在学习上倒退了很多,惭愧.这篇帖子,作为SQL相关知识的整理贴. 1.semi-join(半连接)(来自:http://wiki.answers.com/Q/What_is_semi_join_in_SQL) 半连接返回表中能够与另一表中连接的记录(并不执行一次全连接),它并没有一个明确的语法格式. A semi-join returns rows from one table that would

SQL高级应用(Join、Inner Join、Left Join、Right Join、Full Join)

SQL JOIN SQL Join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果,就需要执行 Join. 数据库中的表可以通过键将彼此联系起来.主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的.在表中,每个主键的值都是唯一的.这样的目的是在不重复每个表中的所有的数据的情况下,把表间的数据交叉捆绑在一起 请看 "Persons" 表: Id_P LastName FirstName Addre