SQL指南-JOIN
Joins 和 Keys
某些情况下,我们不得不选择两个或者更多的表以返回结果。我们不得不执行一个连接。数据库中的表会涉及到相互间的keys。主键为列的每一行的唯一值。目的是将数据绑定到一起。横跨表,每个表中没有重复的数据。
下面的"Employees"表中, "Employee_ID" 列是主键,意味着没有相同的两行Employee_ID。Employee_ID甚至可区别两个有相同的名字的人。
当我们看下面的示例表时,请留意:
- "Employee_ID" 列是"Employees" 表的主键
- "Prod_ID" 列是"Orders" 表的主键
- "Orders" 表中的 "Employee_ID" 列用于查阅 "Employees" 表中的persons,并没有使用它们的name
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 |
------------------------------------------
使用Joins
或者我们可以使用JOIN从两个表选择,如示:
内部连接示例
语法
SELECT field1, field2, field3 FROM first_table INNER JOIN second_table ON first_table.keyfield = second_table.foreign_keyfield |
谁下了定单,他们定购了什么?
SELECT Employees.Name, Orders.Product FROM Employees INNER JOIN Orders ON Employees.Employee_ID=Orders.Employee_ID |
INNER JOIN 返回两表相匹配的所有记录行。如果在Employees表中有不匹配Orders表的记录,这些记录行将不会被列示出来。
Name | Product |
---|---|
Hansen, Ola | Printer |
Svendson, Stephen | Table |
Svendson, Stephen | Chair |
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 |
LEFT JOIN 从第一个表返回返回所有记录行,即使有不匹配第二个表(Orders)的记录。如果Employees表中有与Orders表不匹配的记录行,它们也会被列示出来。
结果
Name | Product |
---|---|
Hansen, Ola | Printer |
Svendson, Tove | |
Svendson, Stephen | Table |
Svendson, Stephen | Chair |
Pettersen, Kari |
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 |
RIGHT JOIN 从二个表中返回所有记录行,即使有不匹配第一个表(Employees)的记录。如果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 |