我目前有两个版本的SQL查询,我试图了解在性能,成本等方面哪个更好。
这是这个问题:Average Salary: Departments VS Company
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语句本身中使用第二个表。
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;
哪个更好?加入真的有必要吗?
答案 0 :(得分:1)
要确定哪个更好,您应该测试性能。有时,使用关联子查询的性能要比显式join
替代方案好得多。
当您问:“加入真的有必要吗?”我认为您的意思是“ join
确实必要”。显然,有时您可以在没有显式join
的情况下表达查询。不过,在后台,数据库正在实现联接算法(可能是嵌套循环或索引查找)来完成工作。
几乎可以回答这个问题。 SQL通常提供多种方法来实现相同的目标。因此,您通常可以使用join
或不使用join
来表达逻辑。请注意,相关子查询实际上等效于left join
而不是inner join
。