Перейти к основному содержанию
Предложение FROM указывает источник для чтения данных: Чтобы расширить возможности предложения FROM, также можно использовать секции JOIN и ARRAY JOIN. Подзапрос — это другой запрос SELECT, который можно указать в скобках внутри предложения FROM. Стандартную секцию SQL VALUES также можно использовать как табличное выражение:
SELECT * FROM (VALUES (1, 'a'), (2, 'b'), (3, 'c')) AS t(id, val);
Подробности см. в табличной функции Values. FROM может содержать несколько источников данных, разделённых запятыми, что эквивалентно выполнению CROSS JOIN между ними. FROM также может указываться перед предложением SELECT. Это расширение стандартного SQL, специфичное для ClickHouse, делает операторы SELECT более удобными для чтения. Пример:
FROM table
SELECT *

Модификатор FINAL

Когда указан FINAL, ClickHouse полностью сливает данные перед возвратом результата. При этом также выполняются все преобразования данных, происходящие во время слияний для данного движка таблицы. Применяется при выборе данных из таблиц, использующих следующие движки таблиц:
  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree
Запросы SELECT с FINAL выполняются параллельно. Настройка max_final_threads ограничивает количество используемых потоков.

Недостатки

Запросы, использующие FINAL, выполняются немного медленнее, чем аналогичные запросы без FINAL, потому что:
  • данные объединяются во время выполнения запроса;
  • запросы с FINAL могут считывать столбцы первичного ключа помимо столбцов, указанных в запросе.
FINAL требует дополнительных вычислительных ресурсов и памяти, поскольку обработка, которая обычно выполняется во время слияния, в этом случае должна выполняться в памяти во время запроса. Однако FINAL иногда необходим для получения точных результатов (так как данные могут быть еще не полностью слиты). Это обходится дешевле, чем запуск OPTIMIZE для принудительного слияния. В качестве альтернативы FINAL иногда можно использовать другие запросы, которые исходят из того, что фоновые процессы движка MergeTree еще не завершились, и учитывают это с помощью агрегации (например, чтобы отбрасывать дубликаты). Если для получения нужных результатов вам необходимо использовать FINAL в запросах, это нормально, но следует учитывать дополнительную обработку, которая при этом требуется. FINAL можно применять автоматически ко всем таблицам в запросе с помощью настройки FINAL, используя сеанс или профиль пользователя.

Пример использования

Использование модификатора FINAL
SELECT x, y FROM mytable FINAL WHERE x > 1;
Использование FINAL как настройки на уровне запроса
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
Использование FINAL как настройки на уровне сеанса
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;

Подробности реализации

Если предложение FROM опущено, данные будут считываться из таблицы system.one. Таблица system.one содержит ровно одну строку (эта таблица служит той же цели, что и таблица DUAL в других СУБД). Для выполнения запроса из соответствующей таблицы извлекаются все столбцы, перечисленные в запросе. Все столбцы, не нужные для внешнего запроса, отбрасываются из подзапросов. Если в запросе не перечислен ни один столбец (например, SELECT count() FROM t), из таблицы всё равно извлекается какой-либо столбец (предпочтительно наименьший), чтобы вычислить количество строк.
Последнее изменение 10 июня 2026 г.