Разбор запросов
- Полный SQL-парсер (парсер рекурсивного спуска).
- Парсер формата данных (быстрый потоковый парсер).
INSERT, в котором используются оба парсера.
Давайте рассмотрим приведённый ниже запрос:
INSERT использует оба парсера.
Фрагмент INSERT INTO t VALUES разбирается полным парсером,
а данные (1, 'Hello, world'), (2, 'abc'), (3, 'def') — парсером формата данных, или быстрым потоковым парсером.
Включение полного парсера
Включение полного парсера
Вы также можете включить для данных полный парсер
с помощью настройки
input_format_values_interpret_expressions.Когда указанная выше настройка имеет значение 1,
ClickHouse сначала пытается разобрать значения быстрым потоковым парсером.
Если это не удаётся, ClickHouse пытается использовать для данных полный парсер, рассматривая их как SQL-выражение.INSERT, которые являются рекомендуемым способом вставки данных в ClickHouse.
При использовании формата Values в запросе INSERT
может показаться, что данные разбираются так же, как и выражения в запросе SELECT, однако это не так.
Формат Values значительно более ограничен.
Остальная часть этого раздела посвящена полному парсеру.
Дополнительные сведения о парсерах форматов см. в разделе Formats.
Пробелы
- Между синтаксическими конструкциями может находиться любое количество пробельных символов (в том числе в начале и в конце запроса).
- К пробельным символам относятся пробел, табуляция, перевод строки, CR и перевод страницы.
Комментарии
- Комментарии в стиле SQL начинаются с
--,#!или#и продолжаются до конца строки. Пробел после--и#!можно опускать. - Комментарии в стиле C:
//(или более двух символов/), после которых идёт текст до конца строки. Пробелы после/не обязательны.- Для многострочных комментариев могут начинаться с
/*и заканчиваться*/. Пробелы также не обязательны. - Комментарии в стиле C могут быть вложенными.
Ключевые слова
- стандарту SQL. Например,
SELECT,selectиSeLeCt— все это допустимые варианты. - реализации в некоторых популярных СУБД (MySQL или Postgres). Например,
DateTime— это то же самое, что иdatetime.
Проверить, чувствительно ли имя типа данных к регистру, можно в таблице system.data_type_families.
table_name есть столбец с именем "FROM":
Идентификаторы
- Имена кластеров, баз данных, таблиц, партиций и столбцов.
- Функции.
- Типы данных.
- Псевдонимы выражений.
^[a-zA-Z_][0-9a-zA-Z_]*$ и не могут совпадать с ключевыми словами.
В таблице ниже приведены примеры допустимых и недопустимых идентификаторов:
| Допустимые идентификаторы | Недопустимые идентификаторы |
|---|---|
xyz, _internal, Id_with_underscores_123_ | 1x, tom@gmail.com, äußerst_schön |
"id" или `id`.
Те же правила экранирования, что и для идентификаторов в кавычках, применяются и к строковым литералам. Подробнее см. в разделе String.
Литералы
- Строковыми
- Числовыми
- Составными
NULL- Heredocs (пользовательские строковые литералы)
String
- с помощью предшествующей одинарной кавычки: символ одинарной кавычки
'(и только он) можно экранировать как'', или - с помощью предшествующей обратной косой черты с использованием поддерживаемых escape-последовательностей, перечисленных в таблице ниже.
Обратная косая черта теряет своё специальное значение, то есть интерпретируется буквально, если за ней следуют символы, отличные от перечисленных ниже.
| Поддерживаемое экранирование | Описание |
|---|---|
\xHH | Обозначение 8-битного символа, за которым следует любое количество шестнадцатеричных цифр (H). |
\N | зарезервировано, ничего не делает (например, SELECT 'a\Nb' возвращает ab) |
\a | звуковой сигнал |
\b | возврат на один символ |
\e | escape-символ |
\f | перевод страницы |
\n | перевод строки |
\r | возврат каретки |
\t | горизонтальная табуляция |
\v | вертикальная табуляция |
\0 | нулевой символ |
\\ | обратная косая черта |
\' (or '') | одинарная кавычка |
\" | двойная кавычка |
` | обратная кавычка |
\/ | прямая косая черта |
\= | знак равенства |
| Управляющие символы ASCII (c <= 31). |
В строковых литералах необходимо экранировать как минимум
' и \, используя escape-коды \' (или '') и \\.Числовые литералы
- Если литерал начинается со знака минус
-, токен пропускается, а после разбора к результату применяется отрицание. - Сначала числовой литерал разбирается как 64-битное беззнаковое целое число с помощью функции strtoull.
- Если значение начинается с
0bили0x/0X, число разбирается как двоичное или шестнадцатеричное соответственно. - Если значение отрицательное и его абсолютная величина больше 263, возвращается ошибка.
- Если значение начинается с
- Если это не удалось, значение затем разбирается как число с плавающей точкой с помощью функции strtod.
- В противном случае возвращается ошибка.
1разбирается какUInt8256разбирается какUInt16.
ВажноЦелочисленные значения разрядностью более 64 бит (Это позволяет обойти описанный выше алгоритм и разобрать целое число с помощью процедуры, поддерживающей произвольную точность.В противном случае литерал будет разобран как число с плавающей точкой и, следовательно, может потерять точность из-за усечения.
UInt128, Int128, UInt256, Int256) необходимо приводить к более широкому типу, чтобы они разбирались корректно:_ внутри числовых литералов игнорируются и могут использоваться для лучшей читаемости.
Поддерживаются следующие числовые литералы:
| Числовой литерал | Примеры |
|---|---|
| Целые числа | 1, 10_000_000, 18446744073709551615, 01 |
| Десятичные числа | 0.1 |
| Экспоненциальная запись | 1e100, -1e-100 |
| Числа с плавающей точкой | 123.456, inf, nan |
| Шестнадцатеричные | 0xc0fe |
| Шестнадцатеричная строка, совместимая со стандартом SQL | x'c0fe' |
| Двоичные | 0b1101 |
| Двоичная строка, совместимая со стандартом SQL | b'1101' |
Восьмеричные литералы не поддерживаются во избежание случайных ошибок интерпретации.
Составные
[]: [1, 2, 3]. Кортежи создаются с помощью (): (1, 'Hello, world!', 2).
Технически это не литералы, а выражения с оператором создания массива и оператором создания кортежа соответственно.
Массив должен состоять как минимум из одного элемента, а кортеж — как минимум из двух.
Есть отдельный случай, когда кортежи встречаются в предложении
IN запроса SELECT.
Результаты запроса могут содержать кортежи, но сохранять кортежи в базу данных нельзя (кроме таблиц с движком Memory).NULL
NULL используется для обозначения отсутствующего значения.
Чтобы сохранить NULL в поле таблицы, оно должно иметь тип Nullable.
Для
NULL следует учитывать следующее:- В зависимости от формата данных (входного или выходного)
NULLможет иметь разное представление. Подробнее см. в разделе форматы данных. - Обработка
NULLимеет свои нюансы. Например, если хотя бы один из аргументов операции сравнения равенNULL, результат этой операции также будетNULL. То же самое относится к умножению, сложению и другим операциям. Рекомендуем ознакомиться с документацией по каждой операции. - В запросах проверять
NULLможно с помощью операторовIS NULLиIS NOT NULL, а также связанных с ними функцийisNullиisNotNull.
Heredoc
$.
Например:
- Значение между двумя блоками heredoc обрабатывается “как есть”.
Определение и использование параметров запроса
SET param_<name>=<value>— с помощью командыSETв запросе.--param_<name>='<value>'— как аргумент командной строки дляclickhouse-client.param_<name>=<value>— как параметр строки запроса URL для HTTP-интерфейса.
{<name>: <datatype>}, где <name> — имя параметра запроса, а <datatype> — тип данных, к которому он приводится.
Пример с командой SET
Пример с командой SET
Например, следующий SQL определяет параметры с именами
a, b, c и d — каждый со своим типом данных:Пример с clickhouse-client
Пример с clickhouse-client
Если вы используете Если параметр запроса представляет имя базы данных, таблицы, функции или другого идентификатора, используйте
clickhouse-client, параметры указываются в виде --param_name=value. Например, следующий параметр имеет имя message и извлекается как String:Identifier в качестве его типа. Например, следующий запрос возвращает строки из таблицы uk_price_paid:Пример с HTTP-интерфейсом
Пример с HTTP-интерфейсом
Параметры запроса можно передавать как параметры строки запроса URL с префиксом
param_. Например:Пример с веб-интерфейсом
Пример с веб-интерфейсом
Встроенный веб-интерфейс (
play.html) автоматически обнаруживает плейсхолдеры параметров {name:Type} в запросе и отображает для каждого параметра подписанное поле ввода. Значения параметров включаются в HTTP-запрос, а также сохраняются в URL страницы для добавления в закладки и общего доступа.Параметры запроса — это не универсальные текстовые подстановки, которые можно использовать в любых местах произвольных SQL-запросов.
Они в первую очередь предназначены для работы в операторах
SELECT вместо идентификаторов или литералов.Функции
().
В отличие от стандартного SQL, скобки обязательны даже при пустом списке аргументов.
Например:
Синтаксис агрегатных функций без параметров такой же, как у обычных функций.
Операторы
Типы данных и движки таблиц базы данных
CREATE записываются так же, как идентификаторы и функции.
Иными словами, они могут как содержать список аргументов в скобках, так и не содержать его.
Дополнительные сведения см. в разделах:
Выражения
- функция
- идентификатор
- литерал
- применение оператора
- выражение в скобках
- подзапрос
- звёздочка
Псевдонимы выражений
| Часть синтаксиса | Описание | Пример | Примечания |
|---|---|---|---|
AS | Ключевое слово для задания псевдонимов. Псевдоним для имени таблицы или имени столбца в предложении SELECT можно задать и без ключевого слова AS. | SELECT table_name_alias.column_name FROM table_name table_name_alias. | В функции CAST ключевое слово AS имеет другое значение. См. описание функции. |
expr | Любое выражение, поддерживаемое ClickHouse. | SELECT column_name * 2 AS double FROM some_table | |
alias | Имя для expr. Псевдонимы должны соответствовать синтаксису идентификаторов. | SELECT "table t".column_name FROM table_name AS "table t". |
Примечания по использованию
- Псевдонимы действуют глобально в пределах запроса или подзапроса, и вы можете определить псевдоним для любого выражения в любой части запроса. Например:
- Псевдонимы недоступны в подзапросах и между ними. Например, при выполнении следующего запроса ClickHouse возвращает исключение
Unknown identifier: num:
- Если для результирующих столбцов в предложении
SELECTподзапроса задан псевдоним, эти столбцы видны во внешнем запросе. Например:
- Будьте осторожны с псевдонимами, совпадающими с именами столбцов или таблиц. Рассмотрим следующий пример:
t со столбцом b.
Затем при выборке данных мы задали псевдоним sum(b) AS b.
Поскольку псевдонимы являются глобальными,
ClickHouse подставил в выражение argMax(a, b) выражение sum(b) вместо литерала b.
Эта подстановка привела к Исключению.
Это поведение по умолчанию можно изменить, установив prefer_column_name_to_alias в
1.Звёздочка
SELECT звёздочка может заменять выражение.
Подробнее см. в разделе SELECT.