Урок 6.1: Введение в подзапросы - Вложенные запросы и встроенные представления
В предыдущих модулях мы научились извлекать данные из таблиц и соединять их. Однако иногда одного запроса недостаточно для получения нужного ответа. Вам может потребоваться сначала найти какое-то значение (например, среднее число или конкретный ID), а затем использовать это значение в другом запросе. Именно здесь на помощь приходят подзапросы.
Что такое подзапрос?
Подзапрос (Subquery или внутренний запрос) - это оператор SELECT, вложенный в другой SQL-запрос. Запрос, содержащий подзапрос, называется внешним запросом (или основным запросом).
Подзапросы всегда заключаются в круглые скобки ().
Основная логика: как они работают
Как правило, база данных сначала выполняет внутренний запрос. Результат этого внутреннего запроса затем передается во внешний запрос, который использует его для завершения своего выполнения.
-- Концептуальный пример
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
^----- Сначала выполняется это -----^
Категории подзапросов
Подзапросы часто классифицируют по типу данных, которые они возвращают:
- Скалярный подзапрос: Возвращает ровно одно значение (одна строка и один столбец).
- Многострочный подзапрос: Возвращает список значений (один столбец, много строк).
- Табличный подзапрос (Inline View): Возвращает весь результирующий набор (несколько столбцов и строк) и используется в предложении
FROMтак, будто это временная таблица.
1. Вложенные подзапросы (внутри WHERE)
Наиболее распространенное использование подзапроса - в предложении WHERE для фильтрации данных на основе динамического значения.
Сценарий: Найти фильмы, стоимость замены которых выше средней стоимости замены всех фильмов.
SELECT
title,
replacement_cost
FROM
film
WHERE
replacement_cost > (SELECT AVG(replacement_cost) FROM film);
- Внутренний запрос: Рассчитывает среднюю стоимость (например, $19.98).
- Внешний запрос: Находит все фильмы, стоимость которых выше рассчитанных $19.98.
2. Встроенные представления / Inline Views (внутри FROM)
Когда вы помещаете подзапрос в предложение FROM, он называется встроенным представлением (Inline View). Вы, по сути, создаете временную таблицу «на лету», которая существует только во время выполнения этого запроса.
Примечание: Вы обязательно должны дать встроенному представлению псевдоним (alias).
Сценарий: Получить список активных клиентов и соединить его с данными об их платежах.
SELECT
active_cust.first_name,
p.amount
FROM
(SELECT * FROM customer WHERE active = 1) AS active_cust
INNER JOIN
payment AS p ON active_cust.customer_id = p.customer_id;
В этом случае внешний запрос соединяет результат подзапроса (active_cust) с таблицей payment.
Зачем использовать подзапросы вместо JOIN?
- Читаемость: Иногда подзапрос легче понять, чем сложное соединение.
- Агрегация: Подзапросы незаменимы, когда нужно использовать агрегатное значение (например,
AVGилиMAX) для фильтрации отдельных строк. - Логика: Определенная логика (например, «Найти всех X, которых НЕТ в Y») очень чисто выражается через подзапросы с использованием
NOT INилиNOT EXISTS.
Ключевые выводы урока
- Подзапрос - это оператор
SELECTвнутри другого запроса. - Вложенные подзапросы обычно находятся в предложениях
WHEREилиSELECT. - Встроенные представления (Inline Views) - это подзапросы в предложении
FROM, требующие наличия псевдонима. - Внутренний запрос обычно выполняется первым, предоставляя данные внешнему запросу.
- Подзапросы всегда заключаются в круглые скобки.