Представления (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
Поддержать проект