# 图解面试题：如何查找不在表里的数据？

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiC8EZUsUCb1D1_CTm%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_1.webp?alt=media\&token=43947238-388e-4442-9057-58125e3fd9e0)

**【题目】**

下面是学生的名单，表名为 “学生表”；近视学生的名单，表名为 “近视学生表”。请问不是近视眼的学生都有谁？

（“学生表”表中的学号与 “近视学生” 表中的学生学号一一对应）

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCBWelH4cRqh7rRin%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_2.webp?alt=media\&token=1a406a0d-74d9-47a8-8171-2312b4858155)

**【解题思路】**

**1. 我们先来拆解问题：**&#x4E0D;是近视眼的学生都有谁？

1）**“不是近视眼”** 的学生，近视信息在 “近视学生” 表里

2） **“学生都有谁？”**，要求的是 “学生姓名”，所以我们的输出答案应该是“学生姓名”，这在“学生” 表里。

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

**2. 使用哪种联结呢？**

在《从零学会 SQL：多表查询》这个课里我讲过各个联结的情况：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCEbRhQsWPQCmPwz8%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_3.webp?alt=media\&token=b349427a-de6f-4bb2-94f3-65bea84519ac)

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

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCLwZTETZiV7lg-Fk%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_4.webp?alt=media\&token=578ac587-d4fc-4af3-90d4-90200e8f7054)

```sql
select ...
from 表1 as a
left join 表2 as b
on a.列名=b.列名
where b.列名 is null;
```

**3. 多表如何联结？**

题目已给出，联结两表的关键依据分别为 “学号” 和“学生学号”。示意图如下：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCPXf2obKtJrFlNWz%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_5.webp?alt=media\&token=beee868e-96ed-4c2b-b0ea-9acf435f1292)

**【解题步骤】**

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

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

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

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCUMnk5gXIFAlJLtc%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_6.webp?alt=media\&token=096323df-5bcd-4f89-b29c-d4388179b1c5)

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCXYeKnOCLH43-ekl%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_7.webp?alt=media\&token=24655d7d-bcb1-4362-a086-bba515349007)

**【本题考点】**

本题主要考察多表联结。

遇到要查找 “**不在表里的数据**，也就是在表 A 里的数据，但是不在表 B 里的数据。” 可以使用下图黑框里的 sql 语句。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiC_b-1ZPg0k1-3c4-%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_8.webp?alt=media\&token=0cf72aba-99c5-471a-96a4-7104d53ee02a)

**【举一反三】**

查找 “不在表里的数据” 应用案例：

某网站包含两个表，顾客姓名表（表名 Customers）和 购买记录表（表名 Orders）。找出所有从不订购任何东西的客户。

（“顾客姓名表”中的 ID 与 “购买记录” 表中的 CustomerId 一一对应）

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCgXJdprrBEmKBUum%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_9.webp?alt=media\&token=c3a18ad6-b715-4d27-9b22-a52e1001254c)

参考答案：

```sql
select a.Name as Customers
from Customers as a
left join Orders as b
on a.Id=b.CustomerId
where b.CustomerId is null;
```

输出结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCuJDOIcbo1m-3PB0%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_10.webp?alt=media\&token=2238af98-d718-492f-ae1a-c32aa2534b33)

推荐：[如何提升你的分析技能，实现升职加薪？](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246542\&idx=2\&sn=522f75638ff0e49fb23c1c74b89e3db9\&chksm=835fc37eb4284a68e2f1d31d53323e37f36f2637070aaf594edabbb376a0416d09315b9d0bee\&scene=21#wechat_redirect)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiC1jGJW0J2tW41Tmq%2F-MUiCm7sYOZPtfEhtfsu%2F%E6%9F%A5%E6%89%BE%E4%B8%8D%E5%9C%A8%E8%A1%A8%E9%87%8C%E7%9A%84%E6%95%B0%E6%8D%AE_11.webp?alt=media\&token=6d91dc09-f704-47b4-84f1-132ec0cb8227)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://houzidata.gitbook.io/sql/di-3-zhang-duo-biao-cha-xun/tu-jie-mian-shi-ti-ru-he-cha-zhao-bu-zai-biao-li-de-shu-ju.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
