Представления: сохранённые запросы как виртуальные таблицы
Дайте запросу имя и используйте его повторно, как таблицу
Главная идея: Представление (view) — это сохранённый оператор
SELECT, к которому можно обращаться так, будто это таблица. Оно не хранит собственных данных: каждый раз при чтении MySQL выполняет сохранённый запрос к настоящим (базовым) таблицам и возвращает свежий результат. Представления позволяют упаковать сложное соединение или фильтр под одним понятным именем, показать пользователю только нужные столбцы и строки и держать повторяющуюся логику в одном месте.
К концу темы вы сможете:
- создавать представление через
CREATE VIEW ... AS SELECT ..., - объяснить, как представление упрощает доступ, скрывая соединения и фильтры,
- использовать представление для защиты доступа, показывая только часть столбцов и строк,
- отличать обновляемое представление от только для чтения,
- предвидеть подводные камни сопровождения, такие как
SELECT *и изменения базовых таблиц.
1. Наша учебная схема
Все запросы ниже выполняются к одной небольшой базе интернет-магазина: таблица customers и таблица orders, связанные через customer_id. Создайте её один раз, и мы будем строить представления поверх неё.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50),
city VARCHAR(50),
vip BOOLEAN
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
amount DECIMAL(8,2),
status VARCHAR(20),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
INSERT INTO customers VALUES
(1, 'Ava', 'London', TRUE),
(2, 'Ben', 'Paris', FALSE),
(3, 'Chen', 'London', TRUE),
(4, 'Dina', 'Berlin', FALSE);
INSERT INTO orders VALUES
(101, 1, '2026-01-05', 120.00, 'shipped'),
(102, 2, '2026-01-06', 45.50, 'shipped'),
(103, 1, '2026-02-11', 300.00, 'pending'),
(104, 3, '2026-02-14', 80.00, 'cancelled'),
(105, 3, '2026-03-02', 210.00, 'shipped'),
(106, 4, '2026-03-08', 15.00, 'shipped');
Четыре клиента, шесть заказов. Держите эти данные в голове — таблицы результатов ниже получены именно из них.