[SQL] LeetCode题解 #183 从不订购的客户

2020-05-06  本文已影响0人  半为花间酒

对SQL语句不熟悉欢迎查看我整理的笔记:[SQL] MySQL基础 + python交互

转载请注明:陈熹 chenx6542@foxmail.com (简书:半为花间酒)
若公众号内转载请联系公众号:早起Python

题目:

简单题 #183

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');

题解

第一种解法

—— 基于NOT IN

这种思路比较纯粹,直接判断Customers表的哪些Id不在Orders表的CustomerId中即可

SELECT name Customers
FROM customers
WHERE customers.id NOT IN  (
    SELECT customerid 
    FROM orders
);

第二种解法

—— 基于JOIN连表

思路和第一种解法有点相反:将Customers左连接订购表Orders,如果没有订购的顾客会出现NULL,此时用WHERE判断即可

NULL的判断不能用 == 的形式,应该用IS NULL

SELECT c.Name Customers 
FROM Customers c 
LEFT JOIN Orders o 
ON c.Id = o.CustomerId 
WHERE o.Id IS NULL;

第三种解法

—— 基于半连接和NOT EXISTS

类似第一种解法,只不过加上了半连接:将外部查询每一行逐个进入子查询判断,条件不存在后利用NOT EXISTS反选即可

SELECT Name Customers 
FROM Customers c  
WHERE NOT EXISTS (
    SELECT *
    FROM Orders o 
    WHERE o.CustomerId = c.Id);
上一篇 下一篇

猜你喜欢

热点阅读