版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yx0628/article/details/80287575
联结,可以用来在一条 SELECT 语句中关联表。
基础联结
WHERE子句
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行进行配对。行的数目其实是第一个表中的行数和第二个表中行数的乘积。而使用 WHERE 子句作为过滤条件,只包含那些匹配联结条件的行。
内部联结
等值联结,基于两个表之间的相等测试,也要内部联结。
SELECT t1.name FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.id=t2.id
和 WHERE 类似,只是联结条件传递给 ON 。
高级联结
自联结
有时需要在同一张表中进行联结条件的匹配或字段比较,可以使用自联结,比如这个题目:
Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
Id | Name | Salary | ManagerId |
---|---|---|---|
1 | Joe | 70000 | 3 |
2 | Henry | 80000 | 4 |
3 | Sam | 60000 | NULL |
4 | Max | 90000 | NULL |
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
Employee |
---|
Joe |
可以这样进行联结查询:
SELECT e1.Name AS Employee FROM Employee e1, Employee e2
WHERE e1.ManagerId=e2.Id AND e1.Salary>e2.Salary;
外部联结
许多联结将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。比如下边的问题:
表1: Person
列名 | 类型 |
---|---|
PersonId | int |
FirstName | varchar |
LastName | varchar |
PersonId 是上表主键
表2: Address
列名 | 类型 |
---|---|
AddressId | int |
PersonId | int |
City | varchar |
State | varchar |
AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
可以这样进行外联结查询:
SELECT p.FirstName,p.LastName,a.City,a.State FROM Person AS p
LEFT OUTER JOIN Address AS a
ON p.PersonId = a.PersonId;
在使用 OUTER JOIN 时,必须使用 LEFT 或者 RIGHT 来指定包含所有行的是哪个表,LEFT 指 OUTER JOIN 左边的表,而 RIGHT 指右边的。上边问题中,使用 LEFT ,就将所有 person 都包含了,无论是否在第二个表中关联到。