MySQL练习 组合两表
- 考点梳理
- 题目简介
- 解题思路
- 代码
考点梳理
left / right join on 语法与where的使用区别:
首先,(以left join on为例)left join on 语法在建立临时列表时,
是先建立临时列表再进行on之后的条件判定。如:
表名:Information
ID | Name | Sex | Address | TLE |
1 | xi | man | beijin | 010-111111 |
2 | ha | woman | nanjin | 010-22222 |
3 | he | man | xian | 010-3333 |
表名:BookBorrow
ID | BookID | BookName | Time |
2 | 001 | 《哈姆雷特》 | 2020.01.20 |
4 | 002 | 《复活》 | 2020.01.22 |
6 | 004 | 《来日可期》 | 2020.01.22 |
7 | 003 | 《北极星的仰望》 | 2020.01.23 |
(以 left join on 为例)执行当前代码:
select *
from information a left join BookBorrow b
on a.ID = b.ID
建立临时列表如下(部分展示):
ID | Name | Sex | Address | TLE | ID | BookID | BookName | Time |
1 | xi | man | Beijin | 010-111111 | 1 | null | null | null |
2 | ha | woman | nanjin | 010-22222 | 2 | 001 | 《哈姆雷特》 | 2020.01.20 |
.. | .. | .. | .. | .. | .. | .. | .. | .. |
虽然此时 xi 这位读者没有借书,但是当查询每位读者的借书情况时,也需要将没有借书
的人的借书情况展示出来,或者查询其个人信息。所以使用left join on 或者right join
on 能实现对该类问题的建立,而当on后的条件不匹配时,右表都为null。
where的作用::
执行如下代码:
select *
from Information as a ,BookBorrow as b
where a.ID = b.ID
输出结果:
ID | Name | Sex | Address | TLE | BookID | BookName | Time |
2 | ha | woman | nanjin | 010-22222 | 001 | 《哈姆雷特》 | 2020.01.20 |
从查询结果看出,where 不能查询出没有借阅记录的结果,但是当查询一个人是否具有借
阅记录时,就需要多步操作才能得到需要的结果,相比如此的操作,更能节约执行时间。
当我们使用 left join 来寻找在一些表中不存在的记录,则我们需要做下面的测试:
where 部分的 xxx IS NULL,便可得到。
题目简介
表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
力扣题源链接:[https://leetcode-cn.com/problems/combine-two-tables]
解题思路
(首先,在开始思考这道题时,理解错误,题目中要求无论Address表是否存在,在组合两个
表的时候都需要得出{“小明”,“111”,null或者“xx”,null或者“vv” }的输出结果,所以这里使用
where语法无法实现对不存在address表时,组合两表的操作,因此只能使用left join on 的语
法进行合并两个表,从而筛选出符合要求的表内容)
代码
select A.FirstName, A.LastName, B.City, B.State
from Person as A left join Address as B
on A.PersonId = B.PersonID
执行结果如下: