在其中一次采访中,有人问我下面的问题
"写一个查询,找出所有部门中所有部门名称,员工姓名和工资都有最高工资的员工"
这意味着employee表中有100条记录,department表中有10条记录.因此,它需要从查询中提供10条记录,如果任何部门中没有员工,则仍需要显示该部门名称.
谢谢
如果没有看到表结构,我会说你可以用几种不同的方式做到这一点.
使用IN条款:
select e.name e_name,
d.name d_name,
e.salary
from employee e
inner join department d
on e.deptid = d.id
where e.salary in (select max(salary)
from employee
group by deptid);
Run Code Online (Sandbox Code Playgroud)
或者使用子查询:
select e1.name e_name,
d.name d_name,
e1.salary
from employee e1
inner join
(
select max(salary) salary, deptid
from employee
group by deptid
) e2
on e1.salary = e2.salary
and e1.deptid = e2.deptid
inner join department d
on e1.deptid = d.id
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo of both
现在,MySQL允许您应用聚合函数而不应用于GROUP BY选择列表中的非聚合字段(这不能在sql server,oracle等中完成).所以你可以用来获得相同的结果:
select e.name e_name,
d.name d_name,
max(e.salary) salary
from employee e
inner join department d
on e.deptid = d.id
group by d.name
Run Code Online (Sandbox Code Playgroud)
请参阅SQL小提琴演示