Leetcode No.183 从不订购的客户

难度:简单

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

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

Orders 表:

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

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

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

解答:

看到两张表且有交叠的属性,第一个想法就是链接两个表,我先尝试了以下查询语句

SELECT a.id,a.`Name` as Customers,CustomerId 
from Customers a left join Orders b
on a.Id = b.CustomerId

Leetcode No.183 从不订购的客户_第1张图片
看到这个结果表之后,就会非常直观的发现,从不订购任何东西的客户就是customerID为null的人,那我们只需要做一个where CustomerId is null的判断就能把Henry和Max筛选出来。
结果表只要人名,所以我们只需select a.`name` as Customers即可
全部sql语句如下:

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

官方题解

如果我们有一份曾经订购过的客户名单,就很容易知道谁从未订购过。
我们可以使用下面的代码来获得这样的列表。

select customerid from orders;

Leetcode No.183 从不订购的客户_第2张图片
这个结果表是购买过的客户的id。
然后,我们可以使用 NOT IN 查询不在此列表中的客户。

select customers.name as 'Customers'
from customers
where customers.id not in
(
    select customerid from orders
)

作者:LeetCode
链接:https://leetcode-cn.com/problems/customers-who-never-order/solution/cong-bu-ding-gou-de-ke-hu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Mysql刷题记录)