从今天开始每天都记录解一道Leetcode数据库的题,把它所使用的方法、思路、考察知识点以及最优解写下来。废话不多说,今天要解的是183题:没有下单的客户名字。
题目链接在这里:👉 Customers Who Never Order
首先看这题要考察的知识点:👉子查询 和 Not In 或Not Exists的运用
再看这题的思路: 既然要找的是没有下单的客户名字,那么有两种思路👇:
- 直接找没下单的人
- 利用反向思维,先找到下单客户的名字,再除开他们就是没下单的客户名字
而结合本题已知条件,两种思路都可以实现,至于哪种效率更高请继续往下看。
(PS: 如无特殊说明,本博客均采用的是MySQL)
于是解法就有如下几种:
- 第一种使用子查询和Not In方法:
SELECT A.Name AS Customers
FROM Customers AS A
WHERE A.Id NOT IN(SELECT B.CustomerId FROM Orders AS B);
- 第二种使用子查询和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);
- 第三种就是使用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。