Запрос SELECT
SELECT
запросы выполняют извлечение данных. По умолчанию запрашиваемые данные возвращаются клиенту, а в сочетании с INSERT INTO они могут быть перенаправлены в другую таблицу.
Синтаксис
Все конструкции являются необязательными, за исключением обязательного списка выражений сразу после SELECT
, который описан более подробно ниже.
Особенности каждой необязательной конструкции охвачены в отдельных разделах, которые перечислены в том же порядке, в каком они выполняются:
- WITH clause
- SELECT clause
- DISTINCT clause
- FROM clause
- SAMPLE clause
- JOIN clause
- PREWHERE clause
- WHERE clause
- WINDOW clause
- GROUP BY clause
- LIMIT BY clause
- HAVING clause
- QUALIFY clause
- LIMIT clause
- OFFSET clause
- UNION clause
- INTERSECT clause
- EXCEPT clause
- INTO OUTFILE clause
- FORMAT clause
Конструкция 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
. Значение настройки применяется только к этому запросу и сбрасывается к значению по умолчанию или предыдущему значению после выполнения запроса.
Другие способы установки настроек см. здесь.
Пример