Использование представлений
Представим, что пользователь создал запрос командой SELECT. Результат виден на экране сразу же. Если в следующий момент времени данные в исходных таблицах были изменены, то этот результат уже не актуален, и запрос нужно создавать снова. Тексты запросов, с которыми приходится очень часто обращаться к базе данных выгодно не писать каждый раз заново, а хранить. Именно для этого существуют представления или view. Иногда еще их называют виртуальными таблицами.
Представление - это объект реляционной базы данных, являющийся результатом выполнения запроса на основе команды SELECT, в момент обращения к представлению.
Таким образом, представление хранит текст запроса и выполняет его в тот момент, когда пользователь обращается к представлению. Поэтому результат представления всегда содержит самые новые данные.
Представления могут выбирать данные из таблиц и из других представлений. Но при этом следует помнить, что имена представлений и таблиц не должны совпадать в рамках всей базы данных.
Преимущества использования представлений:
- Дополнительная возможность настройки прав доступа к данным. Можно дать пользователю права не на таблицу, а на представление. А в представлении показывать только отдельные поля и записи.
- Возможность менять структуру данных на уровне представлений, не затрагивая таблицы и код приложений.
- Автоматический доступ к данным без повторного составления запроса.
Команды создания представлений
Представление создается командой CREATE VIEW и использованием команды SELECT внутри ее.
Если нужно создать представление, которое будет показывать всех абитуриентов в возрасте старше 18 лет, то его текст будет таким:
CREATE VIEW older18 AS SELECT * FROM abiturient;
Команда CREATE VIEW содержит следующие необязательные инструкции:
- OR REPLACE. Если представление с таким же именем уже существует, что оно будет удалено перед созданием нового. Если эту инструкцию пропустить, то в случае существования представления с таким же именем возникнет сообщение об ошибке.
- ALGORITHM. Позволяет задать алгоритм создания представления.
- WITH CHECK OPTION. В некоторые представления можно добавлять данные, а в некоторые нельзя. Это зависит от того, как представление построено. Данная инструкция предназначена для представлений, позволяющих изменять и добавлять данные. Она позволяет провести автоматическую проверку добавляемых строк на соответствие.
Алгоритмы в представлениях
Существует два алгоритма, которые выполняются при обращении к представлению:
- MERGE;
- TEMPTABLE.
Для того чтобы понимать разницу между ними, нужно помнить, что пользователь обращается к представлению чаще всего для выполнения какой-либо операции с ним. Например, пользователь хочет использовать представление при построении запроса. Если используется алгоритм MERGE, то содержимое представления заносится напрямую в эту операцию, а после этого операция выполняется. Если используется TEMPTABLE, то результат представления сначала размещается во временной таблице, а потом эта временная таблица используется в требуемой операции. Алгоритм MERGE работает эффективнее, поэтому если алгоритм не определен (UNDEFINED), то по умолчанию СУБД всегда пробует использовать MERGE.
Добавление данных через представление
Не все представления могут использоваться при добавлении данных. Чтобы это было возможно должно выполняться два условия:
- Представление, построенное на нескольких таблицах, должно содержать такую таблицу, строки которой как один к одному соответствуют строкам представления. Если такой таблицы нет, то через представление невозможно добавлять данные.
- Поля представления не должны содержать выражений, а должны быть простым перечислением полей таблиц.
Построим представление, которое будет показывать заявления всех абитуриентов мужского пола:
CREATE VIEW applic_male SELECT * FROM application LEFT JOIN abiturient ON application.idabiturient=abiturient.idabiturient WHERE abiturient.gender=’male’;
Для данного представления основной является таблица application (так как в операторе LEFT JOIN она находится слева). Следовательно, именно ее можно обновлять через представление.
Построим представление, которое показывает количество абитуриентов каждого пола:
CREATE VIEW count_male_female SELECT gender, count(idabiturient) FROM abiturient GROUP BY gender;
А вот это представление не подходит для добавления данных. В нем нет таблицы, строки которой соответствую строкам представления, и есть вычисляемое поле.