Представления по сути представляют виртуальные таблицы. Но в отличии от стандартных таблиц представления содержат запросы, которые динамически извлекают используемые данные.
Представления предоставляют ряд преимуществ. Они упрощают комплексные SQL-операции. Они защищают данные, так как представления могут дать доступ к части таблицы, а не ко всей таблице. Представления также позволяют возвращать отформатированные значения из таблиц в нужной и удобной форме.
Для создания представления используется команда CREATE VIEW, которая имеет следующую форму:
CREATE VIEW [IF NOT EXISTS] название_представления [(столбец_1, столбец_2, ....)] AS выражение_SELECT
Например, пусть у нас есть три связанных таблицы:
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS customers;
CREATE TABLE products
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
company TEXT NOT NULL,
items_count INTEGER DEFAULT 0,
price INTEGER
);
CREATE TABLE customers
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
CREATE TABLE orders
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id INTEGER NOT NULL,
customer_id INTEGER NOT NULL,
created_at TEXT NOT NULL,
items_count INTEGER DEFAULT 1,
price INTEGER NOT NULL,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE
);
Пусть эти таблицы будут содержать следующие данные:
INSERT INTO products (name, company, items_count, price)
VALUES
('iPhone 13', 'Apple', 3, 76000),
('iPhone 12', 'Apple', 2, 51000),
('Galaxy S21', 'Samsung', 2, 56000),
('Galaxy S20', 'Samsung', 1, 41000),
('P40 Pro', 'Huawei', 5, 36000);
INSERT INTO customers(name) VALUES ('Tom'), ('Bob'),('Sam');
INSERT INTO orders (product_id, customer_id, created_at, items_count, price)
VALUES
(
(SELECT id FROM products WHERE name='Galaxy S21'),
(SELECT id FROM customers WHERE name='Tom'),
'2021-11-30',
2,
(SELECT price FROM products WHERE name='Galaxy S21')
),
(
(SELECT id FROM products WHERE name='iPhone 12'),
(SELECT id FROM customers WHERE name='Tom'),
'2021-11-29',
1,
(SELECT price FROM products WHERE name='iPhone 12')
),
(
(SELECT id FROM products WHERE name='iPhone 12'),
(SELECT id FROM customers WHERE name='Bob'),
'2021-11-29',
1,
(SELECT price FROM products WHERE name='iPhone 12')
);
Теперь добавим в базу данных, в которой содержатся данные таблицы, следующее представление:
CREATE VIEW IF NOT EXISTS orders_products_customers AS SELECT orders.created_at AS order_date, customers.name AS customer, products.name As product FROM orders INNER JOIN products ON orders.product_id = products.id INNER JOIN customers ON orders.customer_id = customers.id;
То есть данное представление фактически будет возвращать сводные данные из трех таблиц. И после его создания мы сможем его увидеть в узле Views у выбранной базы данных в SQL Server Management Studio:
Теперь используем созданное выше представление для получения данных:
SELECT * FROM orders_products_customers;
При создании представлений следует учитывать, что представления, как и таблицы, должны иметь уникальные имена в рамках той же базы данных.
Для удаления представления вызывается команда DROP VIEW:
DROP VIEW IF EXISTS orders_products_customers;
Также стоит отметить, что при удалении таблиц также следует удалить и представления, которые используют эти таблицы.