VIEW - представления (виртуальные таблицы)
Представления VIEW
иногда называют "виртуальными таблицами". Такое название связано с тем, что
представление доступно для
пользователя как таблица, но само оно не содержит данных, а извлекает их из таблиц в момент обращения к нему. Если
данные изменены в базовой таблице, то пользователь получит актуальные данные при обращении к представлению,
использующему данную таблицу; кэширования результатов выборки из таблицы при работе представлений не производится.
Упрощенный синтаксис
Для создания представления используется оператор CREATE VIEW
, имеющий следующий синтаксис:
CREATE VIEW имя_представления AS
SELECT `список_столбцов`
FROM `имя_таблицы`
WHERE ограничения_на_список_строк;
Полный синтаксис
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW имя_представления [(column_list)]
AS SELECT_выборка
[WITH [CASCADED | LOCAL] CHECK OPTION]
[DROP VIEW имя_представления]
Оператор CREATE VIEW
содержит 4 необязательные конструкции:
OR REPLACE
при использовании данной конструкции в случае существования представления с таким именем старое будет удалено, а новое создано. В противном случае возникнет ошибка, информирующая о сществовании представления с таким именем и новое представление создано не будет. Следует отметить одну особенность — имена таблиц и представлений в рамках одной базы данных должны быть уникальны, т.е. нельзя создать представление с именем уже существующей таблицыALGORITM
определяет алгоритм, используемый при обращении к представлениюcolumn_lis
задает имена полей представленияWITH CHECK OPTION
при использовании данной конструкции все добавляемые или изменяемые строки будут проверяться на соответствие определению представления. В случае несоответствия данное изменение не будет выполнено. Обратите внимание, что при указании данной конструкции для необновляемого представления возникнет ошибка и представление не будет созданоDROP VIEW
после создания представления, его можно удалить с помощью SQL оператораDROP VIEW
По умолчанию колонки представления имеют те же имена, что и поля возращаемые оператором SELECT в определении представления. При явном указании имен полей представления column_list должен включать по одному имени для каждого поля разделенных запятой. Существует две причины по которым желательно использовать явное указание имен полей представления:
Причина 1
Имена полей представления должны быть уникальны в пределах данного представления. При создании представления основанного на нескольких таблицах возможна ситуация повторения имен полей представления, например:
CREATE VIEW v AS SELECT a.id, b.id FROM a,b;
Для избежания такой ситуации нужно явно указывать имена полей представления:
CREATE VIEW v (a_id, b_id) AS SELECT a.id, b.id FROM a,b;
Того же результата можно добиться, используя синонимы (алиасы) для названий колонок:
CREATE VIEW v AS SELECT a.id a_id, b.id b_id FROM a,b;
Причина 2
В случае если в определении представления получаемые данные преобразуются с помощью каких-то функций, то именем поля будет данное выражение, что не очень удобно для дальнейших ссылок на это поле, напимер:
CREATE VIEW v AS SELECT group_concat(DISTINCT column_name oreder BY column_name separator '+') FROM table_name;
Вряд ли удобно использовать в дальнейшем в качестве имени поля group_concat(DISTINCT username ORDER BY username
separator ‘+’)
.
Для просмотра содержимого представления мы используем оператор SELECT
(полностью аналогично как в случае
простой
таблицы), с другой строны, оператор SELECT
есть в самом определении представления, т.е. получается
вложенная конструкция
— запрос в запросе. При этом, некоторые конструкции оператора SELECT
могут присутствовать в обоих
операторах. Возможны
три варианта развития событий - они обе будут выполнены, одна из них будет проигнорированна и результат неопределен.
Рассмотрим подробнее эти случаи:
- Если в обоих операторах встречается условие
WHERE
, то оба этих условия будут выполнены как если бы они были объединены операторомAND
- Если в определении представления есть конструкция
ORDER BY
, то она будет работать только в случае отсутствия во внешнем оператореSELECT
, обращающемся к представлению, собственного условия сортировки. При наличии конструкцииORDER BY
во внешнем операторе сортировка, имеющаяся в определении представления, будет проигнорирована - При наличии в обоих операторах модификаторов, влияющих на механизм блокировки, таких как
HIGH_PRIORITY
, результат их совместного действия неопределен. Для избежания неопределенности рекомендуется в определении представления не использовать подобные модификаторы
Алгоритмы представлений
Существует два алгоритма, используемых MySQL при обращении к представлению: MERGE
и
TEMPTABLE
.
В случае алгоритма MERGE
, MySQL при обращении к представлению добавляет в использующийся оператор
соответствующие части
из определения представления и выполняет получившийся оператор.
В случае алгоритма TEMPTABLE
, MySQL заносит содержимое представления во временную таблицу, над которой
затем выполняется
оператор обращенный к представлению.
Создание временной таблицы
Создание временной таблицы на основе одной постоянной:
CREATE VIEW имя_представления AS
SELECT имя_таблицы.столбец as pos
FROM `имя_таблицы`
Создание временной таблицы на основе двух постоянных:
CREATE VIEW имя_представления AS
SELECT имя_таблицы_1.столбец as pos1, имя_таблицы_2.столбец as pos2
FROM `имя_таблицы_1`, `имя_таблицы_2`
Работа с временными таблицами
После создания таблицы, операции с ней проводятся как с обычными таблицами.
Получение данных:
SELECT `список_столбцов` (или*) FROM `имя_таблицы`
Вставка данных:
INSERT INTO `имя_таблицы` (`список_столбцов`) VALUES ('значение1', значение2)
Изменение данных:
UPDATE `имя_таблицы` SET `столбец` = значениe
Удаление данных:
DELETE FROM `имя_таблицы` WHERE `условие_удаления`
Удаление таблицы:
DROP VIEW `имя_таблицы`
Очистка таблицы:
TRUNCATE `имя_таблицы`