Перейти к основному содержимому
Перейти к основному содержимому

Запрос SELECT

SELECT запросы выполняют извлечение данных. По умолчанию запрашиваемые данные возвращаются клиенту, в то время как в сочетании с INSERT INTO они могут быть перенаправлены в другую таблицу.

Синтаксис

Все клаузулы являются необязательными, за исключением обязательного списка выражений, который находится сразу после SELECT и который рассматривается более подробно ниже.

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

Клаузула SELECT

Выражения, указанные в клаузуле SELECT, вычисляются после завершения всех операций в описанных выше клаузах. Эти выражения работают так, как если бы они применялись к отдельным строкам в результате. Если выражения в клаузуле SELECT содержат агрегатные функции, то ClickHouse обрабатывает агрегатные функции и выражения, используемые в качестве их аргументов, во время агрегации GROUP BY.

Если вы хотите включить все колонки в результат, используйте символ звёздочки (*). Например, SELECT * FROM ....

Динамический выбор колонок

Динамический выбор колонок (также известный как выражение COLUMNS) позволяет вам сопоставить некоторые колонки в результате с регулярным выражением re2.

Например, рассмотрим таблицу:

Следующий запрос выбирает данные из всех колонок, содержащих символ a в своем имени.

Выбранные колонки возвращаются не в алфавитном порядке.

Вы можете использовать несколько выражений COLUMNS в запросе и применять функции к ним.

Например:

Каждая колонка, возвращаемая выражением COLUMNS, передается функции как отдельный аргумент. Также вы можете передавать другие аргументы функции, если она их поддерживает. Будьте осторожны при использовании функций. Если функция не поддерживает количество аргументов, которые вы ей передали, ClickHouse выбросит исключение.

Например:

В этом примере COLUMNS('a') возвращает две колонки: aa и ab. COLUMNS('c') возвращает колонку bc. Оператор + не может применяться к 3 аргументам, поэтому ClickHouse выбрасывает исключение с соответствующим сообщением.

Колонки, которые соответствуют выражению COLUMNS, могут иметь разные типы данных. Если COLUMNS не соответствует ни одной колонке и является единственным выражением в SELECT, ClickHouse выбрасывает исключение.

Звёздочка

Вы можете помещать звёздочку в любую часть запроса вместо выражения. Когда запрос анализируется, звёздочка расширяется в список всех колонок таблицы (исключая колонки MATERIALIZED и ALIAS). Существуют лишь несколько случаев, когда использование звёздочки оправдано:

  • При создании дампа таблицы.
  • Для таблиц, содержащих всего несколько колонок, таких как системные таблицы.
  • Для получения информации о том, какие колонки содержатся в таблице. В этом случае установите LIMIT 1. Но лучше использовать запрос DESC TABLE.
  • Когда есть сильная фильтрация по небольшому количеству колонок с использованием PREWHERE.
  • В подзапросах (так как колонки, которые не нужны для внешнего запроса, исключаются из подзапросов).

Во всех остальных случаях мы не рекомендуем использовать звёздочку, так как она приносит только недостатки столбцовой СУБД вместо преимуществ. Другими словами, использование звёздочки не рекомендуется.

Экстремальные значения

В дополнение к результатам вы также можете получить минимальные и максимальные значения для колонок результатов. Для этого установите настройку extremes в 1. Минимумы и максимумы рассчитываются для числовых типов, дат и дат с временем. Для других колонок выводятся значения по умолчанию.

Дополнительно рассчитываются две строки – минимумы и максимумы соответственно. Эти дополнительные две строки выводятся в XML, JSON*, TabSeparated*, CSV*, Vertical, Template и Pretty* форматах, отделенные от других строк. Они не выводятся для других форматов.

В форматах JSON* и XML экстремальные значения выводятся в отдельном поле 'extremes'. В форматах TabSeparated*, CSV* и Vertical строка идет после основного результата, и после 'totals', если они присутствуют. Она предшествуется пустой строкой (после остальных данных). В Pretty* форматах строка выводится как отдельная таблица после основного результата и после totals, если они присутствуют. В формате Template экстремальные значения выводятся согласно указанному шаблону.

Экстремальные значения рассчитываются для строк перед LIMIT, но после LIMIT BY. Тем не менее, при использовании LIMIT offset, size строки перед offset включаются в extremes. В стрим-запросах результат также может включать небольшое количество строк, которые прошли через LIMIT.

Заметки

Вы можете использовать синонимы (AS псевдонимы) в любой части запроса.

Клаузы GROUP BY, ORDER BY и LIMIT BY могут поддерживать позиционные аргументы. Чтобы включить эту возможность, включите настройку enable_positional_arguments. Тогда, например, ORDER BY 1,2 будет сортировать строки в таблице по первой, а затем по второй колонне.

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

Если запрос не включает клаузы DISTINCT, GROUP BY и ORDER BY, а также подзапросы IN и JOIN, запрос будет полностью обрабатываться в потоке, используя O(1) объем ОП. В противном случае запрос может потреблять много ОП, если не указаны соответствующие ограничения:

  • max_memory_usage
  • max_rows_to_group_by
  • max_rows_to_sort
  • max_rows_in_distinct
  • max_bytes_in_distinct
  • max_rows_in_set
  • max_bytes_in_set
  • max_rows_in_join
  • max_bytes_in_join
  • max_bytes_before_external_sort
  • max_bytes_ratio_before_external_sort
  • max_bytes_before_external_group_by
  • max_bytes_ratio_before_external_group_by

Для получения дополнительной информации см. раздел "Настройки". Возможна также внешняя сортировка (сохранение временных таблиц на диск) и внешняя агрегация.

Модификаторы SELECT

Вы можете использовать следующие модификаторы в запросах SELECT.

APPLY

Позволяет вам вызвать какую-либо функцию для каждой строки, возвращаемой внешним табличным выражением запроса.

Синтаксис:

Пример:

EXCEPT

Указывает имена одной или нескольких колонок, которые следует исключить из результата. Все совпадающие имена колонок будут пропущены в выводе.

Синтаксис:

Пример:

REPLACE

Указывает одну или несколько псевдонимов выражений. Каждый псевдоним должен совпадать с именем колонки из оператора SELECT *. В списке выходных колонок колонка, которая совпадает с псевдонимом, заменяется выражением в этом REPLACE.

Этот модификатор не изменяет имена или порядок колонок. Однако он может изменить значение и тип значения.

Синтаксис:

Пример:

Комбинации модификаторов

Вы можете использовать каждый модификатор отдельно или комбинировать их.

Примеры:

Использование одного и того же модификатора несколько раз.

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

НАСТРОЙКИ в запросе SELECT

Вы можете указать необходимые настройки прямо в запросе SELECT. Значение настройки применяется только к этому запросу и сбрасывается к значению по умолчанию или предыдущему значению после выполнения запроса.

Другие способы установки настроек смотрите здесь.

Пример