Представления
Некоторые запросы нужны снова и снова: менеджер каждую неделю хочет видеть итоги заказов, а поддержка то и дело ищет игры, которые уже вышли. Представление (view) даёт запросу имя, и после этого им можно пользоваться как таблицей:
CREATE VIEW released_games AS
SELECT title, genre, price
FROM games
WHERE released IS NOT NULL;После CREATE VIEW, имени и AS идёт обычный SELECT. Представление запрашивают, как любую таблицу: с WHERE, ORDER BY, соединениями и всем остальным:
SELECT title, price
FROM released_games
WHERE genre = 'Action'
ORDER BY price;| title | price |
|---|---|
| Shadow Ninja | 25 |
| Zombie Town | 30 |
| Star Pilots | 35 |
В представлении нет собственных строк. Оно хранит только запрос, а база данных выполняет его каждый раз, когда вы обращаетесь к представлению. Поэтому представление всегда показывает актуальные данные: когда у Robot Rebellion появляется дата выхода, игра попадает в список вышедших, и никому не нужно менять представление:
UPDATE games
SET released = '2026-02-27'
WHERE id = 18;
SELECT title, price
FROM released_games
WHERE genre = 'Action'
ORDER BY price;| title | price |
|---|---|
| Shadow Ninja | 25 |
| Zombie Town | 30 |
| Star Pilots | 35 |
| Robot Rebellion | 40 |
Представления удобны для длинных запросов с соединениями и группировкой, которыми затем могут пользоваться другие, не зная, как они устроены, и для вычислений, которые везде должны делаться одинаково. Представление может также скрыть столбцы, которые некоторым людям видеть не следует. Столбцы представления называются так, как в его SELECT.
Представление можно только читать: INSERT, UPDATE и DELETE для него завершаются ошибкой cannot modify released_games because it is a view. Данные меняют в таблицах, из которых читает представление. Ненужное больше представление удаляют командой DROP VIEW released_games;, а чтобы изменить представление, его удаляют и создают заново. Как и созданные вами таблицы, представления не появляются на вкладке «Таблицы».
Типичная ошибка: вычисляемый столбец без псевдонима. В представлении, созданном из SELECT genre, SUM(price) FROM games GROUP BY genre, второй столбец называется SUM(price), что неудобно использовать в запросах к представлению. С SUM(price) AS total он называется просто total.
Задание
- 1
Создайте представление
order_totalsс одной строкой для каждого оплаченного заказа и такими столбцами:order_id(идентификатор заказа),customer(имя клиента),ordered_atиtotal(сколько вместе стоят позиции заказа: количество, умноженное на цену каждой позиции вorder_items). Ниже покажите из представления три заказа с наибольшей суммой; при равных суммах сначала идёт меньшийorder_id:order_id customer ordered_at total 11 Liam Turner 2024-09-30 85 14 Emma Clark 2024-12-20 75 5 Noah Wilson 2024-04-02 65 - 2
Покажите с помощью представления, сколько потратил каждый клиент, в столбцах
customerиspent, отсортировав по сумме от наибольшей, а клиентов с одинаковой суммой — по имени. Результат начинается так:customer spent Emma Clark 200 Liam Turner 150 Noah Wilson 150 Olivia Brown 150 Jack Harris 95 Oscar King 95 … … - 3
Представление всегда показывает актуальные данные. В конце файла добавьте новый оплаченный заказ: заказ 31 клиента Henry Scott (клиент 12) от 2025-12-30 с одним экземпляром Knight's Oath (игра 15), который он купил за $50 на распродаже. Затем покажите все столбцы тех строк представления, где клиент — Henry Scott:
order_id customer ordered_at total 31 Henry Scott 2025-12-30 50