УРОК 22 / 27· ≈ 35 мин
Подзапрос, CTE и представление: что выбрать
Три способа «назвать и переиспользовать» запрос
Мы уже знаем подзапросы и CTE, а теперь и представления. По сути все три решают похожую задачу — дать запросу-«заготовке» имя и переиспользовать её. Разница — в области видимости и времени жизни.
| Способ | Где живёт | Когда удобен |
|---|---|---|
Подзапрос(SELECT ...) | встроен прямо в запрос (в WHERE/FROM/SELECT), нигде не сохраняется | разовая, небольшая вложенная логика |
CTEWITH 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 — Длинная логика нужна один раз, внутри одного запроса. Что выбрать?
- Тест 2 — Расчёт «расписание с городами» нужен в десятках отчётов. Что выбрать?
- Задача 1 — Быстрее среднего — подзапросом
- Задача 2 — То же — через CTE
- Задача 3 — Деривированная таблица (подзапрос в FROM)
- Задача 4 — То же — через CTE (маршруты)
- Задача 5 — Аэропорты вылета — подзапросом IN
- Задача 6 — То же — через CTE и JOIN
- Задача 7 — Топ моделей — деривированной таблицей
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.