从不订购的客户

    科技2025-04-04  13

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

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

    Customers 表:

    ±—±------+ | Id | Name | ±—±------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | ±—±------+ Orders 表:

    ±—±-----------+ | Id | CustomerId | ±—±-----------+ | 1 | 3 | | 2 | 1 | ±—±-----------+ 例如给定上述表格,你的查询应返回:

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

    解题:

    方法:使用子查询和 NOT IN 子句

    如果我们有一份曾经订购过的客户名单,就很容易知道谁从未订购过。

    我们可以使用下面的代码来获得这样的列表。

    select customerid from orders;

    然后,我们可以使用 NOT IN 查询不在此列表中的客户。

    select customers.name as 'Customers' from customers where customers.id not in ( select customerid from orders );

    方法:关联查询

    SELECT t1.Name Customers FROM Customers t1 LEFT JOIN Orders t2 ON t1.Id = t2.CustomerId WHERE t2.CustomerId is null

    答案:

    SELECT t1.Name Customers FROM Customers t1 LEFT JOIN Orders t2 ON t1.Id = t2.CustomerId WHERE t2.CustomerId is null
    Processed: 0.009, SQL: 8