美文网首页
[SQL] LeetCode题解 #183 从不订购的客户

[SQL] LeetCode题解 #183 从不订购的客户

作者: 半为花间酒 | 来源:发表于2020-05-06 11:48 被阅读0次

    对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);
    

    相关文章

      网友评论

          本文标题:[SQL] LeetCode题解 #183 从不订购的客户

          本文链接:https://www.haomeiwen.com/subject/cmpightx.html