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

# Обзор SELECT

## Определение

Возвращает результат вычисления выражений, указанных после `SELECT`. Может использоваться в сочетании с другими операциями для получения иного эффекта.

## Примеры

```yql
SELECT "Hello, world!";
```

```yql
SELECT 2 + 2;
```


## Процедура выполнения SELECT {#selectexec}

Результат запроса `SELECT` вычисляется следующим образом:

* определяется набор входных таблиц – вычисляются выражения после [FROM](https://ytsaurus.tech/docs/ru/yql/syntax/select/from.md);
* к входным таблицам применяется [SAMPLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/sample.md) / [TABLESAMPLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/sample.md);
* выполняется [FLATTEN COLUMNS](https://ytsaurus.tech/docs/ru/yql/syntax/flatten.md#flatten-columns) или [FLATTEN BY](https://ytsaurus.tech/docs/ru/yql/syntax/flatten.md); алиасы, заданные во `FLATTEN BY`, становятся видны после этой точки;
* выполняются все [JOIN](https://ytsaurus.tech/docs/ru/yql/syntax/join.md);
* к полученным данным добавляются (или заменяются) колонки, заданные в [GROUP BY ... AS ...](https://ytsaurus.tech/docs/ru/yql/syntax/group_by.md) (выполняется после `WHERE` начиная с версии [2025.02](https://ytsaurus.tech/docs/ru/yql/changelog/2025.02.md#group-by-expr-alias-where));
* выполняется [WHERE](https://ytsaurus.tech/docs/ru/yql/syntax/select/where.md) - все данные не удовлетворяющие предикату отфильтровываются;
* выполняется [GROUP BY](https://ytsaurus.tech/docs/ru/yql/syntax/group_by.md), вычисляются значения агрегатных функций;
* выполняется фильтрация [HAVING](https://ytsaurus.tech/docs/ru/yql/syntax/group_by.md#having);
* вычисляются значения [оконных функций](https://ytsaurus.tech/docs/ru/yql/syntax/window.md);
* вычисляются выражения в `SELECT`;
* выражениям в `SELECT` назначаются имена заданные алиасами;
* к полученным таким образом колонкам применяется top-level [DISTINCT](https://ytsaurus.tech/docs/ru/yql/syntax/select/distinct.md);
* таким же образом вычисляются все подзапросы в операторах [UNION [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#union), [INTERSECT [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#intersect), [EXCEPT [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#except) и выполняется их объединение, пересечение, исключение соответственно;
* выполняется сортировка согласно [ORDER BY](https://ytsaurus.tech/docs/ru/yql/syntax/select/order_by.md);
* к полученному результату применяются [OFFSET и LIMIT](https://ytsaurus.tech/docs/ru/yql/syntax/select/limit_offset.md).

## Порядок колонок в YQL {#orderedcolumns}

В стандартном SQL порядок колонок указанных в проекции (в `SELECT`) имеет значение. Помимо того, что порядок колонок должен сохраняться при отображении результатов запроса или при записи в новую таблицу, некоторые конструкции SQL этот порядок используют.
Это относится в том числе к операторам [UNION [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#union), [INTERSECT [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#intersect), [EXCEPT [ALL]](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#except) и к позиционному [ORDER BY](https://ytsaurus.tech/docs/ru/yql/syntax/select/order_by.md) (ORDER BY ordinal).

По умолчанию в YQL порядок колонок игнорируется:

* порядок колонок в выходных таблицах и в результатах запроса не определен
* схема данных результата `UNION [ALL]`, `INTERSECT [ALL]` и `EXCEPT [ALL]` выводится по именам колонок, а не по позициям

При включении `PRAGMA OrderedColumns;` порядок колонок сохраняется в результатах запроса и выводится из порядка колонок во входных таблицах по следующим правилам:

* `SELECT` с явным перечислением колонок задает соответствующий порядок;
* `SELECT` со звездочкой (`SELECT * FROM ...`) наследует порядок из своего входа;
* порядок колонок после [JOIN](https://ytsaurus.tech/docs/ru/yql/syntax/join.md): сначала колонки левой стороны, потом правой. Если порядок какой-либо из сторон присутствующей в выходе `JOIN` не определен, порядок колонок результата также не определен;
* порядок `UNION [ALL]`, `INTERSECT [ALL]` и `EXCEPT [ALL]` зависит от [режима выполнения](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#positional-mode);
* порядок колонок для [AS_TABLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/from_as_table.md) не определен;


## Комбинация запросов {#combining-queries}

Результаты нескольких `SELECT` (или подзапросов) могут быть объединены с помощью ключевых слов `UNION` и `UNION ALL`.

```yql
query1 UNION [ALL] query2 (UNION [ALL] query3 ...)
```

Объединение более двух запросов интерпретируется как левоассоциативная операция, то есть

```yql
query1 UNION query2 UNION ALL query3
```

интерпретируется как

```yql
(query1 UNION query2) UNION ALL query3
```

Пересечение нескольких `SELECT` (или подзапросов) может быть вычислено с помощью ключевых слов `INTERSECT` и `INTERSECT ALL`.

```yql
query1 INTERSECT query2
```

Пересечение более двух запросов интерпретируется как левоассоциативная операция, то есть

```yql
query1 INTERSECT query2 INTERSECT query3
```

интерпретируется как

```yql
(query1 INTERSECT query2) INTERSECT query3
```

Исключение нескольких `SELECT` (или подзапросов) может быть вычислено с помощью ключевых слов `EXCEPT` и `EXCEPT ALL`.

```yql
query1 EXCEPT query2
```

Исключение более двух запросов интерпретируется как левоассоциативная операция, то есть

```yql
query1 EXCEPT query2 EXCEPT query3
```

интерпретируется как

```yql
(query1 EXCEPT query2) EXCEPT query3
```

Допускается одновременное использование разных операторов `UNION`, `INTERSECT` и `EXCEPT` в одном запросе. Тогда операторы `UNION` и `EXCEPT` имеют равный приоритет, который ниже, чем у `INTERSECT`.

Например, запросы

```yql
query1 UNION query2 INTERSECT query3

query1 UNION query2 EXCEPT query3

query1 EXCEPT query2 UNION query3
```

интерпретируется как

```yql
query1 UNION (query2 INTERSECT query3)

(query1 UNION query2) EXCEPT query3

(query1 EXCEPT query2) UNION query3
```

соответственно.

При наличии `ORDER BY/LIMIT/DISCARD/INTO RESULT` в объединяемых подзапросах применяются следующие правила:

* `ORDER BY/LIMIT/INTO RESULT` допускается только после последнего подзапроса;
* `DISCARD` допускается только перед первым подзапросом;
* указанные операторы действуют на результат `UNION [ALL]`, `INTERSECT [ALL]` или `EXCEPT [ALL]`, а не на подзапрос;
* чтобы применить оператор к подзапросу, подзапрос необходимо взять в скобки.


## Обращение к нескольким таблицам в одном запросе

В стандартном SQL для выполнения запроса по нескольким таблицам используется [UNION ALL](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#union-all), который объединяет результаты двух и более `SELECT`. Это не совсем удобно для сценария использования, в котором требуется выполнить один и тот же запрос по нескольким таблицам (например, содержащим данные на разные даты). В YQL, чтобы было удобнее, в `SELECT` после `FROM` можно указывать не только одну таблицу или подзапрос, но и вызывать встроенные функции, позволяющие объединять данные нескольких таблиц.

Для этих целей определены следующие функции:

```CONCAT(`table1`, `table2`, `table3` VIEW view_name, ...)``` — объединяет все перечисленные в аргументах таблицы.

`EACH($list_of_strings)` или `EACH($list_of_strings VIEW view_name)` — объединяет все таблицы, имена которых перечислены в списке строк. Опционально можно передать несколько списков в отдельных аргументах по аналогии с `CONCAT`.

{% note warning %}

Порядок, в котором будут объединены таблицы, всеми вышеперечисленными функциями не гарантируется.

Список таблиц вычисляется **до** запуска самого запроса. Поэтому созданные в процессе запроса таблицы не попадут в результаты функции.

{% endnote %}

По умолчанию схемы всех участвующих таблиц объединяются по правилам [UNION ALL](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md#union-all). Если объединение схем не желательно, то можно использовать функции с суффиксом `_STRICT`, например `CONCAT_STRICT`, которые работают полностью аналогично оригинальным, но считают любое расхождение в схемах таблиц ошибкой.

Все аргументы описанных выше функций могут быть объявлены отдельно через [именованные выражения](https://ytsaurus.tech/docs/ru/yql/syntax/expressions.md#named-nodes). В этом случае в них также допустимы и простые выражения посредством неявного вызова [EvaluateExpr](https://ytsaurus.tech/docs/ru/yql/builtins/basic.md#evaluate_expr_atom).

Имя исходной таблицы, из которой изначально была получена каждая строка, можно получить при помощи функции [TablePath()](https://ytsaurus.tech/docs/ru/yql/builtins/basic.md#tablepath).

#### Примеры

```yql
USE some_cluster;
SELECT * FROM CONCAT(
  `table1`,
  `table2`,
  `table3`);
```

```yql
USE some_cluster;
$indices = ListFromRange(1, 4);
$tables = ListMap($indices, ($index) -> {
    RETURN "table" || CAST($index AS String);
});
SELECT * FROM EACH($tables); -- идентично предыдущему примеру
```

## Поддерживаемые конструкции в SELECT

* [FROM](https://ytsaurus.tech/docs/ru/yql/syntax/select/from.md)
* [FROM AS_TABLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/from_as_table.md)
* [FROM SELECT](https://ytsaurus.tech/docs/ru/yql/syntax/select/from_select.md)
* [DISTINCT](https://ytsaurus.tech/docs/ru/yql/syntax/select/distinct.md)
* [UNIQUE DISTINCT](https://ytsaurus.tech/docs/ru/yql/syntax/select/unique_distinct_hints.md)
* [UNION INTERSECT EXCEPT](https://ytsaurus.tech/docs/ru/yql/syntax/select/operators.md)
* [WITH](https://ytsaurus.tech/docs/ru/yql/syntax/select/with.md)
* [WITHOUT](https://ytsaurus.tech/docs/ru/yql/syntax/select/without.md)
* [WHERE](https://ytsaurus.tech/docs/ru/yql/syntax/select/where.md)
* [ORDER BY](https://ytsaurus.tech/docs/ru/yql/syntax/select/order_by.md)
* [ASSUME ORDER BY](https://ytsaurus.tech/docs/ru/yql/syntax/select/assume_order_by.md)
* [LIMIT OFFSET](https://ytsaurus.tech/docs/ru/yql/syntax/select/limit_offset.md)
* [SAMPLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/sample.md)
* [TABLESAMPLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/sample.md)
* [FOLDER](https://ytsaurus.tech/docs/ru/yql/syntax/select/folder.md)
* [WalkFolders](https://ytsaurus.tech/docs/ru/yql/syntax/select/walk_folders.md)
* [VIEW](https://ytsaurus.tech/docs/ru/yql/syntax/select/view.md)
* [TEMPORARY TABLE](https://ytsaurus.tech/docs/ru/yql/syntax/select/temporary_table.md)
* [CONCAT](https://ytsaurus.tech/docs/ru/yql/syntax/select/concat.md)
