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