Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2038340
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类:

2008-07-10 19:15:35

Join 和 Key

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

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

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

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

表 Employees:

Employee_ID Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

表 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
Adams, John Printer
Carter, Thomas Table
Carter, Thomas Chair

实例

谁订购了打印机?

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

结果:

Name
Adams, John

使用 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
Adams, John           
Printer
Carter, Thomas Table
Carter, Thomas 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
Adams, John Printer
Bush, George  
Carter, Thomas Table
Carter, Thomas Chair
Gates, Bill  

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
Adams, John Printer
Carter, Thomas Table
Carter, Thomas Chair

实例

谁定购了打印机?

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

结果:

Name
Adams, John
阅读(1153) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~