---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ydb.tech/docs/en/yql/reference/syntax/create-view.md
  - https://ydb.tech/docs/ru/yql/reference/syntax/create-view.md
sourcePath: ru/core/yql/reference/syntax/create-view.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# CREATE VIEW

`CREATE VIEW` создаёт [представление](https://ydb.tech/docs/ru/concepts/datamodel/view.md).

Представление - это обёртка над `SELECT` запросом, позволяющая обращаться к нему как к таблице, в которую сохранены актуальные результаты выполнения этого запроса. Представление не хранит никаких данных, кроме текста запроса. Чтение из представления аналогично чтению из подзапроса.

## Синтаксис

```yql
CREATE VIEW [IF NOT EXISTS] <имя>
[ WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] ) ]
AS <запрос>
```

### Параметры

* `IF NOT EXISTS` - при использовании этой конструкции, выражение не возвращает ошибку, если представление с указанным именем уже существует.
* `имя` - имя создаваемого представления. Должно быть уникально. Допускается запись в виде абсолютного пути до представления.
* `запрос` - `SELECT` запрос, который выдаёт столбцы и строки представления.
* `WITH ( <имя_параметра_представления> [= <значение_параметра_представления>] [, ... ] )` позволяет задать значения параметров, определяющих поведение представления. Поддерживаются следующие опции:

  * `security_invoker` (Bool) - опция, при включении которой запрос, хранящийся в представлении, будет исполнен от имени пользователя, читающего из представления, а не от имени создателя представления. {#security_invoker}

{% note info %}

При выборе имени для представления учитывайте общие [правила именования схемных объектов](https://ydb.tech/docs/ru/concepts/datamodel/cluster-namespace.md#object-naming-rules).

{% endnote %}

## Замечания

`security_invoker` опция должна быть всегда выставлена в `TRUE`, потому что поведением по умолчанию для представления является исполнение сохранённого запроса от имени создателя представления, но эта возможность на данный момент не реализована в YDB.

Контекст исполнения запроса, хранящегося в представлении, отличается от контекста объемлющего запроса, читающего из представления. Внутренний контекст создаётся заново и ничего не наследует из объемлющего. Он не "видит" ранее определённые PRAGMA (например, TablePathPrefix), именованные выражения и прочее. Самое важное следствие из этого состоит в том, что названия таблиц (и, возможно, других представлений), на которые ссылается создаваемое представление, должны быть записаны в виде абсолютного пути. В приведенных ниже [примерах](#examples) видно, что пути до таблиц, из которых читает создаваемое представление, записаны в абсолютном виде: `/domain/database/path/to/underlying_table`. В следующих релизах эта недоработка будет исправлена. {#context}

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

```yql
CREATE VIEW view_with_a_renamed_column WITH (security_invoker = TRUE) AS
SELECT
    original_column_name AS custom_column_name
FROM `/domain/database/path/to/underlying_table`;
```

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

```yql
/*
CREATE VIEW view_with_an_asterisk WITH (security_invoker = TRUE) AS
SELECT
    *
FROM `/domain/database/path/to/underlying_table`;
*/

SELECT * FROM view_with_an_asterisk;
```

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

## Примеры {#examples}

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

```yql
CREATE VIEW recent_series WITH (security_invoker = TRUE) AS
SELECT
    *
FROM `/domain/database/path/to/series`
WHERE
    release_date > Date("2020-01-01");
```

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

```yql
CREATE VIEW recent_series_first_episodes_titles WITH (security_invoker = TRUE) AS
SELECT
    episodes.title AS first_episode
FROM `/domain/database/path/to/recent_series`
    AS recent_series
JOIN `/domain/database/path/to/episodes`
    AS episodes
USING(series_id)
WHERE episodes.season_id = 1 AND episodes.episode_id = 1;
```

## См. также

* [ALTER VIEW](https://ydb.tech/docs/ru/yql/reference/syntax/alter-view.md)
* [DROP VIEW](https://ydb.tech/docs/ru/yql/reference/syntax/drop-view.md)
