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

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

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

Пример