我试图理解为什么人们普遍认为,避开一群人总是有益的。我的问题陈述是:从employee_id是外键的雇员表中,找出雇员的最高工资为40000的那些部门
1按方法分组:
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)
2现在,左联接方法:
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)
不幸的是,解释计划对我来说没有多大意义。任何帮助解释哪个应该表现更好以及为什么的帮助将不胜感激。
最佳答案
你太辛苦了
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
子句;其余的交付。我不会对在1万行的表上运行此
GROUP BY
感到担忧。一百万行的表将花费可观的时间,但是时间却很少。