对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);
网友评论