183. 从不订购的客户

112 阅读2分钟

一、题目

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

Customers 表:

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

Orders 表:

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

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

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

来源:力扣(LeetCode)

链接:leetcode.cn/problems/cu…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据库和数据表

根据题意创建Customers和Orders数据表,同时设置它们的数据类型,这里设置Id为主键并自增

CREATE DATABASE leetCode;
USE leetCode;

CREATE TABLE Customers(
	Id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
CREATE TABLE Orders(
	Id INT PRIMARY KEY AUTO_INCREMENT,
	CustomerId INT
);

插入数据

通过INSERT INTO 插入数据,填充两张数据表格

INSERT INTO Customers VALUES 
(NULL, "Joe"),
(NULL, "Henry"),
(NULL, "Sam"),
(NULL, "Max");

INSERT INTO Orders VALUES
(NULL, 3),
(NULL, 1);

插入数据后的显示如下

image.png

image.png

查询

根据条件,要查询所有从不订购任何东西的客户

使用where

// 查询 Orders订单中所有的用户id,把这个数据作为条件
// 查询Customers订单,所有Customers.Id不存在的用户
SELECT NAME Customers FROM Customers WHERE Customers.Id NOT IN (
	SELECT customerId FROM Orders
);
  • LEFT JOIN ... ON
// 通过LEFT JOIN ... ON ,遍历所有左表数据列,查询 Customers.Id等于 Order.Id的数据
// 查到该数据集后,在查询其中Order的Id为Null的数据,得到最终结果
SELECT NAME Customers 
FROM Customers c
LEFT JOIN Orders o
ON c.Id = o.CustomerId
WHERE o.Id IS NULL

注意 返回的列表名是Customers,但当前是没有这个列表名的。因此要做一个假名 例如使用 AS ,也可以不写AS直接使用。

三、操作结果

() 操作

image.png

Left JOIN ... ON

image.png

四、总结

从结果上看使用LEFT JOIN ... ON 查询结果更加高效,但从简易程度上,直接使用查询结果作为参数更加的方便。因此在具体的使用过程LEFT JOIN ... ON一般用于多表查询。