Вид (View) – это SQL запрос, который хранится в базе данных (далее – БД) с определённым именем. Это таблица, которая хранится в форме предопределённого SQL запроса.
Вид может содержать все записи таблицы или читать данные из таблицы и может быть создан из нескольких таблиц.
Виды позволяют нам:
- Структурировать данные наиболее удобным способом.
- Ограничить доступ к данным, которые может видеть пользователь.
- Собирать данные из нескольких таблиц, которые могут быть использованы для генерирования отчётов.
Создание вида
Для создания вида в языке SQL используется команда CREATE VIEW.
Запрос с использованием данной команды имеет следующий вид:
CREATE VIEW имя_вида AS
SELECT колонка1, колонка2.....
FROM имя_таблицы
WHERE [условие];
Пример:
Предположим, что у нас есть таблица developers, которая содержит следующие данные:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
| 6 | Kolya Nikolaev | Javascript | 5 | 3400 |
| 7 | Ivan Ivanov | C# | 1 | 900 |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
Попробуем создать вид для данной таблицы с помощью следующего запроса:
mysql> CREATE VIEW developers_view AS
SELECT NAME, SPECIALTY
FROM developers;
Вызовем наш вид, используя команду, указанную ниже:
mysql> SELECT * FROM developers_view;
После обработки данного запроса мы получим следующий результат:
+-------------------+------------+
| NAME | SPECIALTY |
+-------------------+------------+
| Eugene Suleimanov | Java |
| Peter Romanenko | Java |
| Andrei Komarov | JavaScript |
| Konstantin Geiko | C# |
| Asya Suleimanova | UI/UX |
| Kolya Nikolaev | Javascript |
| Ivan Ivanov | C# |
| Ludmila Geiko | UI/UX |
+-------------------+------------+
Проверка вводимых данных
У нас также есть возможность проверять, чтобы все новые данные и изменения в уже существующие данные соответствовали определённым условиям.
Если условия не соблюдаются – генерируется ошибка.
Для создания такого вида используется запрос, который выглядит следующим образом:
mysql> CREATE VIEW developers_view_with_check_option AS
SELECT NAME, SPECIALTY
FROM developers
WHERE SPECIALTY IS NOT NULL
WITH CHECK OPTION;
Изменение вида
На изменение вида накладываются определённые ограничения:
- SELECT не может содержать функций подсчёта.
- SELECT не может содержать функций присваивания.
- SELECT не может содержать ключевое слова DISTINCT
- SELECT не может содержать условие ORDER BY
- FROM не может содержать несколько таблиц
- Запрос не может содержать HAVING или GROUP BY
- WHERE не может содержать подзапросов
- Все колонки NOT NULL из базовой таблицы должны быть включены в вид для запроса INSERT
- Вычисленные колонки не могут быть изменены
Попробуем выполнить следующий запрос на изменение данных:
mysql> UPDATE developers_view
SET SPECIALTY = 'C++'
WHERE NAME = 'Andrei Komarov';
В результате обработки данного запроса, наш вид будет выглядеть следующим образом:
+-------------------+------------+
| NAME | SPECIALTY |
+-------------------+------------+
| Eugene Suleimanov | Java |
| Peter Romanenko | Java |
| Andrei Komarov | C++ |
| Konstantin Geiko | C# |
| Asya Suleimanova | UI/UX |
| Kolya Nikolaev | Javascript |
| Ivan Ivanov | C# |
| Ludmila Geiko | UI/UX |
+-------------------+------------+
Добавление записей в вид
Для добавления данных в вид используется следующий синтаксис:
mysql> INSERT INTO developers_view
VALUES ('Kolya Nikolaev', 'C#');
После выполнения данного запроса вид developers_view содержит следующие данные:
+-------------------+------------+
| NAME | SPECIALTY |
+-------------------+------------+
| Kolya Nikolaev | C# |
| Eugene Suleimanov | Java |
| Peter Romanenko | Java |
| Andrei Komarov | C++ |
| Konstantin Geiko | C# |
| Asya Suleimanova | UI/UX |
| Kolya Nikolaev | Javascript |
| Ivan Ivanov | C# |
| Ludmila Geiko | UI/UX |
+-------------------+------------+
Удаление записей из вида
Для удаления записи из вида, нам необходимо выполнить запрос, который указан ниже.
Попробуем удалить запись с именем “Kolya Nikolaev”:
mysql> DELETE FROM developers_view
WHERE NAME = 'Kolya Nikolaev';
После обработки данного запроса наш вид developers_view будет содержать следующие данные:
+-------------------+-----------+
| NAME | SPECIALTY |
+-------------------+-----------+
| Eugene Suleimanov | Java |
| Peter Romanenko | Java |
| Andrei Komarov | C++ |
| Konstantin Geiko | C# |
| Asya Suleimanova | UI/UX |
| Ivan Ivanov | C# |
| Ludmila Geiko | UI/UX |
+-------------------+-----------+
Удаление вида
Для удаления вида используется команда:
DROP VIEW имя_вида;
Попробуем удалить вид developers_view с помощью следующего запроса:
mysql> DROP VIEW developers_view;
Попытка обратиться к данному виду после этого приведёт к ошибке 1146:
mysql> SELECT * FROM developers_view;
ERROR 1146 (42S02): Table 'sql_tutorial.developers_view' doesn't exist
На этом мы заканчиваем изучение видов в языке SQL.
В следующей статье мы рассмотрим ключевое слово HAVING.