一、题目
某网站包含两个表,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)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
创建数据库和数据表
根据题意创建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);
插入数据后的显示如下
查询
根据条件,要查询所有从不订购任何东西的客户
使用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直接使用。
三、操作结果
() 操作
Left JOIN ... ON
四、总结
从结果上看使用LEFT JOIN ... ON 查询结果更加高效,但从简易程度上,直接使用查询结果作为参数更加的方便。因此在具体的使用过程LEFT JOIN ... ON一般用于多表查询。