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

Запрос 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. Значение настройки применяется только к этому запросу и сбрасывается к значению по умолчанию или предыдущему значению после выполнения запроса.

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

Пример