Вопрос проверяет понимание проблем производительности и читаемости при использовании вложенных подзапросов в SQL.
Вложенные подзапросы — это запросы внутри других запросов. Они могут быть полезны, но часто приводят к снижению производительности и ухудшению читаемости. Основная проблема — коррелированные подзапросы, которые выполняются для каждой строки внешнего запроса, что приводит к многократным сканированиям таблиц.
Рассмотрим запрос, который находит сотрудников с зарплатой выше средней в их отделе:
SELECT name, salary
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);Этот подзапрос выполняется для каждого сотрудника, что может быть медленно на больших таблицах.
Пример с CTE:
WITH avg_salary AS (
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
)
SELECT e.name, e.salary
FROM employees e
JOIN avg_salary a ON e.department_id = a.department_id
WHERE e.salary > a.avg_sal;Вложенные подзапросы стоит применять только для простых случаев или когда альтернативы не дают выигрыша. Для сложных запросов предпочтительнее использовать JOIN или CTE, чтобы улучшить производительность и поддерживаемость кода.