sql join - 加入多个表

时间:2010-11-02 14:17:16

标签: sql oracle join left-join inner-join

我正在努力了解加入,我有点困惑。我知道如何使用

连接表
=
<=

在    存在而不存在

我试图尝试理解INNER JOIN,LEFT OUTER JOIN,USING等的使用,但它太令人困惑了。我遇到的主要问题是不同的人使用不同的名称来引用它们。是否有一个关于不同类型的连接的简单解释以及它们所知的其他名称。例如,谷歌搜索我遇到以下类型

♦ Simple Join
♦ Equi join
♦ Natural Join
♦ Outer Join
♦ Self Join
♦ Cartesian join
♦ Inner join
♦ Nonequi join
♦ Theta join
♦ Self join 
♦ Cross join
♦ Cross Joins
♦ Natural Joins
♦ Inner Join with USING Clause
♦ Inner Join with ON Clause
♦ Left Outer Join
♦ Right Outer Join
♦ Full OuterJoin

以上大多数都是重复的,即它的连接类型相同但名称不同。我相信所有上述内容都可以使用(=,!=,not in,in exists等)中的一个来重新创建,但我正在努力解决哪个是哪个以及它们之间的区别。图表可能会有所帮助:)

5 个答案:

答案 0 :(得分:11)

答案 1 :(得分:2)

对于马修的帖子没有解释过的一些内容:

简单连接 - 非显式连接,默认为内连接

a join b on a.id = b.id

自然连接 - 这会在所有具有相同名称的列上进行内连接

a natural join b

自我加入 - 这是自己加入一个表,它可以是任何其他类型的加入(内部自我加入,外部自我加入等)

a "a1" join a "a2" on "a1".id = "a2".id

笛卡尔连接 - 这是行的每个可能组合,您总是会得到两个表中行数的乘积。您可以使用内部联接而不指定连接条件

a join b

交叉连接 - 这是笛卡尔连接的同义词

使用USING子句进行内部联接 - 这是连接条件的替代语法,如果两个表都具有匹配的列名,则可以使用它

a join b using (id)

使用ON子句进行内部连接 ​​- 这与我为简单连接所显示的相同,唯一的其他语法是加入where子句(如下所示)

a join b where a.id = b.id

左外连接 - 与左连接相同 右外连接 - 与右连接相同。它就像一个左连接,但是你在第一个表而不是第二个表上得到空值

答案 2 :(得分:2)

顺便说一句,只是阅读JOIN。 MySQL语法有什么变化吗? Oracle使用PLSQL语法,它与其他数据库有点不同。

我有以下情况

Fisrt查询

SELECT * FROM tbl1 LEFT JOIN (tbl2, tbl3, tbl4)
    ON (tbl2.field1=tbl1.field1 AND tbl3.filed2=tbl1.field2 AND tbl4.field3=tbl1.field3)

第二次查询

SELECT * FROM tbl1 LEFT JOIN (tbl2 CROSS JOIN tbl3 CROSS JOIN tbl4)
    ON (tbl2.field1=tbl1.field1 AND tbl3.filed2=tbl1.field2 AND tbl4.field3=tbl1.field3)

Fisrt查询第二次查询相同。

谢谢大家!

答案 3 :(得分:1)

编辑:刚刚遇到http://www.gplivna.eu/papers/sql_join_types.htm,尽管是技术性的,但它提供了对sql连接类型的相当好的概述。值得一看

这是另一个页面,其中解释了一些连接(http://blog.noobtech.com/index.php/2009/02/sql-joins-visual-cheat-sheet/

我刚要发布的页面是@matthew葡萄藤已发布的页面:)

答案 4 :(得分:1)

Oracle SQL Language Reference有一个很好的部分,关于什么是连接和不同的连接类型。