联结,可以用来在一条 SELECT 语句中关联表。
在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行进行配对。行的数目其实是第一个表中的行数和第二个表中行数的乘积。而使用 WHERE 子句作为过滤条件,只包含那些匹配联结条件的行。
等值联结,基于两个表之间的相等测试,也要内部联结。
SELECT t1.name FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.id=t2.id和 WHERE 类似,只是联结条件传递给 ON 。
有时需要在同一张表中进行联结条件的匹配或字段比较,可以使用自联结,比如这个题目:
Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
IdNameSalaryManagerId1Joe7000032Henry8000043Sam60000NULL4Max90000NULL给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
EmployeeJoe可以这样进行联结查询:
SELECT e1.Name AS Employee FROM Employee e1, Employee e2 WHERE e1.ManagerId=e2.Id AND e1.Salary>e2.Salary;许多联结将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。比如下边的问题: 表1: Person
列名类型PersonIdintFirstNamevarcharLastNamevarcharPersonId 是上表主键 表2: Address
列名类型AddressIdintPersonIdintCityvarcharStatevarcharAddressId 是上表主键
编写一个 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 都包含了,无论是否在第二个表中关联到。