Руководство по SQL. Виды.

Вид (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.