> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по предложению FROM

# Предложение FROM

Предложение `FROM` указывает источник для чтения данных:

* [Таблица](/ru/reference/engines/table-engines)
* [Подзапрос](/ru/reference/statements/select)
* [Табличная функция](/ru/reference/functions/table-functions)

Чтобы расширить возможности предложения `FROM`, также можно использовать секции [JOIN](/ru/reference/statements/select/join) и [ARRAY JOIN](/ru/reference/statements/select/array-join).

Подзапрос — это другой запрос `SELECT`, который можно указать в скобках внутри предложения `FROM`.

Стандартную секцию SQL `VALUES` также можно использовать как табличное выражение:

```sql theme={null}
SELECT * FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) AS t(id, val);
```

Подробности см. в [табличной функции Values](/ru/reference/functions/table-functions/values#sql-standard-values-clause).

`FROM` может содержать несколько источников данных, разделённых запятыми, что эквивалентно выполнению [CROSS JOIN](/ru/reference/statements/select/join) между ними.

`FROM` также может указываться перед предложением `SELECT`. Это расширение стандартного SQL, специфичное для ClickHouse, делает операторы `SELECT` более удобными для чтения. Пример:

```sql theme={null}
FROM table
SELECT *
```

<div id="final-modifier">
  ## Модификатор FINAL
</div>

Когда указан `FINAL`, ClickHouse полностью сливает данные перед возвратом результата. При этом также выполняются все преобразования данных, происходящие во время слияний для данного движка таблицы.

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

* `ReplacingMergeTree`
* `SummingMergeTree`
* `AggregatingMergeTree`
* `CollapsingMergeTree`
* `VersionedCollapsingMergeTree`

Запросы `SELECT` с `FINAL` выполняются параллельно. Настройка [max\_final\_threads](/ru/reference/settings/session-settings#max_final_threads) ограничивает количество используемых потоков.

<div id="drawbacks">
  ### Недостатки
</div>

Запросы, использующие `FINAL`, выполняются немного медленнее, чем аналогичные запросы без `FINAL`, потому что:

* данные объединяются во время выполнения запроса;
* запросы с `FINAL` могут считывать столбцы первичного ключа помимо столбцов, указанных в запросе.

`FINAL` требует дополнительных вычислительных ресурсов и памяти, поскольку обработка, которая обычно выполняется во время слияния, в этом случае должна выполняться в памяти во время запроса. Однако `FINAL` иногда необходим для получения точных результатов (так как данные могут быть еще не полностью слиты). Это обходится дешевле, чем запуск `OPTIMIZE` для принудительного слияния.

В качестве альтернативы `FINAL` иногда можно использовать другие запросы, которые исходят из того, что фоновые процессы движка `MergeTree` еще не завершились, и учитывают это с помощью агрегации (например, чтобы отбрасывать дубликаты). Если для получения нужных результатов вам необходимо использовать `FINAL` в запросах, это нормально, но следует учитывать дополнительную обработку, которая при этом требуется.

`FINAL` можно применять автоматически ко всем таблицам в запросе с помощью настройки [FINAL](/ru/reference/settings/session-settings#final), используя сеанс или профиль пользователя.

<div id="example-usage">
  ### Пример использования
</div>

Использование модификатора `FINAL`

```sql theme={null}
SELECT x, y FROM mytable FINAL WHERE x > 1;
```

Использование `FINAL` как настройки на уровне запроса

```sql theme={null}
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
```

Использование `FINAL` как настройки на уровне сеанса

```sql theme={null}
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;
```

<div id="implementation-details">
  ## Подробности реализации
</div>

Если предложение `FROM` опущено, данные будут считываться из таблицы `system.one`.
Таблица `system.one` содержит ровно одну строку (эта таблица служит той же цели, что и таблица DUAL в других СУБД).

Для выполнения запроса из соответствующей таблицы извлекаются все столбцы, перечисленные в запросе. Все столбцы, не нужные для внешнего запроса, отбрасываются из подзапросов.
Если в запросе не перечислен ни один столбец (например, `SELECT count() FROM t`), из таблицы всё равно извлекается какой-либо столбец (предпочтительно наименьший), чтобы вычислить количество строк.
