多表如何查询?

1、题目

下面是学生的名单,表名为“学生表”;近视学生的名单,表名为“近视学生表”。请问不是近视眼的学生都有谁?
(“学生表”表中的学号与“近视学生”表中的学生学号一一对应)


题目.png

2、解题思路

1.我们先来拆解问题:不是近视眼的学生都有谁?

1)“不是近视眼”的学生,近视信息在“近视学生”表里
2) “学生都有谁?”,要求的是“学生姓名”,所以我们的输出答案应该是“学生姓名”,这在“学生”表里。

涉及2张以上表的查询时,我们需要用到多表联结。

2.使用哪种联结呢?


多表查询.png

其中上图黑色框里的sql解决的问题是:不在表里的数据,也就是在表A里的数据,但是不在表B里的数据。

对于这个题目“不是近视眼的学生都有谁?”,就是在“学生表”里的数据,但是不在“近视学生表”里的数据。我们选择下图黑色框里的左联结sql语句。


WX20200803-183758@2x.png

3.多表如何联结?

题目已给出,联结两表的关键依据分别为“学号”和“学生学号”。示意图如下:
WX20200803-184013@2x.png

3、解题步骤

使用分析思路里的sql语句联结两表

select a.姓名 as 不近视的学生名单
from 学生表 as a
left join 近视学生表 as b
on a.学号=b.学生学号
where b.序号 is null;

我们来理解下这个sql的运行过程,方便你更深入的理解。

1)在不加where字句的情况下,两表联结得到下图的表


联结结果表.png

2)假设where字句(where b.序号 is null;)就会把b.序号这一列里为空值(NULL)的行选出来,就是题目要求的不近视的学生。(下图绿色框里的行)

WX20200803-184509@2x.png

4、其他方法

\color{red}{这道题还有别的解法,就是使用子查询和not} \color{red}{ in子句}

select a.姓名 as 不近视的学生名单
from 学生表 as a
wherer a.学号
not in(select 学生学号 from 近视学生表);

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。