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 |
浙公网安备 33010602011771号