Представления (VIEW)
Прячем сложный запрос за «виртуальной таблицей» — представлением.
Представление (VIEW) — сохранённый под именем
SELECT-запрос, к которому можно обращаться как к обычной таблице.
Зачем нужны представления
Если один и тот же сложный запрос (с JOIN, фильтрами, агрегатами) используется во многих местах, его удобно «спрятать» в представление и обращаться к нему как к таблице. Плюсы:
- Упрощение: сложная логика пишется один раз, дальше — короткий
SELECT * FROM view. - Безопасность: можно дать пользователю доступ к представлению, не открывая исходные таблицы целиком (например, скрыть колонку с зарплатой).
- Согласованность: все используют одну и ту же «правильную» выборку.
Создание и использование
CREATE VIEW active_customers AS
SELECT id, name, email
FROM users
WHERE is_active = 1;
-- теперь обращаемся как к таблице
SELECT * FROM active_customers WHERE name LIKE 'А%';
DROP VIEW active_customers; -- удалить представление
Представление не хранит данные — это «окно» в таблицы. При обращении MySQL подставляет сохранённый запрос. Простые представления можно даже обновлять (INSERT/UPDATE через них), но представления с агрегатами и группировкой — только для чтения.
Переносимый пример
CREATE VIEW понимает и SQLite. Соберём представление-витрину «доход по клиенту»:
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, amount INTEGER);
INSERT INTO users (name) VALUES ('Анна'), ('Борис');
INSERT INTO orders (user_id, amount) VALUES (1, 500), (1, 300), (2, 700);
CREATE VIEW customer_revenue AS
SELECT u.name, SUM(o.amount) AS revenue
FROM users u
JOIN orders o ON o.user_id = u.id
GROUP BY u.name;
SELECT * FROM customer_revenue ORDER BY revenue DESC;
Вывод:
name revenue Борис 700 Анна 800
Теперь сложный запрос с JOIN и GROUP BY доступен под простым именем customer_revenue.
Итог
- Представление — это именованный сохранённый
SELECT, своих данных оно не хранит. - Упрощает повторяющиеся запросы и скрывает сложность.
- Помогает с безопасностью: даёт доступ к подмножеству данных без открытия исходных таблиц.
- Представления с агрегатами — только для чтения.
Проверьте себя
1. Что такое представление (VIEW) в MySQL?
Aкопия таблицы на диске
Bсохранённый под именем SELECT-запрос, к которому обращаются как к таблице
Cрезервная копия базы
Dтип индекса
2. Какое преимущество даёт представление с точки зрения безопасности?
Aшифрует таблицы
Bпозволяет открыть доступ к подмножеству данных, не показывая исходные таблицы целиком
Cускоряет вход в систему
Dзапрещает SELECT
3. Можно ли через представление с GROUP BY вставлять данные?
Aда, всегда
Bнет, представления с агрегатами доступны только для чтения
Cда, но только в MyISAM
Dтолько если оно без JOIN