首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询性能评估

SQL查询性能评估
EN

Stack Overflow用户
提问于 2018-10-16 07:04:02
回答 1查看 182关注 0票数 0

我目前有两个版本的SQL查询,我正在尝试了解哪一个在性能和成本等方面可能更好。

这是wrt这个问题:Average Salary: Departments VS Company

代码语言:javascript
复制
select department_salary.pay_month, department_id,
case
  when department_avg>company_avg then 'higher'
  when department_avg<company_avg then 'lower'
  else 'same'
end as comparison
from
(
  select department_id,
         avg(amount) as department_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      join employee on salary.employee_id = employee.employee_id
      group by department_id, pay_month
) as department_salary
join
(
  select avg(amount) as company_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      group by date_format(pay_date, '%Y-%m')
) as company_salary
on department_salary.pay_month = company_salary.pay_month
;

我的问题是,他们可以在case语句本身中使用第二个表,而不是连接。

代码语言:javascript
复制
select a.pay_month,
       a.department_id,
       (case when avg(a.salary) > (
             select avg(e.salary)
                 from employee e
                 where e.pay_month = a.pay_month)
        then 'higher'
        else 'lower' end) as comparison
from employee a
group by a.pay_month,a.department_id;

哪种更好些呢?join真的有必要吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-16 09:08:01

要确定哪个“更好”,您应该测试性能。有时,使用相关子查询的性能比使用显式join查询的性能要好得多。

当你问:“加入真的有必要吗?”我想你的意思是“join真的有必要吗”。显然,有时可以在没有显式join的情况下表达查询。不过,在幕后,数据库正在实现连接算法(可能是嵌套循环或索引查找)来完成这项工作。

这基本上回答了这个问题。SQL通常提供多种方法来实现相同的目标。因此,您通常可以使用join或不使用join来表达逻辑。需要注意的是:相关子查询实际上等同于left join而不是inner join

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52825833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档