Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行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 |