我试图理解为什么人们普遍认为避免分组总是有益的。我的问题陈述是:从employee_id为外键的员工表中,找出员工最高工资为40000的那些部门
select d.department_name , e.max_salary
from department d
join ( select department_id, max(salary) as max_salary
from emp
group by 1
having max_salary = 40000 ) e
on (d.department_id = e.department_id)
select d.department_name, inner_q.salary
from department d
join
(select e.department_id , e.salary
from emp e
left join emp e_inner
on (e.department_id = e_inner.department_id and e.salary < e_inner.salary)
where e_inner.department_id is null and e.salary = 40000 ) inner_q
on (d.department_id = inner_q.department_id)
不幸的是,解释计划对我来说没有多大意义。任何帮助解释哪一个应该更好,为什么会非常感激。
答案 0 :(得分:2)
你工作太辛苦了。
SELECT department_name, MAX(salary) AS max_salary
FROM emp
GROUP BY department_name
HAVING max_salary >= 40000
这比任何带有子查询的版本都要快。
这会让它运行得更快:INDEX(department_name, salary)
(也许你想要>= 40000
,而不是= 40000
?)
此版本将对整个表格进行一次传递(或INDEX
,如果添加“覆盖”索引),则收集每个部门的最高工资。然后它会丢弃HAVING
子句失败的结果;交付其余部分。
对于在10K行的表上运行此GROUP BY
,我不会有任何疑虑。一百万行的表会花费很多时间。但