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