我试图理解为什么人们普遍认为,避开一群人总是有益的。我的问题陈述是:从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感到担忧。一百万行的表将花费可观的时间,但是时间却很少。

10-08 20:20