Как изменить view mysql

In this tutorial, you will learn how to use the MySQL ALTER VIEW to modify the definition of an existing view.

Summary: in this tutorial, you will learn how to use the MySQL ALTER VIEW to modify the definition of an existing view.

Introduction to MySQL ALTER VIEW statement

The MySQL ALTER VIEW statement changes the definition of an existing view. The syntax of the ALTER VIEW is similar to the CREATE VIEW statement:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement;

Code language: SQL (Structured Query Language) (sql)

MySQL ALTER VIEW examples

See the following tables orders and orderdetails from the sample database.

orders orderdetails table

1) ALTER VIEW simple example

First, create a view based on the orders and orderdetails tables:

CREATE VIEW salesOrders AS SELECT orderNumber, productCode, quantityOrdered, priceEach, status FROM orders INNER JOIN orderDetails USING (orderNumber);

Code language: SQL (Structured Query Language) (sql)

Second, query data from the view salesorders:

SHOW CREATE VIEW salesorders;

Code language: SQL (Structured Query Language) (sql)

MySQL ALTER VIEW statement

Third, use the ALTER VIEW statement to change the processing algorithm of the view from UNDEFINED to MERGE and add customerNumber column to the view:

ALTER ALGORITHM=MERGE VIEW salesOrders AS SELECT orderNumber, customerNumber, productCode, quantityOrdered, priceEach, status FROM orders INNER JOIN orderDetails USING (orderNumber);

Code language: SQL (Structured Query Language) (sql)

Finally, show the view information to see the effect:

SHOW CREATE VIEW salesorders;

Code language: SQL (Structured Query Language) (sql)

2) ALTER VIEW using MySQL Workbench

Using MySQL Workbench to modify an existing view is more practical. Because you need to see the whole view definition before changing it.

First, open the Views, right-click the view that you want to modify, and select Alter View… menu item:

MySQL ALTER VIEW with Workbench step 1

MySQL Workbench will open an editor that displays the view’s DDL.

Second, change the DDL of the view and click the Apply button to confirm the changes. If you want to revert the change, click the Revert button:

MySQL ALTER VIEW with Workbench step 2

MySQL Workbench opens a confirmation window.

Third, click the Apply button to apply the change.

Note that MySQL Workbench uses CREATE OR REPLACE VIEW statement instead of ALTER VIEW statement

Finally, click the Finish button to close the window.

MySQL ALTER VIEW with Workbench step 4

In this tutorial, you have learned how to use the MySQL ALTER VIEW statement to modify an existing view. In addition, you learned how to use MySQL Workbench to alter a view.

Was this tutorial helpful?

SQL views offer more security and simplicity over data tables. In fact, you can easily update view in SQL in multiple ways. Here are the steps to update view in MySQL.

Here’s how to update view in MySQL. There are multiple ways to update view in SQL. You can update an SQL view’s query, or data. We will look at each of these ways to update view in MySQL.

Let’s say you have the following view order_view

mysql> create view order_view as
      select order_date,quantity
      from orders;

mysql> select * from order_view;
+------------+----------+
| order_date | quantity |
+------------+----------+
| 2020-05-01 |       23 |
| 2020-05-01 |       35 |
| 2020-05-02 |       45 |
| 2020-05-02 |       23 |
| 2020-05-03 |       19 |
| 2020-05-03 |       15 |
| 2020-05-04 |       34 |
| 2020-05-04 |       56 |
+------------+----------+

Bonus Read : How to Create View in MySQL

How to Update View in MySQL Using ALTER statement

You can update view in MySQL using ALTER statement. This will replace the SQL query for view, not underlying data.

mysql> alter view order_view as
       select order_date,quantity
       from orders
       where quantity>30;

mysql> select * from order_view;
+------------+----------+
| order_date | quantity |
+------------+----------+
| 2020-05-01 |       35 |
| 2020-05-02 |       45 |
| 2020-05-04 |       34 |
| 2020-05-04 |       56 |
+------------+----------+

Bonus Read : How to Get Cumulative Total Users in MySQL

How to Update View in MySQL Using CREATE OR REPLACE

You can also update view in MySQL using CREATE OR REPLACE statement. This will replace the SQL query for view, not underlying data.

mysql> create or replace view order_view as
       select order_date,product_id,quantity
       from orders;

mysql> select * from order_view;
+------------+------------+----------+
| order_date | product_id | quantity |
+------------+------------+----------+
| 2020-05-01 |          1 |       23 |
| 2020-05-01 |          2 |       35 |
| 2020-05-02 |          1 |       45 |
| 2020-05-02 |          2 |       23 |
| 2020-05-03 |          1 |       19 |
| 2020-05-03 |          2 |       15 |
| 2020-05-04 |          1 |       34 |
| 2020-05-04 |          2 |       56 |
+------------+------------+----------+

Bonus Read : How to Get New Users Per Day in MySQL

How to Update View in MySQL Using UPDATE

You can also update the underlying data of an SQL view using UPDATE statement. This will not update the view’s SQL query but actual table data.

mysql> update order_view
       set quantity=50
       where order_date>'2020-05-03';

mysql> select * from order_view;
+------------+----------+
| order_date | quantity |
+------------+----------+
| 2020-05-01 |       23 |
| 2020-05-01 |       35 |
| 2020-05-02 |       45 |
| 2020-05-02 |       23 |
| 2020-05-03 |       19 |
| 2020-05-03 |       15 |
| 2020-05-04 |       50 |
| 2020-05-04 |       50 |
+------------+----------+

Bonus Read : How to Calculate Revenue in MySQL

UPDATE statement works on SQL views only if they are direct subset of table data, without any aggregation or modification. So you can use UPDATE statement on views if the SELECT statement for view :

  • Doesn’t have DISTINCT, GROUP BY, HAVING, Aggregations, SET functions or operators
  • Doesn’t refer to multiple tables
  • Doesn’t have calculated columns

That’s it! Now you can easily update MySQL view and use it for data analysis & reporting.

Ubiq makes it easy to visualize data in minutes, and monitor in real-time dashboards. Try it Today!

Related posts:

  • About Author

mm

В комментариях Хабра упоминались вопросы по использованию представлений. Данный топик является обзором представлений, появившихся в MySQL версии 5.0. В нем рассмотрены вопросы создания, преимущества и ограничения представлений.

Что такое представление?

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

Представления иногда называют «виртуальными таблицами». Такое название связано с тем, что представление доступно для пользователя как таблица, но само оно не содержит данных, а извлекает их из таблиц в момент обращения к нему. Если данные изменены в базовой таблице, то пользователь получит актуальные данные при обращении к представлению, использующему данную таблицу; кэширования результатов выборки из таблицы при работе представлений не производится. При этом, механизм кэширования запросов (query cache) работает на уровне запросов пользователя безотносительно к тому, обращается ли пользователь к таблицам или представлениям.

Представления могут основываться как на таблицах, так и на других представлениях, т.е. могут быть вложенными (до 32 уровней вложенности).

Преимущества использования представлений:

  1. Дает возможность гибкой настройки прав доступа к данным за счет того, что права даются не на таблицу, а на представление. Это очень удобно в случае если пользователю нужно дать права на отдельные строки таблицы или возможность получения не самих данных, а результата каких-то действий над ними.
  2. Позволяет разделить логику хранения данных и программного обеспечения. Можно менять структуру данных, не затрагивая программный код, нужно лишь создать представления, аналогичные таблицам, к которым раньше обращались приложения. Это очень удобно когда нет возможности изменить программный код или к одной базе данных обращаются несколько приложений с различными требованиями к структуре данных.
  3. Удобство в использовании за счет автоматического выполнения таких действий как доступ к определенной части строк и/или столбцов, получение данных из нескольких таблиц и их преобразование с помощью различных функций.

Ограничения представлений в MySQL

В статье приведены ограничения для версии MySQL 5.1 (в дальнейшем их число может сократиться).

  • нельзя повесить триггер на представление,
  • нельзя сделать представление на основе временных таблиц; нельзя сделать временное представление;
  • в определении представления нельзя использовать подзапрос в части FROM,
  • в определении представления нельзя использовать системные и пользовательские переменные; внутри хранимых процедур нельзя в определении представления использовать локальные переменные или параметры процедуры,
  • в определении представления нельзя использовать параметры подготовленных выражений (PREPARE),
  • таблицы и представления, присутствующие в определении представления должны существовать.
  • только представления, удовлетворяющие ряду требований, допускают запросы типа UPDATE, DELETE и INSERT.

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

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

CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

* This source code was highlighted with Source Code Highlighter.

view_name — имя создаваемого представления. select_statement — оператор SELECT, выбирающий данные из таблиц и/или других представлений, которые будут содержаться в представлении

Оператор CREATE VIEW содержит 4 необязательные конструкции:

  1. OR REPLACE — при использовании данной конструкции в случае существования представления с таким именем старое будет удалено, а новое создано. В противном случае возникнет ошибка, информирующая о сществовании представления с таким именем и новое представление создано не будет. Следует отметить одну особенность — имена таблиц и представлений в рамках одной базы данных должны быть уникальны, т.е. нельзя создать представление с именем уже существующей таблицы. Однако конструкция OR REPLACE действует только на представления и замещать таблицу не будет.
  2. ALGORITM — определяет алгоритм, используемый при обращении к представлению (подробнее речь об этом пойдет ниже).
  3. column_list — задает имена полей представления.
  4. WITH CHECK OPTION — при использовании данной конструкции все добавляемые или изменяемые строки будут проверяться на соответствие определению представления. В случае несоответствия данное изменение не будет выполнено. Обратите внимание, что при указании данной конструкции для необновляемого представления возникнет ошибка и представление не будет создано. (подробнее речь об этом пойдет ниже).

По умолчанию колонки представления имеют те же имена, что и поля возращаемые оператором SELECT в определении представления. При явном указании имен полей представления column_list должен включать по одному имени для каждого поля разделенных запятой. Существует две причины по которым желательно использовать явное указание имен полей представления:

  1. Имена полей представления должны быть уникальны в пределах данного представления. При создании представления основанного на нескольких таблицах возможна ситуация повторения имен полей представления. Например:

    CREATE VIEW v AS SELECT a.id, b.id FROM a,b;* This source code was highlighted with Source Code Highlighter.

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

    CREATE VIEW v (a_id, b_id) AS SELECT a.id, b.id FROM a,b;* This source code was highlighted with Source Code Highlighter.

    Того же результата можно добиться, используя синонимы (алиасы) для названий колонок:

    CREATE VIEW v AS SELECT a.id a_id, b.id b_id FROM a,b;* This source code was highlighted with Source Code Highlighter.

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

    CREATE VIEW v AS SELECT group_concat(DISTINCT column_name oreder BY column_name separator '+') FROM table_name;* This source code was highlighted with Source Code Highlighter.

    Вряд ли удобно использовать в дальнейшем в качестве имени поля `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 заносит содержимое представления во временную таблицу, над которой затем выполняется оператор обращенный к представлению.
Обратите внимание: в случае использования этого алгоритма представление не может быть обновляемым (см. далее).

При создании представления есть возможность явно указать используемый алгоритм с помощью необязательной конструкции [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
UNDEFINED означает, что MySQL сам выбирает какой алгоритм использовать при обращении к представлению. Это значение по умолчанию, если данная конструкция отсутствует.

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

Пусть наше представление выбирает отношение числа просмотров к числу ответов для тем форума:

CREATE VIEW v AS SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0;* This source code was highlighted with Source Code Highlighter.

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

SELECT subject, param FROM v WHERE param>1000;* This source code was highlighted with Source Code Highlighter.

В случае MERGE алгоритма MySQL включает определение представления в использующийся оператор SELECT: заменяет имя представления на имя таблицы, заменяет список полей на определения полей представления и добавляет условие в части WHERE с помощью оператора AND. Итоговый оператор, выполняемый затем MySQL, выглядит следующим образом:

SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0 AND num_views/num_replies>1000;* This source code was highlighted with Source Code Highlighter.

Если в определении представления используются групповые функции (count, max, avg, group_concat и т.д.), подзапросы в части перечисления полей или конструкции DISTINCT, GROUP BY, то не выполняется требуемое алгоритмом MERGE соответствие 1 к 1 между строками таблицы и основанного на ней представления.

Пусть наше представление выбирает количество тем для каждого форума:

CREATE VIEW v AS SELECT forum_id, count(*) AS num FROM topics GROUP BY forum_id;* This source code was highlighted with Source Code Highlighter.

Найдем максимальное количество тем в форуме:

SELECT MAX(num) FROM v;* This source code was highlighted with Source Code Highlighter.

Если бы использовался алгоритм MERGE, то этот запрос был бы преобразован следующим образом:

SELECT MAX(count(*)) FROM topics GROUP BY forum_id;* This source code was highlighted with Source Code Highlighter.

Выполнение этого запроса приводит к ошибке «ERROR 1111 (HY000): Invalid USE of GROUP function», так как используется вложенность групповых функций.

В этом случае MySQL использует алгоритм TEMPTABLE, т.е. заносит содержимое представления во временную таблицу (данный процесс иногда называют «материализацией представления»), а затем вычисляет MAX() используя данные временной таблицы:

CREATE TEMPORARY TABLE tmp_table SELECT forum_id, count(*) AS num FROM topics GROUP BY forum_id;
SELECT MAX(num) FROM tmp_table;
DROP TABLE tpm_table;
* This source code was highlighted with Source Code Highlighter.

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

  1. В случае UNDEFINED MySQL пытается использовать MERGE везде где это возможно, так как он более эффективен чем TEMPTABLE и, в отличие от него, не делает представление не обновляемым.
  2. Если вы явно указываете MERGE, а определение представления содержит конструкции запрещающие его использование, то MySQL выдаст предупреждение и установит значение UNDEFIND.

Обновляемость представлений

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

  1. Соответствие 1 к 1 между строками представления и таблиц, на которых основано представление, т.е. каждой строке представления должно соответствовать по одной строке в таблицах-источниках.
  2. Поля представления должны быть простым перечислением полей таблиц, а не выражениеями col1/col2 или col1+2.

Обратите внимание: встречающиеся в русско-язычной литературе требования, чтобы обновляемое представление было основано на единственной таблице и присутствие в числе полей представления первичного ключа физичекой таблицы не являются необходимыми. Скорее всего требование единственной таблицы является ошибкой перевода. Дело в том, что через представление, основанное на нескольких таблицах, может обновлять только одну таблицу за запрос, т.е. конструкция SET оператора UPDATE должна перечислять колонки только одной таблицы из определения представления. Кроме того, чтобы представление, основанное на нескольких таблицах, было обновляемым, таблицы в его определении должны быть объединены только с помощью INNER JOIN, а не OUTER JOIN или UNION.

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

Обратите внимание: для представлений, основанных на нескольких таблицах, операция добавления данных (INSERT) работает только в случае если происходит добавление в единственную реальную таблицу. Удаление данных (DELETE) для таких представлений не поддерживается.

При использовании в определении представления конструкции WITH [CASCADED | LOCAL] CHECK OPTION все добавляемые или изменяемые строки будут проверяться на соответствие определению представления.

  • Изменение данных (UPDATE) будет происходить только если строка с новыми значениями удовлетворяет условию WHERE в определении представления.
  • Добавление данных (INSERT) будет происходить только если новая строка удовлетворяет условию WHERE в определении представления.

Иными словами, нельзя добавить или изменить данные в представлении таким образом, чтобы они не были доступны через представление.

Ключевые слова CASCADED и LOCAL определяют глубину проверки для представлений основанных на других представлениях:

  • Для LOCAL происходит проверка условия WHERE только в собственном определении представления.
  • Для CASCADED происходит проверка для всех представлений на которых основанно данное представление. Значением по умолчанию является CASCADED.

Рассмотрим пример обновляемого представления, основанного на двух таблицах. Пусть наше представление выбирает темы форума с числом просмотров более 2000.

punbb >CREATE OR REPLACE VIEW v AS
-> SELECT forum_name, `subject`, num_views FROM topics,forums f
-> WHERE forum_id=f.id AND num_views>2000 WITH CHECK OPTION;
Query OK, 0 rows affected (0.03 sec)

punbb >

SELECT * FROM v WHERE subject='test';
+------------+---------+-----------+
| forum_name | subject | num_views |
+------------+---------+-----------+
| Новости | test | 3000 |
+------------+---------+-----------+
1 row IN SET (0.03 sec)

punbb >

UPDATE v SET num_views=2003 WHERE subject='test';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 1 Changed: 0 WARNINGS: 0

punbb >

SELECT * FROM v WHERE subject='test';
+------------+---------+-----------+
| forum_name | subject | num_views |
+------------+---------+-----------+
| Новости | test | 2003 |
+------------+---------+-----------+
1 row IN SET (0.01 sec)

punbb >

SELECT subject, num_views FROM topics WHERE subject='test';
+---------+-----------+
| subject | num_views |
+---------+-----------+
| test | 2003 |
+---------+-----------+
1 rows IN SET (0.01 sec)* This source code was highlighted with Source Code Highlighter.

Однако, если мы попробуем установить значение num_views меньше 2000, то новое значение не будет удовлетворять условию WHERE num_views>2000 в определении представления и обновления не произойдет.

punbb >UPDATE v SET num_views=1999 WHERE subject='test';
ERROR 1369 (HY000): CHECK OPTION failed 'punbb.v'
* This source code was highlighted with Source Code Highlighter.

Не все обновляемые представления позволяют добавление данных:

punbb >INSERT INTO v (subject,num_views) VALUES('test1',4000);
ERROR 1369 (HY000): CHECK OPTION failed 'punbb.v'
* This source code was highlighted with Source Code Highlighter.

Причина в том, что значением по умолчанию колонки forum_id является 0, поэтому добавляемая строка не удовлетворяет условию WHERE forum_id=f.id в определении представления. Указать же явно значение forum_id мы не можем, так как такого поля нет в определении представления:

punbb >INSERT INTO v (forum_id,subject,num_views) VALUES(1,'test1',4000);
ERROR 1054 (42S22): Unknown COLUMN 'forum_id' IN 'field list'
* This source code was highlighted with Source Code Highlighter.

С другой строны:

punbb >INSERT INTO v (forum_name) VALUES('TEST');
Query OK, 1 row affected (0.00 sec)
* This source code was highlighted with Source Code Highlighter.

Таким образом, наше представление, основанное на двух таблицах, позволяет обновлять обе таблицы и добавлять данные только в одну из них.

Удачи в работе с представлениями!

Кросспост Представления (VIEW) в MySQL с SQLinfo.

В этом учебном пособии вы узнаете, как создавать, обновлять и удалять VIEWS в MySQL с помощью синтаксиса и примеров.

Описание

В MySQL VIEW (представление или вьюха) не является физической таблицей, а скорее представляет собой виртуальную таблицу, созданную запросом, соединяющим одну или несколько таблиц.

Синтаксис

Синтаксис для оператора CREATE VIEW в MySQL:

CREATE [OR REPLACE] VIEW view_name AS
SELECT columns
FROM tables
[WHERE conditions];

Параметры или аргументы

OR REPLACE — необязательный. Если вы не укажете этот атрибут и VIEW уже существует, оператор CREATE VIEW вернет ошибку.
view_name — имя VIEW, которое вы хотите создать в MySQL.
WHERE conditions — необязательный. Условия, которые должны быть выполнены для записей, которые должны быть включены в VIEW.

Пример

Ниже приведен пример использования оператора CREATE VIEW для создания представления в MySQL:

CREATE VIEW hardware_suppliers AS

  SELECT supplier_id, supplier_name

  FROM suppliers

  WHERE category_type = ‘Hardware’;

Этот пример CREATE VIEW создаст виртуальную таблицу hardware_suppliers на основе набора результатов оператора SELECT. Теперь вы можете запросить данные MySQL VIEW следующим образом:

SELECT *

FROM hardware_suppliers;

Обновить VIEW

Вы можете изменить определение VIEW в MySQL, не удаляя его с помощью оператора ALTER VIEW.

Синтаксис

Синтаксис оператора ALTER VIEW в MySQL:

ALTER VIEW view_name AS
SELECT columns
FROM table
WHERE conditions;

Пример

Вот пример того, как вы будете использовать оператор ALTER VIEW в MySQL:

ALTER VIEW hardware_suppliers AS

  SELECT supplier_id, supplier_name, address, city

  FROM suppliers

  WHERE category_type = ‘Hardware’;

Этот пример ALTER VIEW в MySQL обновит определение VIEW с именем hardware_suppliers, не удаляя его. В этом примере мы добавляем столбцы address и city в VIEW.

Удалить VIEW

Когда в MySQL создается VIEW, вы можете удалить его с помощью оператора DROP VIEW.

Синтаксис

Синтаксис оператора DROP VIEW в MySQL:

DROP VIEW [IF EXISTS] view_name;

Параметры или аргументы

view_name — имя представления, которое вы хотите удалить.
IF EXISTS — необязательный. Если вы не укажете этот атрибут и VIEW не существует, оператор DROP VIEW выдаст ошибку.

Пример

Ниже приведен пример использования оператора DROP VIEW в MySQL:

DROP VIEW hardware_suppliers;

Этот пример DROP VIEW удалит MySQL VIEW с именем hardware_suppliers.

Here, I explain what MySQL «views» are and how to use them.

MySQL provides us with the ability to create views. A view is defined as a stored query that when invoked, produces a result set. Some folk refer to views as «virtual tables».

Clear as mud? Let’s try again.

What is a View?

A view is a query that you save to the database. You can then run it later simply by calling that view (rather than writing out the query again).

The view could consist of a complex query but it will present the results as though it was a table. Therefore, you can query the view as though it was a table.

For example, you could have a complex query that selects data from three different tables. You could either type this complex query out every time you need to run it, or you could save the query as a view. Once it has been saved as a view, you can then run a simple SELECT statement to return the results of the complex query. But of course, you could also write a complex query against the view if need be.

Create a View

Creating views are very simple. You simply preceed your query with one line of code and run it. The view will immediately be created in your database.

Syntax

To create a view, type the following statement, followed by the query:

Replace view_name with whatever name you’d like to use for the view.

Example

If we run the following code against the FruitShop database:

We now see a view called vFruitInventory listed under Views (you may need to click the Refresh button for the SCHEMAS menu first):

MySQL Views 1

It’s a good idea to think of a naming convention for your views (as with any other database object) and stick to it. Many developers prefix their view names with v, vw, v_ or vw_ so that it makes it easier to distinguish views from tables in their queries. However, other developers disagree with this convention and prefer their table and view names to be interchangable.

Querying a View

Now we can query the view just like we’d query a table:

Result:

MySQL Views 2

Of course, we can use a more specific query too. For example, this one that selects only those records where the inventory is greater than or less than 10:

But we can’t query columns that aren’t referenced in the view (even if they are in the underlying tables that the view queries).

For example, we can query the Fruit table like this:

But we can’t query the above vFruitInventory view like this:

This is because the view doesn’t return the FruitId column. We specified the exact columns in the view and those are all that are returned. As mentioned, the result set of the view is just like a table and some like to call it a «virtual table». If the «table» doesn’t include those columns, you can’t query them.

Rather than being a limitation, this is actually a feature of views. This feature means that we can grant users access to some columns of a table but not others (via the view). In other words, we can grant a user access to a view without granting that user access to the underlying tables that the view accesses. Some tables might store sensitive information that the user isn’t allowed to access. But the same tables might also store non-sensitive information that they need to access. What to do? Create a view! And that view can select only the non-sensitive information from those tables.

Modifying a View

Here are two different methods to modify your view.

Option 1: Use the ALTER VIEW Statement

You can modify a view by using the ALTER VIEW statement. Like this:

Replace view_name with the name of the view that you’d like to alter.

Example

Let’s add the Fruit.FruitId field to the view:

Now, when we try to return the FruitId field in our queries we will get results.

But note that we can’t try to access this field as Fruit.FruitId. We can only access it as FruitId. And this is how it should be. After all, the view is a «virtual table» and we have no need to know the structure of the tables that it queries.

Option 2: Use CREATE OR REPLACE

Note that the view must exist before you run the ALTER VIEW statement. If it doesn’t exist, you’ll receive an error. You can avoid this issue by using a CREATE OR REPLACE statement. This will create the view if it doesn’t exist, or replace it if it does.

So we could’ve created the above view like this:

And then we could update it by using the same CREATE OR REPLACE statement, but just modifying the definition. For example, adding in the Fruit.FruitId field:

Dropping a View

You an drop a view by using the DROP VIEW statement. Like this:

The above statement will remove the view called vFruitInventory.

Dropping Multiple Views

You can drop multiple views using the same DROP VIEW statement. Just separate each view name with a comma. Like this:

The IF EXISTS Clause

You can also use the IF EXISTS clause to prevent an error from occuring if a view doesn’t exist:

Понравилась статья? Поделить с друзьями:
  • Как изменить vid pid устройства
  • Как изменить vid pid на флешке
  • Как изменить vendor id
  • Как изменить value input css
  • Как изменить v образный вырез на платье