leecode 数据库:183. 从不订购的客户

某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

导入数据:

Create table If Not Exists Customers (id int, name varchar(255));
Create table If Not Exists Orders (id int, customerId int);
Truncate table Customers;
insert into Customers (id, name) values ('1', 'Joe');
insert into Customers (id, name) values ('2', 'Henry');
insert into Customers (id, name) values ('3', 'Sam');
insert into Customers (id, name) values ('4', 'Max');
Truncate table Orders;
insert into Orders (id, customerId) values ('1', '3');
insert into Orders (id, customerId) values ('2', '1');

Customers 表:

+----+-------+
| Id | Name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Orders 表:

+----+------------+
| Id | CustomerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

 例如给定上述表格,你的查询应返回:

+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

【题目】

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

【解题思路】

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

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

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

2.使用哪种联结呢?
在《从零学会SQL:多表查询》这个课里我讲过各个联结的情况:

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

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

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

3.多表如何联结?
题目已给出,联结两表的关键依据分别为“学号”和“学生学号”。示意图如下:

【解题步骤】

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

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

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

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

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

【本题考点】

本题主要考察多表联结。

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

【举一反三】

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

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

(“顾客姓名表”中的ID与“购买记录”表中的学生学号CustomerId一一对应)

参考答案:
select a.Name as Customers
from Customers as a
left join Orders as b
on a.Id=b.CustomerId
where b.CustomerId is null;

输出结果:

 结语:这是我见过最棒的一个题解 链接在下面 需要的看链接

作者:houzidata
链接:https://leetcode.cn/problems/customers-who-never-order/solution/tu-jie-sqlmian-shi-ti-cha-zhao-bu-zai-biao-li-de-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/customers-who-never-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值