现在的位置: 首页 > 综合 > 正文

SQL JOIN 的用法

2013年01月30日 ⁄ 综合 ⁄ 共 3769字 ⁄ 字号 评论关闭
文章目录

 

Joins 和 Keys

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行join。

数据库中的表可通过键将彼此联系起来。一个主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。Employee_ID会区分开每一个人,即使他们中的人都着相同的名字。

当你看到下面的例子时,请注意以下几点:

  • "Employee_ID"列是"Employees"表的主键
  • "Prod_ID"列是"Orders"表的主键
  • 表"Orders"中的"Employee_ID"列用于引用"Employees"表中的员工,而无需使用他们的确切姓名

表 Employees:

Employee_ID Name
01 Hansen, Ola
02 Svendson, Tove
03 Svendson, Stephen
04 Pettersen, Kari

表 Orders:

Prod_ID Product Employee_ID
234 Printer 01
657 Table 03
865 Chair 03

引用两个表

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

实例

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

SELECT Employees.Name, Orders.Product FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID

结果:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

实例

谁订购了打印机?

SELECT Employees.Name
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = 'Printer'

结果:

Name
Hansen, Ola

使用Join

我们也可以使用关键词JOIN来从两个表中获取数据:

内连接(INNER JOIN)

语法:

SELECT 字段1, 字段2, 字段3
FROM 第一个表
INNER JOIN 第二个表
ON 第一个表.keyfield = 第二个表.foreign_keyfield

实例

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

SELECT Employees.Name, Orders.Product
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID

内连接会返回两个表中所匹配的所有的行。假如某些Employees中的行与Orders中的行不匹配,那些行就不会被列出来。

结果:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

Example 左连接(LEFT JOIN)

语法:

SELECT field1, field2, field3
FROM first_table
LEFT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield

实例

列出所有的雇员,以及他们的定购产品 - 如果有的话。

SELECT Employees.Name, Orders.Product
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID

左连接会第一个表(Employees)那里返回所有的行,即使在第二个表(Orders)中没有匹配的行。假如某些Employees中的行没有在Orders中可匹配的行,这些行业会被列出来。

结果:

Name Product
Hansen, Ola Printer
Svendson, Tove  
Svendson, Stephen Table
Svendson, Stephen Chair
Pettersen, Kari  

Example 右连接(RIGHT JOIN)

语法:

SELECT field1, field2, field3
FROM first_table
RIGHT JOIN second_table
ON first_table.keyfield = second_table.foreign_keyfield

实例

列出所有的定单,以及定购者 - 如果有的话。

SELECT Employees.Name, Orders.Product
FROM Employees
RIGHT JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID

右连接会从第二个表格(Orders)那里返回所有的行,即使在第一个表格中没有可匹配的行。假如Orders中的某些行没有在Employees可匹配的行,那些行也会被列出。

结果:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

实例

谁定购了打印机?

SELECT Employees.Name
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID=Orders.Employee_ID
WHERE Orders.Product = 'Printer'

结果:

Name
Hansen, Ola

最简洁的语言说明数据库内连接与外连接的概念:

内连接:若连接的结果集中只保留了符合连接条件的元组,而排除了两个表中没有对应的或匹配的元组情况,这种连接称为内连接。在内连接的查询结果中,会丢失一部分信息。
外连接:如果要求查询结果集中保留非匹配的元组,则为外连接。

外连接分左右和全外连接。内连接不分。

INNER JOIN ……ON的语法格式可以概括为:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号
您只要套用该格式就可以了。

连接两个数据表的用法:
FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort
语法格式可以概括为:
FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

连接三个数据表的用法:
FROM (Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel 
语法格式可以概括为:
FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

连接四个数据表的用法:
FROM ((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity
语法格式可以概括为:
FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号

连接五个数据表的用法:
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
语法格式可以概括为:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

抱歉!评论已关闭.