В настоящее время у меня есть две версии SQL-запроса, и я пытаюсь понять, какая из них может быть лучше с точки зрения производительности, стоимости и т. д.
Это по поводу этого вопроса: Средняя зарплата: Департаменты VS Компания
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;
Что лучше? Действительно ли необходимо присоединиться?
Лично я всегда избегаю вложенных коррелированных запросов в списке выбора, так как считаю его некрасивым и трудным для чтения. Я бы всегда использовал метод соединения, или то же самое с CTE, если вы в моде. Как говорит @Shawn, проверьте план выполнения. Я не удивлюсь, если они будут совершенно одинаковыми, и в этом случае удобочитаемость является ключевым моментом.
Укажите каждый столбец в JOIN с таблицей, в которой он находится.
Какая у вас версия? Пожалуйста, предоставьте EXPLAIN SELECT ... в каждом случае.






Чтобы определить, что «лучше», вам следует протестировать производительность. Иногда производительность с использованием коррелированных подзапросов намного лучше, чем явная альтернатива join.
Когда вы спрашиваете: «Действительно ли необходимо присоединяться?» Я думаю, вы имеете в виду "Действительно ли нужен join". Очевидно, что иногда вы можете выразить запрос без явного join. Однако под капотом база данных реализует алгоритм соединения (возможно, либо вложенный цикл, либо поиск по индексу) для выполнения этой работы.
Это в значительной степени отвечает на вопрос. SQL часто предоставляет несколько способов достижения одной и той же цели. Таким образом, вы часто можете выразить логику с помощью join или без join. Только одно предостережение: коррелированный подзапрос действительно эквивалентен left join, а не inner join.
Если вы не знаете, как читать план выполнения для MySQL, прочтите их. Это поможет вам лучше сравнить два запроса.