美文网首页
[SQL] LeetCode题解 #181 超过经理收入的员工

[SQL] LeetCode题解 #181 超过经理收入的员工

作者: 半为花间酒 | 来源:发表于2020-05-04 10:28 被阅读0次

    对SQL语句不熟悉欢迎查看我整理的笔记:[SQL] MySQL基础 + python交互

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒)
    若公众号内转载请联系公众号:早起Python

    题目:

    简单题 #181

    SQL架构:

    Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, ManagerId int);
    Truncate table Employee;
    insert into Employee (Id, Name, Salary, ManagerId) values ('1', 'Joe', '70000', '3');
    insert into Employee (Id, Name, Salary, ManagerId) values ('2', 'Henry', '80000', '4');
    insert into Employee (Id, Name, Salary, ManagerId) values ('3', 'Sam', '60000', 'None');
    insert into Employee (Id, Name, Salary, ManagerId) values ('4', 'Max', '90000', 'None');
    

    题解:

    XX和XX比的基本思想是将比较的二者放在同一行

    限制条件有两个:

    1. 员工的ManagerId是经理的Id
    2. 员工的Salary超过对于经理的Salary

    - 第一种解法

    —— 基于笛卡尔积的连表

    SELECT a.Name AS Employee 
    FROM Employee AS a,Employee AS b 
    WHERE a.ManagerId = b.Id 
    AND a.Salary > b.Salary
    

    解法很直接,实际上就是自连接
    从自己分为两个表以后用WHERE将两个限制条件表述出来
    注意这里两表相连是笛卡尔积
    如果数据量大时需要优化

    - 第二种解法

    —— 基于JOIN的连表

    SELECT a.name as Employee 
    FROM Employee a 
    LEFT JOIN Employee b ON a.ManagerId = b.id 
    WHERE a.salary > b.salary
    

    这里使用LEFT JOIN根据IdManagerId完成自连接,再用salary判别即可
    效率会超过笛卡尔积连表

    - 第三种解法

    —— 基于WHERE里的半连接

    SELECT Name Employee 
    FROM Employee E
    WHERE Salary > 
    (
    SELECT Salary FROM Employee WHERE Id = E.ManagerId 
    )
    

    半连接的特点是建立的子查询是动态的,需要利用查询外部的条件
    SQL的运算是逐行匹配,每次运行都将当前行的ManagerId传入子查询再和SalaryWHERE比对大小即可

    半连接思路很巧妙,可以巧妙化解分组聚合问题,但:

    能连表则尽量不要用子查询,因为效率一般不高

    相关文章

      网友评论

          本文标题:[SQL] LeetCode题解 #181 超过经理收入的员工

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