Что такое подзапрос (subquery)?
Подзапрос — это запрос, который включён в другой запрос. Он позволяет выполнять сложные операции с данными, делая код более читаемым и логичным. Подзапросы могут использоваться в различных частях SQL-запросов, таких как в SELECT, FROM, WHERE и даже в INSERT или UPDATE.
Основные типы подзапросов
-
Подзапросы в
SELECT:- Используются для извлечения данных, которые могут быть необходимы для основного запроса.
- Пример:
SELECT name, (SELECT AVG(salary) FROM employees) AS avg_salary FROM departments; - Здесь подзапрос вычисляет среднюю зарплату по всем сотрудникам, и результат используется в основном запросе.
-
Подзапросы в
FROM:- Позволяют использовать результат подзапроса как временную таблицу.
- Пример:
SELECT department, avg_salary FROM (SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id) AS avg_dept_salary; - В данном случае подзапрос вычисляет среднюю зарплату по отделам, и затем основной запрос выбирает эти данные.
-
Подзапросы в
WHERE:- Чаще всего используются для фильтрации данных.
- Пример:
SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York'); - Здесь основной запрос выбирает имена сотрудников, которые работают в отделах, расположенных в Нью-Йорке.
Виды подзапросов
-
Коррелированные подзапросы: такие подзапросы ссылаются на данные из внешнего запроса. Они выполняются для каждой строки внешнего запроса.
- Пример:
SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); - В данном случае подзапрос вычисляет среднюю зарплату для каждого отдела, что делает его коррелированным.
- Пример:
-
Некоррелированные подзапросы: выполняются один раз, и результат используется в основном запросе.
- Пример:
SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales'); - Здесь подзапрос возвращает ID отдела 'Sales', который затем используется в основном запросе.
- Пример:
Практические советы
- Избегайте излишней вложенности: Сложные подзапросы могут ухудшить производительность и читаемость кода. Попробуйте использовать
JOIN, если это возможно. - Используйте индексы: Индексы помогут ускорить выполнение подзапросов, особенно если они часто используются в фильтрах.
- Оптимизируйте подзапросы: Убедитесь, что подзапросы возвращают только необходимые данные, чтобы минимизировать нагрузку на базу данных.
Распространённые ошибки
- Необоснованное использование подзапросов: Иногда вместо подзапросов можно использовать более простые конструкции, такие как
JOIN, которые могут быть более производительными. - Неэффективные коррелированные подзапросы: Они могут значительно замедлить выполнение запроса, так как выполняются для каждой строки. Если возможно, преобразуйте коррелированный подзапрос в некоррелированный.
- Неправильное использование
NULL: Подзапросы могут возвращатьNULL, что может привести к неожиданным результатам, если это не учтено в логике запроса.
Подзапросы — это мощный инструмент в SQL, который при правильном использовании может значительно упростить вашу работу с базами данных.