SELECT используются для выборки данных. По умолчанию запрошенные данные возвращаются клиенту, а в сочетании с INSERT INTO их можно направить в другую таблицу.
Синтаксис
SELECT обязателен; все остальные секции необязательны.
SELECT и его необязательные секции описаны в отдельных разделах:
- конструкция WITH
- секция SELECT
- секция ALL
- секция DISTINCT
- секция FROM
- предложение SAMPLE
- секция ARRAY JOIN
- секция JOIN
- секция PREWHERE
- предложение WHERE
- секция GROUP BY
- секция HAVING
- секция WINDOW
- предложение QUALIFY
- предложение ORDER BY
- предложение LIMIT BY
- секция LIMIT
- секция OFFSET
- секция UNION
- секция INTERSECT
- оператор EXCEPT
- Предложение INTO OUTFILE
- предложение FORMAT
Секция 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 генерирует исключение.
Выбор столбцов с LIKE или ILIKE
Вы также можете выбирать столбцы, сопоставляя их имена с шаблоном после *, используя чувствительный к регистру LIKE или регистронезависимый ILIKE:
LIKE и ILIKE используют семантику LIKE, а не семантику регулярных выражений. Символ % соответствует любой последовательности символов, символ _ — любому одиночному символу, а \ экранирует %, _ и \. Единственное различие между ними в том, что LIKE сопоставляет имена столбцов с учетом регистра, а ILIKE — без учета регистра. Например:
a, например aa и ab.
* LIKE и * ILIKE также поддерживают квалифицированные звёздочки и преобразователи столбцов:
Звёздочка
Звёздочку можно поставить вместо выражения в любой части запроса. При разборе запроса она разворачивается в список всех столбцов таблицы (за исключением столбцов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 ... AFTER ... UNTIL ведёт себя здесь как LIMIT: экстремальные значения вычисляются по строкам, прочитанным до применения диапазона. В потоковых запросах результат также может включать небольшое количество строк, прошедших через 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_usagemax_rows_to_group_bymax_rows_to_sortmax_rows_in_distinctmax_bytes_in_distinctmax_rows_in_setmax_bytes_in_setmax_rows_in_joinmax_bytes_in_joinmax_bytes_before_external_sortmax_bytes_ratio_before_external_sortmax_bytes_before_external_group_bymax_bytes_ratio_before_external_group_by
Модификаторы SELECT
В запросахSELECT можно использовать следующие модификаторы.
Комбинации модификаторов
Каждый модификатор можно использовать отдельно или комбинировать с другими. Примеры: Использование одного и того же модификатора несколько раз.SETTINGS в SELECT-запросе
Вы можете указать нужные настройки прямо в запросеSELECT. Значение настройки применяется только к этому запросу и после его выполнения сбрасывается до значения по умолчанию или предыдущего значения.
О других способах задать настройки см. здесь.
Для логических настроек со значением true можно использовать сокращённый синтаксис, опустив присваивание значения. Если указано только имя настройки, ей автоматически присваивается значение 1 (true).
Пример