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