Подзапросы во FROM
Как найти среднее от среднего
Допустим, вас просят вывести среднее значение аренды фильмов разных возрастных рейтингов. Написать такой запрос несложно:
SQL
Теперь вас просят дополнить запрос и посчитать среднее от найденных средних значений.
Промежуточная таблица со средней ценой аренды готова. Было бы удобно, если бы такая таблица уже была в базе данных. Если сохранить выдачу из прошлого запроса в таблицу
best_rating, можно легко вывести среднее значение поля average_rental. SQL
Однако дополнительная таблица не понадобится. В SQL такие задачи решают с помощью подзапросов, или вложенных запросов.
Пишем подзапрос
Чтобы написать подзапрос, после оператора
FROM вместо таблицы добавляют другой запрос. Подставим уже написанный код, который выводит пять самых «дорогих» рейтингов фильмов.Сначала можно проверить, какую таблицу вернёт запрос с подзапросом. После
SELECT укажем *, чтобы убедиться, что запрос вернёт всю таблицу без ошибок.SQL
❗ Подзапросу во
FROM нужно всегда назначать псевдоним, иначе произойдёт ошибка.Результат остался прежним. Теперь можно вычислить среднее значение.
SQL
Задача выполнена. И всё в одном запросе.
Декомпозиция с помощью подзапросов
Покажем ещё один пример. Посчитаем фильмы, в которых снималась тройка самых востребованных актёров и актрис — тех, кто чаще других снимались в кино.
Декомпозируем задачу:
- Посчитаем, сколько фильмов приходится на каждого актёра или актрису, и выделим тройку рекордсменов по количеству фильмов.
- Найдём общее количество фильмов, в которых снимались самые востребованные актёры и актрисы.
Сначала разберёмся с первой подзадачей. К таблице с актёрами и актрисами присоединим данные с фильмами и сгруппируем по имени актёра или актрисы. Посчитаем фильмы, отсортируем по убыванию и отберём первые три. Даже такую небольшую задачу удалось декомпозировать.
Сразу оговоримся, что эту задачу можно решить и другими способами, но об этом поговорим в следующих уроках.
SQL
Первая часть задачи решена. Поместим решение в подзапрос после
FROM и назначим псевдоним для получившейся таблицы. 💡 При использовании подзапросов соблюдайте правила стиля и обращайте внимание на отступы. Это позволит не запутаться в коде.
Выполним код с
*, чтобы убедиться, что всё работает. SQL
Результат не изменился. Теперь можно переходить к следующей задаче — найдём общее количество фильмов. Вместо
* укажем функцию SUM и передадим ей поле total_movie.SQL
Задача решена. Результат впечатляет: 137 фильмов на троих. Настоящие ударники кинематографического труда.