Skip to content

Commit

Permalink
YDBDOCS-517: refactoring YQL SELECT for YDB (ydb-platform#5995)
Browse files Browse the repository at this point in the history
Co-authored-by: Ivan Blinkov <[email protected]>
  • Loading branch information
Pseudolukian and blinkov authored Jul 15, 2024
1 parent 18604c2 commit 191c2a6
Show file tree
Hide file tree
Showing 62 changed files with 563 additions and 88 deletions.
5 changes: 5 additions & 0 deletions ydb/docs/ru/core/_includes/not_allow_for_olap_note.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% note warning %}

{% include [not_allow_for_olap_text](not_allow_for_olap_text.md) %}

{% endnote %}
1 change: 1 addition & 0 deletions ydb/docs/ru/core/_includes/not_allow_for_olap_text.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Поддерживается только для [строковых](../concepts/datamodel/table.md#strokovye-tablicy) таблиц. Поддержка функциональности для [колоночных](../concepts/datamodel/table.md#column-tables) таблиц находится в разработке.
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## Получение выборки данных {#query-processing}

Выполняется запрос на получение выборки данных с использованием команды [`SELECT`](../../../../yql/reference/syntax/select.md) языка запросов [YQL](../../../../yql/reference/index.md). Демонстрируется обработка полученной выборки в приложении.
Выполняется запрос на получение выборки данных с использованием команды [`SELECT`](../../../../yql/reference/syntax/select/index.md) языка запросов [YQL](../../../../yql/reference/index.md). Демонстрируется обработка полученной выборки в приложении.
2 changes: 1 addition & 1 deletion ydb/docs/ru/core/dev/yql-tutorial/select_all_columns.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Выборка данных из всех колонок

Выберите все колонки из таблицы с помощью оператора [SELECT](../../yql/reference/syntax/select.md).
Выберите все колонки из таблицы с помощью оператора [SELECT](../../yql/reference/syntax/select/index.md).

{% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## EvaluateExpr, EvaluateAtom {#evaluate_expr_atom}

Возможность выполнить выражение до начала основного расчета и подставить его результат в запрос как литерал (константу). Во многих контекстах, где в стандартном SQL ожидалась бы только константа (например, в именах таблиц, количестве строк в [LIMIT](../../../syntax/select.md#limit) и т.п.) этот функционал активируется неявным образом автоматически.
Возможность выполнить выражение до начала основного расчета и подставить его результат в запрос как литерал (константу). Во многих контекстах, где в стандартном SQL ожидалась бы только константа (например, в именах таблиц, количестве строк в [LIMIT](../../../syntax/select/limit_offset.md) и т.п.) этот функционал активируется неявным образом автоматически.

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# DISCARD

Вычисляет {% if select_command == "SELECT STREAM" %}[`SELECT STREAM`](../select_stream.md){% else %}[`SELECT`](../select.md){% endif %}{% if feature_mapreduce %}{% if reduce_command %}, [`{{ reduce_command }}`](../reduce.md){% endif %} или [`{{ process_command }}`](../process.md){% endif %}, но не возвращает результат ни в клиент, ни в таблицу. {% if feature_mapreduce %}Не может быть задано одновременно с [INTO RESULT](../into_result.md).{% endif %}
Вычисляет {% if select_command == "SELECT STREAM" %}[`SELECT STREAM`](../select_stream.md){% else %}[`SELECT`](../select/index.md){% endif %}{% if feature_mapreduce %}{% if reduce_command %}, [`{{ reduce_command }}`](../reduce.md){% endif %} или [`{{ process_command }}`](../process.md){% endif %}, но не возвращает результат ни в клиент, ни в таблицу. {% if feature_mapreduce %}Не может быть задано одновременно с [INTO RESULT](../into_result.md).{% endif %}

Полезно использовать в сочетании с [`Ensure`](../../builtins/basic.md#ensure) для проверки выполнения пользовательских условий на финальный результат вычислений.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Область видимости для тела lambda — сначала локальные именованные выражения, затем аргументы, затем именованные выражения, определенные выше lambda на верхнем уровне запроса.

В теле lambda можно использовать только чистые выражения — в том числе другие lambda, возможно, переданные через аргументы. Но нельзя использовать [SELECT](../../select.md), [INSERT INTO](../../insert_into.md) и прочие выражения верхнего уровня.
В теле lambda можно использовать только чистые выражения — в том числе другие lambda, возможно, переданные через аргументы. Но нельзя использовать [SELECT](../../select/index.md), [INSERT INTO](../../insert_into.md) и прочие выражения верхнего уровня.

Один или более последних параметров lambda могут быть помечены вопросиком как необязательные — если они не были указаны при вызове lambda, то им будет присвоено значение `NULL`.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
{% endif %}

Семантика табличного выражения зависит от контекста в котором оно используется. В YQL табличные выражения могут применяться в следующих контекстах:
* табличный контекст - после [FROM](../../select.md#from).
* табличный контекст - после [FROM](../../select/from.md).
Здесь табличные выражения работают как ожидается – например `$input = SELECT a, b, c FROM T; SELECT * FROM $input` вернет таблицу с тремя колонками.
Табличный контекст также возникает после [UNION ALL](../../select.md#unionall){% if feature_join %}, [JOIN](../../join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../../process.md#process), [REDUCE](../../reduce.md#reduce){% endif %};
Табличный контекст также возникает после [UNION ALL](../../select/index.md#unionall){% if feature_join %}, [JOIN](../../join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../../process.md#process), [REDUCE](../../reduce.md#reduce){% endif %};
* векторный контекст - после [IN](#in). В этом контексте табличное выражение обязано содержать ровно одну колонку (имя этой колонки никак не влияет на результат выражения).
Табличное выражение в векторном контексте типизируется как список (тип элемента списка при этом совпадает с типом колонки). Пример: `SELECT * FROM T WHERE key IN (SELECT k FROM T1)`;
* скалярный контекст возникает _во всех остальных случаях_. Как и в векторном контексте,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

{% note info %}

Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать [подзапрос](../../select.md#from) или выражение `GROUP BY ... AS ...`.
Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать [подзапрос](../../select/from.md) или выражение `GROUP BY ... AS ...`.

{% endnote %}

Expand All @@ -20,5 +20,5 @@ ORDER BY count DESC
LIMIT 3;
```

Также ключевое слово `DISTINCT` может использоваться для выборки уникальных строк через [`SELECT DISTINCT`](../../select.md#distinct).
Также ключевое слово `DISTINCT` может использоваться для выборки уникальных строк через [`SELECT DISTINCT`](../../select/distinct.md).

Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ GROUP BY

{% note warning "Внимание" %}

Возможность указывать имя для колонки или выражения в `GROUP BY .. AS foo` является расширением YQL. Такое имя становится видимым в `WHERE` несмотря на то, что фильтрация по `WHERE` выполняется [раньше](../../select.md#selectexec) группировки. В частности, если в таблице `T` есть две колонки `foo` и `bar`, то в запросе `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` фильтрация фактически произойдет по колонке `bar` из исходной таблицы.
Возможность указывать имя для колонки или выражения в `GROUP BY .. AS foo` является расширением YQL. Такое имя становится видимым в `WHERE` несмотря на то, что фильтрация по `WHERE` выполняется [раньше](../../select/index.md#selectexec) группировки. В частности, если в таблице `T` есть две колонки `foo` и `bar`, то в запросе `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` фильтрация фактически произойдет по колонке `bar` из исходной таблицы.

{% endnote %}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## HAVING {#having}

Фильтрация выборки `SELECT` по результатам вычисления [агрегатных функций](../../../builtins/aggregation.md). Синтаксис аналогичен конструкции [`WHERE`](../../select.md#where).
Фильтрация выборки `SELECT` по результатам вычисления [агрегатных функций](../../../builtins/aggregation.md). Синтаксис аналогичен конструкции [`WHERE`](../../select/where.md).

**Пример**

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
# INSERT INTO

{% if backend_name == "YDB" %}

{% note warning %}

{% include [OLAP_not_allow_text](../../../../_includes/not_allow_for_olap_text.md) %}

{% cut "Способы загрузки данных в колоночные таблицы" %}
* [YDB CLI](../../../../reference/ydb-cli/export-import/import-file.md)
* [Пакетная вставка данных](../../../../recipes/ydb-sdk/bulk-upsert.md)
* [FluentBit](../../../../integrations/fluent-bit.md)
* [Yandex Data Transfer](https://yandex.cloud/ru/services/data-transfer)

{% endcut %}

{% endnote %}

{% endif %}

{% if select_command != "SELECT STREAM" %}
Добавляет строки в таблицу. {% if feature_bulk_tables %} Если целевая таблица уже существует и не является сортированной, операция `INSERT INTO` дописывает строки в конец таблицы. В случае сортированной таблицы, YQL пытается сохранить сортированность путем запуска сортированного слияния. {% endif %}{% if feature_map_tables %} При попытке вставить в таблицу строку с уже существующим значением первичного ключа операция завершится ошибкой с кодом `PRECONDITION_FAILED` и текстом `Operation aborted due to constraint violation: insert_pk`.{% endif %}
Добавляет строки в {% if backend_name == "YDB" %}строковую{% endif %} таблицу. {% if feature_bulk_tables %} Если целевая таблица уже существует и не является сортированной, операция `INSERT INTO` дописывает строки в конец таблицы. В случае сортированной таблицы, YQL пытается сохранить сортированность путем запуска сортированного слияния. {% endif %}{% if feature_map_tables %} При попытке вставить в таблицу строку с уже существующим значением первичного ключа операция завершится ошибкой с кодом `PRECONDITION_FAILED` и текстом `Operation aborted due to constraint violation: insert_pk`.{% endif %}

{% if feature_mapreduce %}Таблица по имени ищется в базе данных, заданной оператором [USE](../use.md).{% endif %}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# INTO RESULT

Позволяет задать пользовательскую метку для [SELECT](../select.md){% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../process.md) или [REDUCE](../reduce.md){% endif %}. Не может быть задано одновременно с [DISCARD](../discard.md).
Позволяет задать пользовательскую метку для [SELECT](../select/index.md){% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../process.md) или [REDUCE](../reduce.md){% endif %}. Не может быть задано одновременно с [DISCARD](../discard.md).

**Примеры:**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
| --- | --- |
| Флаг | false |

Автоматически выполнять [COMMIT](../../select.md#commit) после каждого выражения.
Автоматически выполнять [COMMIT](../../select/index.md#commit) после каждого выражения.

### TablePathPrefix {#table-path-prefix}

Expand Down Expand Up @@ -105,7 +105,7 @@ EACH использует [TablePathPrefix](#table-path-prefix) для кажд

При использовании `SELECT foo.* FROM ... AS foo` убрать префикс `foo.` у имен результирующих колонок.

Работает в том числе и для [JOIN](../../join.md), но в этом случае имеет право упасть в случае конфликта имен (который можно разрешить с помощью [WITHOUT](../../select.md#without) и переименования колонок). Для JOIN в режиме SimpleColumns производится неявный Coalesce для ключевых колонок: запрос `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` в режиме SimpleColumns работает как `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`
Работает в том числе и для [JOIN](../../join.md), но в этом случае имеет право упасть в случае конфликта имен (который можно разрешить с помощью [WITHOUT](../../select/without.md) и переименования колонок). Для JOIN в режиме SimpleColumns производится неявный Coalesce для ключевых колонок: запрос `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` в режиме SimpleColumns работает как `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`

### CoalesceJoinKeysOnQualifiedAll

Expand Down Expand Up @@ -170,11 +170,11 @@ StrictJoinKeyTypes является [scoped](#pragmascope) настройкой.
### OrderedColumns {#orderedcolumns}
`OrderedColumns` / `DisableOrderedColumns`

Выводить [порядок колонок](../../select.md#orderedcolumns) в SELECT/JOIN/UNION ALL и сохранять его при записи результатов. По умолчанию порядок колонок не определен.
Выводить [порядок колонок](../../select/index.md#orderedcolumns) в SELECT/JOIN/UNION ALL и сохранять его при записи результатов. По умолчанию порядок колонок не определен.

### PositionalUnionAll {#positionalunionall}

Включить соответствующий стандарту поколоночный режим выполнения [UNION ALL](../../select.md#unionall). При этом автоматически включается
Включить соответствующий стандарту поколоночный режим выполнения [UNION ALL](../../select/index.md#unionall). При этом автоматически включается
[упорядоченность колонок](#orderedcolumns).

### RegexUseRe2
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

## ASSUME ORDER BY
# ASSUME ORDER BY

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## SELECT
# SELECT

Возвращает результат вычисления выражений, указанных после `SELECT`.

Expand Down
Loading

0 comments on commit 191c2a6

Please sign in to comment.