Перейти к содержимому

Синтаксис SQL

SQL описывает операции над объектами и значениями базы данных. Оператор состоит из токенов: ключевых слов, имён, литералов, знаков операций и пунктуации. Пробельные символы разделяют токены и могут включать переводы строк. Примеры ниже выполняются в базе в памяти локального CLI; таблицы из учебника для них не требуются.

Завершайте обычные операторы точкой с запятой. Ключевые слова SQL не зависят от регистра; в руководстве они записаны заглавными буквами, чтобы отличать их от прикладных имён. Следующие запросы возвращают одинаковое значение:

SELECT 1 AS value;
select 1 as value;

Запятая разделяет выражения в списке SELECT. Скобки группируют выражения и ограничивают списки аргументов. Точка уточняет имя столбца именем таблицы или псевдонимом, например employees.id. Указывайте псевдонимы явно, когда в запросе несколько таблиц с одинаковыми именами столбцов.

Не разбивайте произвольный SQL в приложении по каждой точке с запятой. Этот символ может находиться внутри строки или процедурного тела. Границу определяет грамматика оператора, а не только отдельный символ.

Идентификатор без кавычек начинается с буквы или подчёркивания. Последующие символы могут включать буквы, цифры, подчёркивания и знаки доллара. Для обычных прикладных объектов последовательно используйте простые имена: employees, department_id, created_at.

Двойные кавычки ограничивают идентификатор с пробелами или другими символами, требующими кавычек. Удвоенная двойная кавычка означает кавычку внутри имени. Обратные кавычки тоже допустимы как разделители идентификаторов; руководство использует двойные. Не переносите правила регистра PostgreSQL на кавыченные имена RadixDB и не предполагайте, что кавычки сами по себе позволяют создавать два объекта, различающихся только регистром букв.

SELECT 7 AS "item count", 8 AS "a""b";

Результат содержит столбцы item count и a"b. Одинарные кавычки предназначены для текстовых значений, а не имён столбцов или таблиц. Разделяйте эти случаи, даже если контекст выражения допускает поведение для совместимости.

Строковый литерал заключается в одинарные кавычки. Удвойте одинарную кавычку, чтобы включить её в значение. Ключевые слова TRUE, FALSE и NULL не являются строками.

SELECT 'O''Brien' AS name, '' AS empty_text, TRUE AS enabled, NULL AS missing;

Пустая строка является значением, а не NULL. NULL обозначает отсутствующее или неизвестное значение. Проверяйте его с помощью IS NULL или IS NOT NULL, а не равенством NULL.

Число может содержать дробную часть или экспоненту. Начальный знак является унарной операцией. В примерах указывайте цифру до и после десятичной точки. Экспонента обязательно содержит цифры: 1e не является допустимым числом.

SELECT 42 AS whole, -7 AS negative, 1.25 AS fraction, 2e3 AS exponent;

Запись литерала сама по себе не определяет точную десятичную арифметику. Важны также преобразование типа и столбец назначения. Когда точное представление существенно, передавайте типизированные значения через API клиента.

-- начинает комментарий до перевода строки. Пробел после двух дефисов не требуется. RadixDB также принимает строчные комментарии с #. Блочный комментарий начинается с /* и заканчивается */; вложенные блочные комментарии допустимы.

-- A line comment
SELECT /* outer /* inner */ outer */ 3 AS value;

Для двух отдельных операций минус пишите - -5. Последовательность --5 начинает комментарий, а не двойное отрицание. Незавершённая строка, имя в кавычках или блочный комментарий являются ошибкой. Байт NUL в SQL не допускается.

Передавайте прикладные значения параметрами, а не склеивайте SQL с пользовательским вводом. RadixDB разбирает позиционные заполнители ? и $1, $2, а также именованные заполнители вроде :employee_id. Нумерация начинается с $1; $0 недопустим. Не смешивайте позиционные формы ? и $n в одном разбираемом запросе.

Токен параметра не становится значением автоматически. Выбранный метод клиента должен передать набор параметров в поддерживаемом формате. Параметр заменяет значение, а не произвольное имя таблицы, ключевое слово или фрагмент SQL. Например, имя в FROM employees нельзя передать параметром значения. Динамические имена объектов выбирайте из контролируемого приложением списка.

Обзор клиентских интерфейсов объясняет различие встраиваемого и TCP-доступа. Подробные контракты интерфейсов определяют привязку параметров и обработку ошибок; распознавание заполнителя парсером не означает, что все клиенты предоставляют одинаковые методы привязки.