Полный цикл в digital

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 могут присутствовать в обоих операторах. Возможны три варианта развития событий - они обе будут выполнены, одна из них будет проигнорированна и результат неопределен. Рассмотрим подробнее эти случаи:

  1. Если в обоих операторах встречается условие WHERE, то оба этих условия будут выполнены как если бы они были объединены оператором AND
  2. Если в определении представления есть конструкция ORDER BY, то она будет работать только в случае отсутствия во внешнем операторе SELECT, обращающемся к представлению, собственного условия сортировки. При наличии конструкции ORDER BY во внешнем операторе сортировка, имеющаяся в определении представления, будет проигнорирована
  3. При наличии в обоих операторах модификаторов, влияющих на механизм блокировки, таких как 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 `имя_таблицы`
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг