УРОК 22 / 27· ≈ 35 мин

Подзапрос, CTE и представление: что выбрать

Три способа «назвать и переиспользовать» запрос

Мы уже знаем подзапросы и CTE, а теперь и представления. По сути все три решают похожую задачу — дать запросу-«заготовке» имя и переиспользовать её. Разница — в области видимости и времени жизни.

СпособГде живётКогда удобен
Подзапрос
(SELECT ...)
встроен прямо в запрос (в WHERE/FROM/SELECT), нигде не сохраняетсяразовая, небольшая вложенная логика
CTE
WITH name AS (...)
в пределах одного запроса, но вынесен наверх и названсложный запрос из нескольких шагов; на заготовку ссылаются 1+ раз — читаемее подзапроса
Представление
CREATE VIEW ...
сохранено как объект базы до удаления; доступ зависит от выданных правлогика нужна многим запросам постоянно (как наш timetable)

Один и тот же результат — тремя способами

«Самолёты быстрее средней скорости»:

-- подзапросом
SELECT airplane_code, speed FROM airplanes
WHERE speed > (SELECT AVG(speed) FROM airplanes);

-- через CTE
WITH stats AS (SELECT AVG(speed) AS a FROM airplanes)
SELECT airplane_code, speed FROM airplanes, stats
WHERE speed > stats.a;

-- через представление (создаётся один раз, потом просто SELECT)
CREATE VIEW fast_planes AS
  SELECT airplane_code, speed FROM airplanes
  WHERE speed > (SELECT AVG(speed) FROM airplanes);
SELECT * FROM fast_planes;

Как выбрать

  • логика нужна один раз внутри запроса → подзапрос;
  • запрос сложный, в несколько шагов, или заготовку используют несколько раз → CTE (читаемее);
  • логика нужна постоянно и многим → представление.

Шпаргалка: что выбрать

СитуацияИнструмент
Короткая проверка «больше среднего», «входит в список»Подзапрос
Длинный запрос из нескольких шагов, нужен один разCTE
Одна и та же логика нужна многим запросам и людямПредставление

Результат во всех трёх случаях одинаковый — разница в читаемости и в том, где хранится логика.

💡 Важно: ни подзапрос, ни CTE, ни обычное представление сами по себе не делают запрос «быстрее» — это про организацию и читаемость. За скорость отвечают индексы и план запроса.

В задачах ниже решим одни и те же вопросы разными способами — почувствуйте, как одно превращается в другое.

Практика

9
  1. Тест 1 — Длинная логика нужна один раз, внутри одного запроса. Что выбрать?
  2. Тест 2 — Расчёт «расписание с городами» нужен в десятках отчётов. Что выбрать?
  3. Задача 1 — Быстрее среднего — подзапросом
  4. Задача 2 — То же — через CTE
  5. Задача 3 — Деривированная таблица (подзапрос в FROM)
  6. Задача 4 — То же — через CTE (маршруты)
  7. Задача 5 — Аэропорты вылета — подзапросом IN
  8. Задача 6 — То же — через CTE и JOIN
  9. Задача 7 — Топ моделей — деривированной таблицей

Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.

Зарегистрироваться и решитьВойти
Представление — сохранённый запросСледующий урок: Зачем нужны индексы