Спринт 4/16: SQL для аналитиков → Тема 5/6: Подзапросы и общие табличные выражения → Урок 5/15
Подзапросы в WHERE
В этом уроке расскажем, как писать запросы в
WHERE. Разберём два примера. Изучаем пользователей с самыми крупными заказами
Нужно собрать всю информацию о пользователях, которые оформили самые крупные заказы. Сначала нужно найти таких пользователей — этот запрос выведет десять идентификаторов пользователей с заказами на самую большую сумму.
SQL
Теперь эти данные можно использовать вместе с оператором
WHERE. Такой подзапрос устроен точно так же, как и подзапрос с FROM. Нужно использовать полученные данные в качестве условия.SQL
Можно написать окончательный запрос:
SQL
В итоговую таблицу войдут данные пользователей с идентификаторами, отобранными подзапросом.
Вспомните: в уроках про объединение таблиц вы получали похожую выгрузку запросами с
JOIN. Но у способа с подзапросами есть преимущество: данные сначала отбирают, а потом объединяют в итоговую таблицу. Если делать наоборот — сначала присоединять, а затем делать срез, — это займёт больше времени. В одном из следующих уроков обсудим, какой способ лучше использовать. Отбираем фильмы по двум условиям
Теперь более сложный пример. Нужно вычислить среднюю стоимость фильмов, отобранных по двум условиям:
- их длительность не превышает среднюю длительность фильмов в базе,
- в них снималось более 12 актёров и актрис.
Снова прибегнем к декомпозиции и разобьём задачу на подзадачи:
- Найдём среднюю длительность всех фильмов в базе.
- Найдём фильмы, в которых снималось более 12 актёров и актрис.
- Отфильтруем таблицу по средней длительности фильмов.
- Вычислим среднюю стоимость отобранных фильмов.
Начнём с первой подзадачи: найдём среднюю длительность всех фильмов. Это можно сделать простым запросом:
SQL
С этим числом будем сравнивать длительность фильмов.
Следующий этап: найдём фильмы, в которых снималось более 12 актёров и актрис.
SQL
Сгруппировав фильмы по идентификатору, мы присоединили таблицу с фильмами, актёрами и актрисами. Среди них отобрали только те фильмы, в которых снималось более 12 актёров и актрис. Таблицу
actor присоединять необязательно: в таблице film_actor и так есть идентификаторы актёров и актрис, которые можно сосчитать. В итоговую таблицу войдут только идентификаторы фильмов.Итак, мы получили список фильмов, в которых снималось более 12 актёров и актрис. Осталось вычислить среднюю стоимость фильмов — сделаем это пока без добавления условий.
SQL
Теперь можно указать
WHERE и добавить два подзапроса:SQL
Задача решена. Благодаря декомпозиции писать подзапросы проще. И не забывайте про правила стиля, чтобы не запутаться в коде.