MySQL突击:组合两张表

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL突击:组合两张表相关的知识,希望对你有一定的参考价值。

题目

: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
personId 是该表的主键列。
该表包含一些人的 ID 和他们的姓和名的信息。
 

表: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
addressId 是该表的主键列。
该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。

编写一个SQL查询来报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为空 null 。

任意顺序 返回结果表。

解答

select FirstName,LastName,City,State
from Person left join Address
on Person.PersonId = Address.PersonId

知识点

解题思路

1.确定查询结果

题目要求查询所有学生的姓名,学号,课程和成绩信息

select 学号,姓名,课程,成绩

查询结果的列名“学号”、“姓名”,在“学生”表里,列名“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。

2.哪种联结呢?

涉及到多表查询,在之前的课程《从零学会sql:多表查询》里讲过需要用到联结。

多表的联结又分为以下几种类型:

  1. 左联结(left join),联结结果保留左表的全部数据
  2. 右联结(right join),联结结果保留右表的全部数据
  3. 内联结(inner join),取两表的公共数据

这个题目里要求“所有学生”,而“所有学生”在“学生”表里。为什么不在“成绩”表里呢?

如果有的学生没有选修课程,那么他就不会出现在“成绩”表里,所以“成绩”表没有包含“所有学生”。

所以要以“学生”表进行左联结,保留左边表(学生表)里的全部数据。

from 学生信息表 as a left join 成绩表 as b

3.两个表联结条件是什么?

两个表都有“学号”,所以联结条件为学号。

on a.学号=b.学号

4.最终sql

select a.学号,a.姓名,b.课程,b.成绩
from 学生 as a
left join 成绩 as b
on a.学号=b.学号;

本题考点

考察多表联结,以及如何选择联结的类型。记住课程里讲过的下面这张图,遇到多表联结的时候从这张图选择对于的sql。

来源:https://leetcode.cn/problems/combine-two-tables/solution/tu-jie-sqlmian-shi-ti-duo-biao-ru-he-cha-xun-by-ho/

以上是关于MySQL突击:组合两张表的主要内容,如果未能解决你的问题,请参考以下文章

SQLserver数据库中,在啥情况下删除数据不能成功?

mysql里查询时怎么把一张表里的上级ID显示为上级名称?

SQL怎么把查询的结果插入到另一张表中,两张表的表结构不一样可以吗?

MySQL表联结

如何连接两张表,用access?

1___概述