SQL今日一题(21):3个子查询

这是SQL今日一题的第21篇文章

题目描述

获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=\’9999-01-01\’,
结果第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salary

用到dept_emp表、dept_manager表和salaries表

dept_emp表

dept_manager表

salaries表

方法

select s_e.emp_no,
       s_m.emp_no as manager_no,
       s_e.salary as emp_salary,
       s_m.salary as manager_salary
from 
(
    select de.emp_no,
           de.dept_no,
           s.salary 
    from dept_emp de 
    inner join salaries s on de.emp_no = s.emp_no 
    where de.emp_no not in 
        (
            select emp_no from dept_manager
        ) 
    and s.to_date = \'9999-01-01\'
as s_e,
(
    select dm.emp_no,
           dm.dept_no,
           s.salary 
    from dept_manager dm 
    inner join salaries s on dm.emp_no = s.emp_no 
    where dm.to_date = \'9999-01-01\' 
    and s.to_date = \'9999-01-01\'
as s_m 
where s_e.dept_no = s_m.dept_no
and s_e.salary > s_m.salary

这段SQL看着长,其实是我为了方便理顺逻辑调整了下格式而已,别被吓到。
1、首先我们要想知道员工薪水比manager薪水高的情况,就需要连接2个表,一个表是员工-薪水表,一个表是manager-薪水表,联立连个表以后,再将这两个表用联立,然后取员工-薪水表中的薪水大于manager-薪水表中薪水的值即可。

2、理顺思路我们就来联立表。首先用inner join连接dept_emp和salaries表,以emp_no为公共字段,注意这样连接以后是所有员工的信息,那我们要的是非manager员工的信息,所以里面再嵌套一个子查询,把manager员工的emp_no筛选出来,让连接的表的emp_no不等于manager的emp_no,得到的就是非manager员工的信息,别忘了给出where子句限制“当前”这个条件。查询出来的这个表命名为s_e

3、再来用inner join连接dept_manager和salaries表,以emp_no为公共字段,where子句限制“当前”这个条件,结果命名为s_m。这个连接很简单。

4、再将s_e和s_m连接起来,用where连接即可,公共字段为dept_no。同时给出另一个限制条件:s_e.salary > s_m.salary。

结果

知识点

子查询

  • 这题里嵌套了3个子查询

  • 注意子查询的用法,可以作为过滤条件放在where后,可以作为临时表放在from后,也可以作为一个字段值放在select语句中


猜你喜欢:
什么是好的数据指标:精益数据分析

数据会说谎的真实例子有哪些

有哪些值得推荐的数据可视化工具?(文末送书)

@ 作者:可乐
@ 公众号/知乎专栏/头条/简书:可乐的数据分析之路
@加个人微信:data_cola,备注:进群,拉你入 可乐的数据分析群 和各行各业的小伙伴交流探讨数据分析相关内容

微信公众号
个人微信号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注