УРОК 21 / 27· ≈ 30 мин

Представление — сохранённый запрос

Что такое представление

Представление (по-английски view) — это сохранённый в базе запрос, к которому потом обращаются как к обычной таблице. Само по себе оно не хранит данные: при каждом обращении база выполняет «спрятанный» внутри запрос и отдаёт свежий результат.

CREATE VIEW expensive_planes AS
SELECT airplane_code, model, range
FROM airplanes
WHERE range > 10000;

-- теперь можно просто:
SELECT * FROM expensive_planes;

Зачем это нужно:

  • прячет сложность — длинный запрос с соединениями превращается в одно понятное имя;
  • переиспользование — одну и ту же логику используют многие запросы, не копируя её;
  • единообразие — все считают «выручку» или «расписание» одинаково;
  • безопасность — можно показать пользователю представление с частью столбцов, не открывая всю таблицу.

В нашей базе уже есть представления!

Вы давно ими пользуетесь, даже не зная. airplanes и airports — это представления над «внутренними» таблицами, где названия хранятся сразу на нескольких языках (в формате JSON). Представление выбирает нужный язык и отдаёт обычный текст — поэтому вы видите model и city как простые строки.

А представление timetable («расписание») прячет соединение сразу трёх таблиц — flights, routes и airports — и добавляет местное время вылета/прилёта. Вместо того чтобы каждый раз писать этот JOIN, вы просто пишете SELECT ... FROM timetable. Его столбцы: flight_id, route_no, departure_airport, arrival_airport, status, airplane_code, времена scheduled_departure/actual_arrival и т.д.

Типичные ошибки

  • Ожидание, что представление «быстрее таблицы». Обычное представление при каждом обращении выполняет свой запрос заново. Оно экономит время на написание кода, а не на выполнение.
  • SELECT * из представления в рабочем коде. Если представление поменяют и в нём появятся новые столбцы, отчёт со звёздочкой внезапно изменится. Перечисляйте нужные столбцы.
  • Попытка изменить данные через учебную базу. Наша база открыта только на чтение, поэтому CREATE VIEW, UPDATE и DELETE здесь вернут ошибку прав. Запрашивать существующие представления можно свободно.
💡 Представление используется в точности как таблица: к нему применимы WHERE, GROUP BY, ORDER BY, JOIN. (Создавать представления на нашей учебной базе нельзя — она только для чтения, — но запрашивать существующие можно сколько угодно. Этим и займёмся.)

Существуют ещё материализованные представления (MATERIALIZED VIEW) — те хранят вычисленный результат на диске и обновляются по команде; это для тяжёлых отчётов и за рамками базового курса.

Практика

8
  1. Тест 1 — Что хранит обычное представление (VIEW)?
  2. Тест 2 — Что можно делать с представлением timetable в запросах?
  3. Задача 1 — Расписание рейсов (timetable)
  4. Задача 2 — Отменённые рейсы из расписания
  5. Задача 3 — Вылеты из Франкфурта (FRA)
  6. Задача 4 — Рейсы по статусам (через timetable)
  7. Задача 5 — Самые загруженные аэропорты вылета
  8. Задача 6 — Аэропорты вылета с 50+ рейсами

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

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