MySQL的联结查询

联结,可以用来在一条 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。

IdNameSalaryManagerId
1Joe700003
2Henry800004
3Sam60000NULL
4Max90000NULL

给定 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

列名类型
PersonIdint
FirstNamevarchar
LastNamevarchar

PersonId 是上表主键
表2: Address

列名类型
AddressIdint
PersonIdint
Cityvarchar
Statevarchar

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 都包含了,无论是否在第二个表中关联到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值