Как сделать представление в mysql

Обновлено: 05.07.2024

VIEW view_name [(column_list)]

AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

Эта инструкция создает новый view или заменяет существующий, если дано предложение OR REPLACE. Инструкция SELECT select_statement обеспечивает определение view. Инструкция может выбирать из основных таблиц или других views.

Эта инструкция требует привилегии CREATE VIEW для view и некоторой привилегии для каждого столбца, выбранного инструкцией SELECT. Для столбцов, используемых в другом месте в инструкции SELECT, Вы должны иметь привилегию SELECT. Если присутствует предложение OR REPLACE, Вы должны также иметь привилегию DROP для view.

Каждый view принадлежит базе данных. По умолчанию, новый view создан в заданной по умолчанию базе данных. Чтобы явно создавать view в указанной базе данных, определите его имя как db_name.view_name.

mysql> CREATE VIEW test.v AS SELECT * FROM t;

Основные таблицы и views совместно используют то же самое пространство имен внутри базы данных, так что база данных не может содержать основную таблицу и view, которые имеют то же самое имя.

Views должны иметь уникальные имена столбца без дубликатов, точно так же, как основные таблицы. По умолчанию, имена столбцов, найденных инструкцией SELECT используются для имени столбца view. Чтобы определять явные имена для столбцов view, может быть задано факультативное предложение column_list как список разделяемых запятой идентификаторов. Число имен в column_list должно быть таким же, как число столбцов, найденных командой SELECT.

Столбцы, найденные инструкцией SELECT, могут быть простыми ссылками к столбцам таблицы. Они также могут быть выражениями, которые используют функции, постоянные значения, операторы и т.д.

Неквалифицированная таблица или имя view в операторе SELECT интерпретируется относительно заданной по умолчанию базы данных. view может обратиться к таблицам или view в других базах данных, квалифицируя имя таблицы или view с соответствующим именем базы данных.

view может быть создан из многих видов инструкций SELECT. Он может обратиться к основным таблицам или другим view. Это может использовать объединения, UNION и подзапросы. SELECT не обязан обращаться к каким-либо таблицам. Следующий пример определяет view, который выбирает два столбца из другой таблицы, также как выражение, вычисленное из данных этих столбцов:

mysql> CREATE TABLE t (qty INT, price INT);

mysql> INSERT INTO t VALUES(3, 50);

mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;

mysql> SELECT * FROM v;

| qty | price | value |

Определение view подчиненно следующим ограничениям:

Инструкция SELECT не может содержать подзапрос в предложении FROM.

Инструкция SELECT не может обратиться к переменным пользователя или системы.

Инструкция SELECT не может обратиться к подготовленным операторным параметрам.

Внутри сохраненной подпрограммы, определение не может обратиться к стандартным параметрам или локальным переменным.

Любая таблица или view, упоминаемый в определении, должны существовать. Однако, после того, как view был создан, можно удалить таблицу или view, к которому определение обращается. В этом случае, использование view приводит к ошибке. Чтобы проверить определение view для выявления проблем этого вида, используйте инструкцию CHECK TABLE.

Определение не может обратиться к таблице типа TEMPORARY, и Вы не можете создавать TEMPORARY view.

Таблицы, поименованные в определении view, должны уже существовать.

Вы не можете связывать триггер с view.

ORDER BY позволяется в определении view, но это игнорируется, если Вы выбираете из view, используя инструкцию, которая имеет собственный ORDER BY.

Для других параметров или предложений в определении, которые добавлены к параметрам или предложениям инструкции, которая ссылается на view, эффект не определен. Например, если определение view включает предложение LIMIT, и Вы выбираете из view, применяя инструкцию, которая имеет собственное предложение LIMIT, не определено, которое ограничение применяется. Тот же самый принцип применяется к параметрам типа ALL, DISTINCT или SQL_SMALL_RESULT, которые следуют за ключевым словом SELECT, к предложениям типа INTO, FOR UPDATE, LOCK IN SHARE MODE и PROCEDURE.

Если Вы создаете view, а затем меняете среду, обрабатывающую запрос, меняя переменные системы, которые могут воздействовать на результаты, получаемые из view:

mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));

Query OK, 0 rows affected (0.00 sec)

mysql> SET NAMES 'latin1';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM v;

1 row in set (0.00 sec)

mysql> SET NAMES 'utf8';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM v;

1 row in set (0.00 sec)

Предложения DEFINER и SQL SECURITY определяют контекст защиты, который нужно использовать при проверке привилегий доступа при вызове view. Они были добавлены в MySQL 5.0.13, но реально работают с MySQL 5.0.16.

CURRENT_USER также известен как CURRENT_USER().

Внутри сохраненной подпрограммы, которая определена с характеристикой SQL SECURITY DEFINER, CURRENT_USER возвращает создателя подпрограммы. Это также воздействует на view, определенный внутри такой подпрограммы, если определение view содержит значение DEFINER для CURRENT_USER.

Заданное по умолчанию значение DEFINER: пользователь, который выполняет инструкцию CREATE VIEW (поскольку DEFINER = CURRENT_USER). Если задано значение user, это должно быть логином MySQL в формате 'user_name'@'host_name' (тот же самый формат, используется в инструкции GRANT). Требуются значения user_name и host_name.

Если Вы определяете предложение DEFINER, Вы не можете устанавливать значение к любому пользователю, если не имеете привилегии SUPER. Эти правила определяют допустимые значения пользователя для предложения DEFINER:

Если Вы не имеете привилегии SUPER, единственное допустимое значение user: Ваш собственный логин, определенный буквально или используя CURRENT_USER. Вы не можете устанавливать DEFINER к некоторому другому логину.

Если Вы имеете привилегию SUPER, Вы можете определять любой синтаксически допустимый логин. Если он фактически не существует, будет сгенерировано предупреждение.

Характеристика SQL SECURITY определяет, который логин MySQL использовать при проверке привилегий доступа для view. Допустимые значения: DEFINER и INVOKER. Они указывают, что view должен быть выполним пользователем, который определил или вызвал его, соответственно. Заданное по умолчанию значение для SQL SECURITY: DEFINER.

Начиная с MySQL 5.0.16 (когда были введены в строй DEFINER и SQL SECURITY), привилегии view проверяются следующим образом:

При определении view создатель view должен иметь привилегии, необходимые, чтобы использовать объекты верхнего уровня, к которым обращается view. Например, если определение view обращается к сохраненной функции, могут быть проверены только привилегии, необходимые чтобы вызвать функцию. Привилегии, требуемые, когда функция выполняется, могут быть проверены только, когда это выполняется: для различных вызовов функции, могут приниматься различные пути выполнения внутри функции.

Во время выполнения view, привилегии для объектов, к которым обращается view, проверены относительно привилегий создателя или исполнителя view, в зависимости от того, является ли характеристика SQL SECURITY равной DEFINER или INVOKER.

Если выполнение view вызывает выполнение сохраненной функции, инструкции прверки привилегии, выполненные внутри функции, зависят от того, определена ли функция с характеристикой SQL SECURITY, равной DEFINER или INVOKER. Если характеристика защиты DEFINER, функция выполняется с привилегиями создателя. Если характеристика INVOKER, функция выполняется с привилегиями, определенными в соответствии с характеристикой SQL SECURITY для view.

До MySQL 5.0.16 привилегии, требуемые для объектов, используемых в view, проверялись при создании view.

Пример: view мог бы зависеть от сохраненной функции, и та функция могла бы вызывать другие сохраненные подпрограммы. Например, следующий view вызывает сохраненную функцию f():

CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);

Предположим, что f() содержит инструкцию типа этого:

IF name IS NULL then CALL p1();

Привилегии, требуемые для выполнения инструкций внутри f(), должны быть проверены, когда f() выполняется. Это могло бы означать, что привилегии необходимы для p1() или p2(), в зависимости от пути выполнения внутри f(). Те привилегии должны быть проверены во время выполнения, а пользователь, который должен обладать привилегиями, определен значениями SQL SECURITY функции f() и view v.

DEFINER и предложение SQL SECURITY для views представляют собой расширения к стандарту SQL. В обычном SQL views обработаны, используя правила для SQL SECURITY INVOKER.

Если Вы вызываете view, который был создан до MySQL 5.0.13, это обрабатывается, как если бы это было создано с предложением SQL SECURITY DEFINER и со значением DEFINER, равным Вашему логину. Однако, потому что фактический definer неизвестен, MySQL выдает предупреждение. Чтобы обойти предупреждение, достаточно вновь создать view, так чтобы определение view включило предложение DEFINER.

Факультативное предложение ALGORITHM задает расширение MySQL для стандартного SQL. ALGORITHM берет три значения: MERGE, TEMPTABLE или UNDEFINED. Заданный по умолчанию UNDEFINED, если никакое предложение ALGORITHM не присутствует. Алгоритм воздействует на то, как MySQL обрабатывает view.

Для MERGE текст инструкции, которая обращается к view, и определение view объединены так, что части определения view заменяют соответствующие части инструкции.

Для TEMPTABLE результаты из просмотра view помещаются во временную таблицу, которая затем используется, чтобы выполнить инструкцию.

Для UNDEFINED MySQL выбирает, который алгоритм использовать. Это предпочитает MERGE варианту TEMPTABLE, если возможно, поскольку MERGE обычно более эффективен и потому, что view не может быть обновляемым, если временная таблица используется.

Причина выбирать TEMPTABLE явно: блокировки на основных таблицах могут быть сняты после того, как временная таблица была создана, но прежде, чем это используется, чтобы закончить обрабатывать инструкцию. Это могло бы привести к более быстрому снятию блокировки, чем алгоритм MERGE так, чтобы другая клиентура, которая использует view, не была блокирована очень долго.

Алгоритм view может быть UNDEFINED по трем причинам:

Никакое предложение ALGORITHM не присутствует в инструкции CREATE VIEW.

Инструкция CREATE VIEW имеет явное предложение ALGORITHM = UNDEFINED.

ALGORITHM = MERGE определен для view, который может быть обработан только с временной таблицей. В этом случае MySQL генерирует предупреждение и устанавливает алгоритм к UNDEFINED (не к TEMPTABLE!).

Как упомянуто ранее, MERGE обработан, объединяя соответствующие части определения view в инструкцию, которая обращается к view. Следующие примеры кратко иллюстрируют, как работает алгоритм MERGE. Примеры принимают, что имеется view v_merge, который имеет это определение:

CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS

SELECT c1, c2 FROM t WHERE c3 > 100;

Пример 1: Предположим, что мы выдаем эту инструкцию:

SELECT * FROM v_merge;

MySQL обрабатывает инструкцию следующим образом:

v_merge становится t.

* становится vc1, vc2, которые соответствуют c1, c2.

Предложение WHERE из view добавляется.

Возникающая в результате инструкция, которая будет выполнена:

SELECT c1, c2 FROM t WHERE c3 > 100;

Пример 2: Предположим, что мы выдаем эту инструкцию:

SELECT * FROM v_merge WHERE vc1 100) AND (c1 CREATE TABLE t1 (a INT);

mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a WITH CHECK OPTION;

mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0

– > WITH LOCAL CHECK OPTION;

mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0

– > WITH CASCADED CHECK OPTION;

Здесь view v2 и v3 определены в терминах другого view, а именно v1. v2 имеет опцию проверки LOCAL, так что вставки проверены только для v2. v3 имеет опцию проверки CASCADED, так что вставки проверены не только по собственной проверки, но и для таковых основных view. Следующие инструкции иллюстрируют эти различия:

mysql> INSERT INTO v2 VALUES (2);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO v3 VALUES (2);

ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'

На обновляемость view можно воздействовать значением переменной системы updatable_views_with_limit. Команда CREATE VIEW была добавлена в MySQL 5.0.1. WITH CHECK OPTION было выполнено в MySQL 5.0.2.

Представление - это объект данных, который не содержит никаких данных. Содержимое представления является результатом базовой таблицы. Они работают так же, как базовая таблица, но не содержат собственных данных. Разница между представлением и таблицей заключается в том, что представления - это определения, построенные поверх других таблиц (или представлений). Если данные изменяются в базовой таблице, то же самое изменение отражается в представлении. Представление может быть построено поверх одной или нескольких таблиц.

Версия: MySQL 5.6

Содержание:

  • Представления могут быть эффективными копиями базовых таблиц.
  • Представления могут иметь имена столбцов и выражения.
  • Вы можете использовать любые пункты в представлениях.
  • Представления могут быть использованы в INSERT / UPDATE / DELETE.
  • Представления могут содержать выражения в списке выбора.
  • Представления могут быть представлениями представлений.

Для просмотра MySQL требуется версия 5.0 или выше

Чтобы заставить работать представления, вам нужно обновить MySQL до версии 5.0 (или выше). Вы можете проверить свою версию MySQL следующим образом:

Проверьте привилегии текущего пользователя:

Оператору CREATE VIEW требуется привилегия CREATE VIEW для представления и некоторая привилегия для каждого столбца, выбранного оператором SELECT. Следующая команда показывает права пользователя.

Выберите базу данных:

Перед созданием представления мы должны выбрать базу данных. Следующая команда показывает список баз данных.

Создать вид

Следующие утверждения создают представление. По умолчанию представление связано с базой данных по умолчанию (в настоящее время используется база данных). Чтобы связать представление с заданной базой данных, укажите имя как имя_базы_данных . view_name при его создании. Вот полный синтаксис:

Синтаксис:

Объяснение:

Оператор CREATE VIEW создает новый вид.

view_name: view_name - это имя представления. Представление всегда принадлежит базе данных. По умолчанию в текущей используемой базе данных создается новое представление. Имя представления также может использоваться с именем базы данных, как database_name.view_name, но это необязательно, если database_name является базой данных по умолчанию.

select_statement: select_statement является оператором SELECT и предоставляет определение представления. select_statement может выбирать данные из базовых таблиц или других представлений.

Пример:

column_list: часть column_list является необязательной. Он предоставляет список имен для столбцов представления сразу после имени представления, где имена должны быть уникальными. Количество имен в column_list должно быть таким же, как количество столбцов, извлеченных оператором SELECT. Если вы хотите присвоить столбцам вида другое имя, вы можете сделать это, добавив предложение [AS name] в список выбора.

Пример: просмотр без column_list

Теперь укажите имя столбца в представлении выше:

ИЛИ ЗАМЕНА: Если необязательное предложение ИЛИ ЗАМЕНИТЬ добавлено с оператором CREATE VIEW, оператор CREATE VIEW заменяет существующее представление и создает новое. Если представление не существует, CREATE VIEW - то же самое, что CREATE OR REPLACE VIEW.

- ALGORITHM: предложение ALGORITHM является необязательным, оно влияет на то, как MySQL обрабатывает представление. ALGORITHM принимает три значения: MERGE, TEMPTABLE или UNDEFINED. Алгоритм по умолчанию НЕ УКАЗАН.

[DEFINER = ]
[БЕЗОПАСНОСТЬ SQL ]: предложения DEFINER и SQL SECURITY задают контекст безопасности, который будет использоваться при проверке прав доступа во время вызова представления.

Если вы укажете предложение DEFINER, следующие правила определяют допустимые пользовательские значения DEFINER:

  • Если у вас нет привилегии SUPER, единственным допустимым значением пользователя является ваша собственная учетная запись, и вы не можете установить определитель для какой-либо другой учетной записи.
  • Если у вас есть привилегия SUPER, вы можете указать любое синтаксически допустимое имя учетной записи.

В хранимой подпрограмме, определенной с помощью характеристики SQL SECURITY DEFINER, CURRENT_USER возвращает значение подпрограммы DEFINER. Это также влияет на представление, определенное в такой подпрограмме, если определение представления содержит значение DEFINER CURRENT_USER.

[С [КАСКАДИРОВАННЫМ | LOCAL] CHECK OPTION]: предложение WITH CHECK OPTION может быть задано для обновляемого представления, чтобы предотвратить вставки или обновления строк, кроме тех, для которых предложение WHERE в select_statement имеет значение true. В предложении WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверочного тестирования, когда представление определяется в терминах другого представления. Ключевое слово LOCAL ограничивает опцию CHECK только определенным представлением. CASCADED заставляет также проверять проверки для базовых представлений. Когда не указано ни одно ключевое слово, по умолчанию используется CASCADED.

Ограничения на определение View

  • Оператор SELECT не может содержать подзапрос в предложении FROM.
  • Оператор SELECT не может ссылаться на системные или пользовательские переменные.
  • Внутри хранимой программы определение не может ссылаться на параметры программы или локальные переменные.
  • Оператор SELECT не может ссылаться на подготовленные параметры оператора.
  • Любая таблица или представление, указанные в определении, должны существовать.
  • Определение не может ссылаться на таблицу TEMPORARY, и вы не можете создать представление TEMPORARY.
  • Любые таблицы, названные в определении представления, должны существовать во время определения.
  • Вы не можете связать триггер с представлением.
  • Псевдонимы для имен столбцов в операторе SELECT проверяются по максимальной длине столбца в 64 символа (а не по максимальной длине псевдонима в 256 символов).

Инструменты для создания MySQL Views

Вы можете написать процедуру в инструменте командной строки MySQL или использовать MySQL Workbench, который является отличным интерфейсным инструментом (здесь мы использовали версию 5.3 CE).

Инструмент командной строки MySQL:

«MySQL

При выборе командной строки MySQL появится следующий экран:

«mysql5.6

После успешного входа в систему вы можете получить доступ к командной строке MySQL:

«mysql5.6

Теперь вы можете создать и запустить собственное представление, см. Следующий пример:

«MySQL

MySQL верстак (5.3 CE):

Выберите MySQL верстак из меню Пуск:

«MySQL

После выбора MySQL верстак появится следующий экран входа в систему:

«MySQL

Теперь введите данные для входа:

«MySQL

После успешного входа в систему появится новый экран и из панели браузера объектов выберите базу данных:

«MySQL

После выбора базы данных щелкните правой кнопкой мыши на Views, появится новое всплывающее окно:

«MySQL

«MySQL

«MySQL

Следующим экраном будет просмотр сценария и его применение в базе данных.

«MySQL

Теперь нажмите кнопку Готово и запустите просмотр:

«MySQL

Изменить вид

Оператор ALTER VIEW изменяет определение существующего представления. Синтаксис оператора похож на CREATE VIEW.

Синтаксис:

Для этого оператора требуются привилегии CREATE VIEW и DROP для представления, а также некоторые привилегии для каждого столбца, указанного в операторе SELECT.

Оставить представление

Оператор DROP VIEW используется для удаления одного или нескольких представлений. Чтобы удалить представление, вы должны иметь привилегию DROP для каждого представления. Вот синтаксис:

Синтаксис:

Предложение IF EXISTS предотвращает возникновение ошибки для несуществующих представлений.

MySQL CREATE VIEW с ГДЕ

Команда CREATE VIEW может использоваться с предложением WHERE.

Пример:

Пример таблицы: автор

Приведенный выше оператор MySQL создаст представление 'view_author', в котором будут приниматься записи (для всех столбцов) таблицы авторов, если эти записи содержат значение 'USA' для столбца страны.

MySQL CREATE VIEW с помощью AND и OR

Команда CREATE VIEW может использоваться с операторами AND и OR.

Пример:

Пример таблицы: издатель

Приведенный выше оператор MySQL создаст представление 'view_publisher', принимающее записи для столбцов pub_name, pub_city и country таблицы издателя, если (A) (i) значение столбца страны равно США, а (ii) значение pub_city равно New Йорк; или (B) (i) значение столбца страны - ИНДИЯ, а (ii) значение pub_city - Мумбаи.

MySQL CREATE VIEW с GROUP BY

Команда CREATE VIEW может использоваться с предложением GROUP BY.

Пример:

Пример таблицы: book_mast

Приведенный выше оператор создаст представление 'view_bookmast', в котором будут собраны все записи, сгруппированные по pub_lang, из pub_lang и количество книг для каждого языка (pub_lang).

MySQL CREATE VIEW с ORDER BY

Команда CREATE VIEW может использоваться с предложением ORDER BY.

Пример:

Пример таблицы: book_mast

Приведенный выше оператор MySQL создаст представление 'view_bookmast', в котором будут собраны все записи, сгруппированные по pub_lang и отсортированные по pub_lang, из pub_lang и количество книг для каждого языка (pub_lang) таблицы book_mast.

MySQL CREATE VIEW с МЕЖДУ и IN

Команда CREATE VIEW может использоваться с оператором BETWEEN и IN.

Пример:

Пример таблицы: book_mast

Приведенный выше оператор создаст представление 'view_bookmast', в котором будут собраны все записи таблицы book_mast, если (A) имя книги (book_name) начинается с любого из символов от 'A' до 'G' и (B) количества страниц (no_page) - любой из следующих 165, 250, 350, 400, 510.

MySQL CREATE VIEW с LIKE

Команда CREATE VIEW может использоваться с оператором LIKE.

Пример:

Пример таблицы: автор

Приведенный выше оператор MySQL создаст представление 'view_author', в котором будут приниматься все записи таблицы автора, если (A) имя автора (aut_name) не начинается с 'T' и (B) имя автора (aut_name) не начинается с буквой W

MySQL CREATE VIEW с использованием подзапросов

Команда CREATE VIEW может использоваться с подзапросами.

Пример:

Пример таблицы: покупка

Пример таблицы: book_mast

Приведенный выше оператор MySQL создаст представление 'view_purchase', в котором будут храниться все записи столбцов invoice_no, book_name и cate_id таблицы покупок, если идентификатор категории (cate_id) удовлетворяет условию, определенному в подзапросе (за которым следует cate_id =).

Подзапрос извлекает только cate_ids из таблицы book_mast, которая содержит книги с 201 страницей.

MySQL CREATE VIEW с помощью JOIN

Команда CREATE VIEW может использоваться вместе с оператором JOIN.

Пример:

Пример таблицы: категория

Пример таблицы: покупка

Приведенный выше оператор MySQL создаст представление view_purchase вместе с оператором JOIN.

Здесь оператор JOIN извлекает cate_id, cate_descrip из таблицы категорий и invoice_no, invoice_dt и book_name из таблицы покупок, если cate_id таблицы категорий и покупки совпадают.

MySQL CREATE VIEW с помощью UNION

Команда CREATE VIEW может использоваться с UNION.

Пример:

Пример таблицы: book_mast

Вышеупомянутая инструкция MySQL создаст представление 'view_bookmast', содержащее столбцы, как в 'book_mast'.

Записи будут вставлены с объединением трех подзапросов.

Третий запрос вставляет эти строки в представление view_bookmast из таблицы book_mast, строки которой имеют любое из следующих значений 165 250 350 400 500 в no_page.

Предыдущая: Транзакция MySQL
Далее: MySQL Security

Favorite

Добавить в избранное

SQL - Использование Views

V iew (представление) не более чем заявление в SQL, которое хранится в базе данных с соответствующим именем. View на самом деле является композиция из таблицы в виде заранее определенного запроса SQL.

Представление может содержать все строки таблицы или выбор строк из таблицы. Представление может быть создано из одного или нескольких таблиц, которая зависит от письменного запроса SQL, чтобы создать представление.

Представления являются типом виртуальных таблиц, которые позволяют пользователям выполнять следующие действия:

  • Структура данные таким образом, что пользователи или классы пользователей можно найти естественно или интуитивно.
  • Ограничить доступ к данным таким образом, что пользователь мог видеть и (иногда) изменить то, что им не нужно, и не больше.
  • Обобщить данные из различных таблиц, которые могут быть использованы для создания отчетов.

Создание представлений

Представления в базе данных создается с помощью заявления CREATE VIEW. Представления могут быть созданы из одной таблицы, нескольких таблиц или других представлений.

Для того, чтобы создать представление, пользователь должен иметь соответствующую привилегию системы в соответствии с конкретной реализацией.

Основной синтаксис CREATE VIEW выглядит следующим образом:

Вы можете включать в себя несколько таблиц в вашем SELECT аналогично тому, как вы используете их в обычном SQL запросе SELECT.

Примеры

Рассмотрим таблицу CUSTOMERS , имеющих следующие записи:

Ниже приведен пример создания представления из таблицы Customers. Эта представление будет использоваться для показа имени клиента и возраст из таблицы Customers.

Теперь вы можете запросить CUSTOMERS_VIEW подобным образом, как вы запрашиваете реальную таблицу. Ниже приведен пример того же.

Это произведет следующий результат.

WITH CHECK OPTION

WITH CHECK OPTION является вариантом заявления CREATE VIEW. Целью WITH CHECK OPTION является обеспечить, чтобы все UPDATE и INSERT удовлетворяют условию (ям) в определении вида.

Если они не удовлетворяют условию (а), то UPDATE или INSERT возвращает ошибку.

Следующий блок кода имеет пример создания такого же вида CUSTOMERS_VIEW с WITH CHECK OPTION.

WITH CHECK OPTION в этом случае запретит ввод каких-либо значений NULL в столбце AGE, так как представление определяется данными, которые не имеют значение NULL в столбце AGE.

Обновление View

Представление может быть обновлено при определенных условиях, которые приведены ниже:

  • SELECT не может содержать ключевое слово DISTINCT.
  • SELECT не может содержать итоговые функции.
  • SELECT не может содержать набор функций.
  • SELECT не может содержать набор операторов.
  • SELECT не может содержать ORDER BY.
  • FROM не может содержать несколько таблиц.
  • WHERE не может содержать подзапросы.
  • Запрос не может содержать GROUP BY или HAVING.
  • Вычисляемые столбцы не могут быть обновлены.
  • Все столбцы NOT NULL из базовой таблицы должны быть включены в представлении для запроса INSERT к функции.

Таким образом, если вид удовлетворяет все указанные выше правила, то вы можете обновить представление. Следующий блок кода имеет пример для обновления возраста AndreyEx.

Это в конечном итоге обновит клиентскую базу таблицы и те же будет отражаться в самом представлении. Теперь попробуйте запросить базовую таблицу с помощью SELECT, оператор произведет следующий результат.

Вставка строк в View

Строки данных могут быть вставлены в представление. Те же правила, которые применяются к команде UPDATE применяются также к команде INSERT.

Здесь мы не можем вставлять строки в CUSTOMERS_VIEW, потому что мы не включили к всем столбцам NOT NULL в этом представлении, в противном случае вы можете вставлять строки в представлении аналогично тому, как вставляете их в таблице.

Удаление строк в View

Ряды данных могут быть удалены из представления. Те же правила, которые применяются к командам UPDATE и INSERT применяются к команде DELETE.

Ниже приведен пример, чтобы удалить запись, имеет возраст = 33.

Это в конечном счете удалит строку из базовой таблицы клиентов, и то же самое будет отражать в самом представлении. Теперь попробуйте запросить базовую таблицу с помощью SELECT, оператор произведет следующий результат.

Удаление View

Очевидно, где у вас есть представление, вам нужен способ, чтобы удалить представление, если он больше не нужен. Синтаксис очень прост и приведен ниже:

Ниже приведен пример удаления CUSTOMERS_VIEW из таблицы Customers.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

На предыдущем этапе мы выполняли запросы к базе данных. Существенным недостатком запросов является то, что их формулировки не сохраняются в базе данных.

Для того чтобы преодолеть этот недостаток, придумали представления (view). Представления – это объекты базы данных, которые можно рассматривать как виртуальные таблицы. На самом деле хранится только формулировка команды SELECT, с помощью которой производится выборка данных из реальных таблиц.

Необходимость в использовании представлений возникает, например, в том случае, когда нужно запретить доступ пользователя к отдельным столбцам или строкам таблицы – тогда можно просто написать представление, в котором эти столбцы или строки не будут присутствовать, и предоставить доступ пользователю именно к этому представлению, а не к реальной таблице.

Другой полезной возможностью является вычисление значений, которые не хранятся непосредственно в таблице, но всегда могут быть рассчитаны.

Представление, как и запрос, может содержать информацию из разных таблиц.

Представления могут быть обновляемыми (т.е., предоставлять возможность не только чтения, но и изменения данных в исходных таблицах) и необновляемыми. Представление будет обновляемым только в том случае, если его структура такова, что SQL server может точно определить, в какие строки каких таблиц нужно поместить измененные данные. Необновляемыми будут, например, представления, содержащие итоговые данные и группировки.

Для создания представлений используется команда CREATE VIEW.

Краткий формат этой команды:

CREATE VIEW имя_представления AS

Например, создадим представление, содержащее список договоров и их кураторов для отдела с номером 1. Будет ли это представление обновляемым ?

CREATE VIEW k_contract1

SELECT k_contract.contract_num, k_contract.contract_date,

FROM k_contract INNER JOIN

k_staff ON k_contract.k_staff_staff_num = k_staff.staff_num

WHERE k_dept_dept_num = 1

Для просмотра представления следует выполнить команду

SELECT * FROM k_contract1


Проверим, является ли это представление обновляемым. Попробуем изменить, например, дату счета 1:

UPDATE k_contract1 SET contract_date=’2011-11-02’

Команда выполнилась успешно, и повторный запрос на выборку дает следующий результат:

SELECT * FROM k_contract1


Создадим вспомогательное представление для запросов о полностью оплаченных и частично оплаченных счетах (см. предыдущее занятие). Это представление для каждого счета содержит его номер и сумму оплаты.

CREATE VIEW k_pay_sum

SELECT k_bill_bill_num, SUM(payment_sum) AS pay_sum

GROUP BY k_bill_bill_num

Для просмотра представления следует выполнить команду

SELECT * FROM k_pay_sum.


Это представление не будет обновляемым. Проверим:

UPDATE k_pay_sum SET pay_sum=1500 WHERE k_bill_bill_num=1

Получим ошибку: ERROR 1288: The target table k_pay_sum of the UPDATE is not updatable. Действительно, невозможно изменить значение поля, в котором находится сумма чисел из разных строк.

Но нам и не требовалось обновлять данные в этом представлении. Теперь с помощью этого представления можно переформулировать запрос на выборку полностью оплаченных счетов, этот запрос станет проще:

Полностью оплаченные счета

SELECT b.bill_num AS "Номер счета",

b.bill_date AS "Дата счета",

b.bill_sum AS "Сумма счета",

p.pay_sum AS "Сумма оплаты"

FROM k_bill b, k_pay_sum p

WHERE b.bill_num=p.k_bill_bill_num AND




Представления это объект, созданный в результате запроса SELECT к таблице. Представление названо так потому, что само по себе не содержит данных, а извлекает их из таблиц, в момент обращения к нему.

При подготовке поста, нашёл классную статью на хабре. Очень всё подробно расписано.

Когда использовать представление?

Когда необходимо собрать разные поля из разных таблиц. Чтобы не создавать сложных запросов, можно просто создать представление.

Как создать представление?

7

Как видно из запроса по таблицам – наше представление появилось в списке таблиц. Многие действия – редактирование, удаление и др. будут такими же для представления, как и для реальной таблицы.

Читайте также: