Leetcode题解之database(一)183. Customers Who Never Order

28 篇文章 12 订阅
18 篇文章 7 订阅

从今天开始每天都记录解一道Leetcode数据库的题,把它所使用的方法、思路、考察知识点以及最优解写下来。废话不多说,今天要解的是183题:没有下单的客户名字。

题目链接在这里:👉 Customers Who Never Order

首先看这题要考察的知识点:👉子查询 和 Not In 或Not Exists的运用

再看这题的思路: 既然要找的是没有下单的客户名字,那么有两种思路👇:

  1. 直接找没下单的人
  2. 利用反向思维,先找到下单客户的名字,再除开他们就是没下单的客户名字

而结合本题已知条件,两种思路都可以实现,至于哪种效率更高请继续往下看。

(PS: 如无特殊说明,本博客均采用的是MySQL)

于是解法就有如下几种:

  1. 第一种使用子查询和Not In方法
SELECT A.Name AS Customers 
FROM Customers AS A
WHERE A.Id NOT IN(SELECT B.CustomerId FROM Orders AS B);
  1. 第二种使用子查询和Not Exists方法
SELECT A.Name AS Customers FROM Customers AS A WHERE NOT EXISTS
(SELECT B.CustomerId FROM Orders AS B WHERE A.Id = B.CustomerId);
  1. 第三种就是使用Left Join …On + Where Is Null方法直接找出没下单的人:
SELECT A.Name AS Customers FROM Customers AS A LEFT JOIN Orders AS B ON A.Id = B.CustomerId
WHERE B.CustomerId IS NULL;

掌柜三种方法都测试过,发现第三种就是直接法,用时最短,所以最优解就是它
在这里插入图片描述
看来有时候直接倒不失为一种更便捷的方法😁,好了今天的题解就到这里,明天继续!

PPS:这里再提一点关于如何选择IN 和 EXIST的用法,可以考虑哪个表更大。假设这里有A,B 两个表,如果A>B,就用IN; 反之用EXIST。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值