SQL语句中的JOIN语句

      要理解join语句,首先得明白笛卡尔乘积(即集合的乘运算),其定义如下:

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。

      在SQL的join联结操作中,其实也是先对表做笛卡尔积,然后再对结果集合进行选取操作,选取满足条件的部分作为结果,这里需要注意的是,如何把表看做一

集合,本来表中是一个二维数据,我们把表中的一行数据(即一个记录)看做是这个表集合中的一个元素,然后进行笛卡尔积运算。

      举例如下(例子来自于W3school):

请看 "Persons" 表:

Id_PLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。

接下来请看 "Orders" 表:

Id_OOrderNoId_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。

请留意,"Id_P" 列把上面的两个表联系了起来。

引用两个表

我们可以通过引用两个表的方式,从两个表中获取数据:

谁订购了产品,并且他们订购了什么产品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

结果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

SQL JOIN - 使用 Join

除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。

如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

不同的 SQL JOIN

除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

  • JOIN(内联接): 如果表中有至少一个匹配,则返回行(注释:INNER JOIN 与 JOIN 是相同的。)
  • LEFT JOIN(左外联接:): 即使右表中没有匹配,也从左表返回所有的行(注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。)
  • RIGHT JOIN(右外联接): 即使左表中没有匹配,也从右表返回所有的行(注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。)
  • FULL JOIN(全外联接): 只要其中一个表中存在匹配,就返回行(注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。)

解释:联结操作的结果集也是以行为元素的,这里说的匹配,指ON后面的条件是否满足,满足则匹配。

      另外还有:CROSS JOIN:笛卡尔乘积(所有可能的行对);这种联结没有后面的ON条件,返回集合乘积的全部结果(注意:除了cross join外其他是都有on条件的)。

      如果还不能理解,就拿集合来进一步说明:

      假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。注意,集合中的元素a,b;0,1,2分别代表表中一个行的数据,(a,0)就代表结果的一条记录,如果是内联接,判断每条结果结果记录中的各列是否满足ON后面的条件,满足则作为最终结果的一条记录,否则丢弃。而外联结以左外联结为例,遍历左边集合A(表)每个元素,每个元素都遍历右边的集合B(表)的每个元素,存在匹配则作为返回结果,如果遍历完B每个元素后没有一个匹配,则取A表的该元素,本来该取得B的部分全部取空,组成返回结果的一条记录。

      对左联接做如下举例:

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

注意黄色部分与第一个例子的不同。右联接与左联接完全雷同。再举一个全(外)联接的例子:

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

结果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George  
    34764

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

注意红色部分与前面两个例子的不同。

posted on 2012-07-27 15:30  albert1017  阅读(15888)  评论(3编辑  收藏  举报

导航