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

# Создание и заполнение таблицы на основе результатов запроса

<!-- source: ru/_includes/not_allow_for_oltp_note.md -->
{% note warning %}

<!-- source: ru/_includes/not_allow_for_oltp_text.md -->
Поддерживается только для [колоночных](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main#column-oriented-tables) таблиц. Поддержка функциональности для [строковых](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main#row-oriented-tables) таблиц находится в разработке.
<!-- endsource: ru/_includes/not_allow_for_oltp_text.md -->

{% endnote %}
<!-- endsource: ru/_includes/not_allow_for_oltp_note.md -->

Вызов `CREATE TABLE AS` создает новую [таблицу](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main), которая заполнена данными из результатов запроса.

```yql
CREATE TABLE table_name (
    PRIMARY KEY ( column, ... )
)
WITH ( key = value, ... )
AS SELECT ...
```

Имена и типы колонок будут соответствовать результатам `SELECT`.
Для колонок [неопционального типа](https://ydb.tech/docs/ru/yql/reference/types/optional.md?version=main) также будет выставлен модификатор `NOT NULL`.

Синтаксис `CREATE TABLE AS` позволяет задать только первичный ключ и параметры `WITH`, поэтому при создании таблицы не поддерживается указание имен колонок, [вторичных индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/secondary_index.md?version=main), [векторных индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/vector_index.md?version=main), [полнотекстовых индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/fulltext_index.md?version=main), [локальных блум-индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/bloom_skip_index.md?version=main), [локальных min_max-индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/min_max_index.md?version=main), [групп колонок](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/family.md?version=main). Имена и типы данных для столбцов новой таблицы автоматически наследуются из результирующего набора запроса SELECT. Все вышеперечисленное можно изменять при помощи [`ALTER TABLE`](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/index.md?version=main) после создания таблицы. При этом поддерживаются [дополнительные параметры](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/with.md?version=main).


## Особенности

{% note warning %}

Запись строк производится с полной перезаписью строки, как при использовании [`REPLACE INTO`](https://ydb.tech/docs/ru/yql/reference/syntax/replace_into.md?version=main), но при этом отсутствуют гарантии на порядок записи строк в таблицу.

Если `SELECT` вернул 2 или более строки с одним и тем же значением первичного ключа, то после завершения выполнения `CREATE TABLE AS` в созданной таблице будет только одна запись с таким значением первичного ключа. При этом какая именно из записей найденных в `SELECT` будет добавлена - в общем случае не определено.

{% endnote %}


* `CREATE TABLE AS` поддерживается только в режиме [неявного контроля транзакций](https://ydb.tech/docs/ru/concepts/transactions.md?version=main#implicit). Таблица появится по указанному пути уже заполненной.

* `CREATE TABLE AS` может быть только единственным [DML](https://en.wikipedia.org/wiki/Data_manipulation_language)/[DDL](https://en.wikipedia.org/wiki/Data_definition_language) выражением в запросе. Допустимо использование [PRAGMA](https://ydb.tech/docs/ru/yql/reference/syntax/pragma.md?version=main), [DECLARE](https://ydb.tech/docs/ru/yql/reference/syntax/declare.md?version=main) и [именованных выражений](https://ydb.tech/docs/ru/yql/reference/syntax/expressions.md?version=main#named-nodes).

* `CREATE TABLE AS` не конфликтует с другими транзакциями. При выполнении запроса не используются блокировки, а все чтения производятся из консистентного снапшота. Балансировка или разделение [таблеток](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#tablet) не приводят к ошибкам.

* `CREATE TABLE AS` позволяет использовать в одном запросе и [колоночные таблицы](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#column-oriented-table), и [строковые таблицы](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#row-oriented-table).

* `CREATE TABLE AS` создаёт таблицу во временной директории `.tmp/sessions`, а после успешной записи данных перемещает её в указанное место. Если операция прервётся из-за ошибки, временная таблица не удаляется мгновенно, а остаётся в системе ещё на некоторое время.

## Примеры

* Создание колоночной таблицы из результатов запроса

```yql
CREATE TABLE my_table (
    PRIMARY KEY (key1, key2)
) WITH (
    STORE=COLUMN
) AS SELECT 
    key AS key1,
    Unwrap(other_key) AS key2,
    value,
    String::Contains(value, "test") AS has_test
FROM other_table;
```
