SQL код скопирован в буфер обмена
Изучите основы SQL подзапросов, также известных как вложенные или внутренние запросы. Этот урок знакомит с концепцией размещения запроса внутри другого запроса, объясняет разницу между скалярными и многострочными подзапросами, а также вводит понятие «Inline Views» (встроенные представления). Научитесь использовать подзапросы для выполнения многошагового извлечения данных в базе данных Sakila.
EN PT

Урок 6.1: Введение в подзапросы - Вложенные запросы и встроенные представления

В предыдущих модулях мы научились извлекать данные из таблиц и соединять их. Однако иногда одного запроса недостаточно для получения нужного ответа. Вам может потребоваться сначала найти какое-то значение (например, среднее число или конкретный ID), а затем использовать это значение в другом запросе. Именно здесь на помощь приходят подзапросы.

Что такое подзапрос?

Подзапрос (Subquery или внутренний запрос) - это оператор SELECT, вложенный в другой SQL-запрос. Запрос, содержащий подзапрос, называется внешним запросом (или основным запросом).

Подзапросы всегда заключаются в круглые скобки ().

Основная логика: как они работают

Как правило, база данных сначала выполняет внутренний запрос. Результат этого внутреннего запроса затем передается во внешний запрос, который использует его для завершения своего выполнения.

-- Концептуальный пример
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
                    ^----- Сначала выполняется это -----^

Категории подзапросов

Подзапросы часто классифицируют по типу данных, которые они возвращают:

  1. Скалярный подзапрос: Возвращает ровно одно значение (одна строка и один столбец).
  2. Многострочный подзапрос: Возвращает список значений (один столбец, много строк).
  3. Табличный подзапрос (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, требующие наличия псевдонима.
  • Внутренний запрос обычно выполняется первым, предоставляя данные внешнему запросу.
  • Подзапросы всегда заключаются в круглые скобки.