题目要求:获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列。

错误总结:1).groupby子句常见错误

  • SELECT 子句中只能存在以下三种元素。

  • ● 常数 ● 聚合函数 ● GROUP BY子句中指定的列名(也就是聚合键)

    #错误用法
    SELECT product_name, purchase_price, COUNT(*) -- 列名product_name不能包含
    FROM Product GROUP BY purchase_price;

    2).同一部门存在多个拿最高薪的员工, 怎么办?

个人思路:创建临时表T1,T2。T1获取两表部门编号dept_no以及对应的最高薪maxSalary记录。T2获取两表对应的部门编号dept_no、工资salary和员工编号emp_no记录。T1 join T2 on T1.maxSalary =T2.salary and T1.dept_no=T2.dept_no。T1连接T2条件为相同部门编号下员工的薪资等于最高薪资。

代码:

select T1.dept_no,T2.emp_no,T1.maxSalary
from (
        select de.dept_no,max(salary) as maxSalary
        from dept_emp de join salaries sa
            on de.emp_no=sa.emp_no
        group by dept_no
    )as T1 
    join
    (
        select de.dept_no,sa.salary,sa.emp_no
        from dept_emp de join salaries sa
            on de.emp_no=sa.emp_no
    )as T2
    on T1.maxSalary =T2.salary
        and T1.dept_no=T2.dept_no
order by dept_no

2021-9-16二刷(Mysql、sqlite都可用):窗口函数,基本一样的思路以部门分组对薪水做排名,然后找到排第一的那个

select dept_no,emp_no,salary
from
(
    select dept_no,t1.emp_no,salary,
    (rank() over(partition by dept_no order by salary desc) ) as s_rank
    from dept_emp t1 join salaries t2 on t1.emp_no=t2.emp_no
    order by dept_no
) as t
where  t.s_rank =1