Customers
表:
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。
Orders
表:
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | customerId | int | +-------------+------+ 在 SQL 中,id 是该表的主键。 customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。 该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。
找出所有从不点任何东西的顾客。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入: Customers table: +----+-------+ | id | name | +----+-------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | +----+-------+ Orders table: +----+------------+ | id | customerId | +----+------------+ | 1 | 3 | | 2 | 1 | +----+------------+ 输出: +-----------+ | Customers | +-----------+ | Henry | | Max | +-----------+
题解1:使用排除条件过滤数据
思路
判断客户是否曾经下过订单的条件是:如果一个客户 ID 在 orders 表中不存在,这就意味着他们从未下过订单。
因此,我们可以使用行过滤来移除不满足条件的客户 ID。
select *
from customers
where customers.id not in
(
select customerid from orders
);
方法 2:在 customers 上进行左连接(Left Join)
思路是基于共同的客户 ID(在 customers 表中的 id 列和 orders 表中的 customerId 列),将表 customers 与表 orders 进行连接。
通过进行左连接,并选择 customerId 为 null 的记录,
我们可以确定哪些客户没有下过订单。
我们使用左连接(Left Join)在 customers 上,
因为我们希望将所有来自 customers 的客户都包括进来,无论他们是否下过订单。
因此,通过使用左连接,我们可以保留所有来自左表(customers)的行,
并将它们与右表(orders)中基于 id 和 customerId 进行匹配的相应行分别对应。
该表将如下所示:
接下来的步骤是通过选择 customerId
为 null 的行来过滤连接后的表格,这可以筛选出没有下过订单的客户。
该表将如下所示:
SELECT name AS 'Customers'
FROM Customers
LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
WHERE Orders.CustomerId IS NULL