×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.1.1. Лексическая структура

2.1.1.1. Идентификаторы и ключевые слова
2.1.1.2. Константы
2.1.1.3. Операторы
2.1.1.4. Специальные символы
2.1.1.5. Комментарии
2.1.1.6. Приоритет операторов

Входные данные SQL состоят из последовательности команд. Команда состоит из последовательности лексем, завершающейся точкой с запятой («;»). Конец входного потока также завершает команду. Допустимость тех или иных лексем зависит от синтаксиса конкретной команды.

Лексема может представлять собой ключевое слово, идентификатор, идентификатор в кавычках, литерал (или константа) либо специальный символ. Лексемы обычно разделяются пробельными символами (пробел, табуляция, перевод строки), однако это не является обязательным при отсутствии двусмысленности (что, как правило, возможно только в случае соседства специального символа с лексемой другого типа).

Например, следующий фрагмент является (синтаксически) корректным SQL-кодом:

SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');

Это последовательность из трех команд, по одной на строку (хотя это не обязательно: в одной строке может располагаться несколько команд, а одну команду можно переносить на другие строки).

Кроме того, комментарии могут встречаться во входных данных SQL. Они не являются лексемами и фактически эквивалентны пробельным символам.

Синтаксис SQL не всегда последователен в том, какие лексемы идентифицируют команды, а какие являются операндами или параметрами. Первые несколько лексем, как правило, представляют собой имя команды; так, в приведенном выше примере речь обычно идет о «SELECT», «UPDATE», а также об «INSERT» команде. Однако, например, команда UPDATE всегда требует, чтобы лексема SET занимала определенную позицию, и данная конкретная вариация INSERT также требует наличия VALUES для завершения конструкции. Точные правила синтаксиса для каждой команды описаны в разделе Часть 6.

2.1.1.1. Идентификаторы и ключевые слова #

Такие лексемы, как SELECT, UPDATE, или VALUES в приведенном выше примере представляют собой ключевые слова, то есть слова, имеющие фиксированное значение в языке SQL. Лексемы MY_TABLE и A являются примерами идентификаторов. . Они идентифицируют имена таблиц, столбцов или других объектов базы данных в зависимости от команды, в которой они используются. Поэтому иногда их называют просто «именами». . Ключевые слова и идентификаторы имеют одинаковую лексическую структуру; это означает, что невозможно определить, является ли лексема идентификатором или ключевым словом, не зная языка. Полный список ключевых слов можно найти в Приложение 8.3.

Идентификаторы и ключевые слова SQL должны начинаться с буквы (a-z, а также буквы с диакритическими знаками и нелатинские буквы) или знак подчеркивания (_). Последующими символами в идентификаторе или ключевом слове могут быть буквы, знаки подчеркивания или цифры (0-9), или знаки доллара ($). Обратите внимание, что знаки доллара не допускаются в идентификаторах согласно букве стандарта SQL, поэтому их использование может снизить переносимость приложений. В стандарте SQL не будут определяться ключевые слова, содержащие цифры либо начинающиеся или заканчивающиеся символом подчёркивания, поэтому идентификаторы такого формата защищены от возможных конфликтов с будущими расширениями стандарта.

Система использует не более NAMEDATALEN-1 байт идентификатора; в командах могут быть указаны более длинные имена, но они будут усечены. По умолчанию, NAMEDATALEN значение составляет 64, поэтому максимальная длина идентификатора равна 63 байтам. Если данное ограничение вызывает затруднения, его можно увеличить путем изменения NAMEDATALEN константы в src/include/pg_config_manual.h.

Ключевые слова и не заключаемые в кавычки идентификаторы нечувствительны к регистру. Таким образом:

UPDATE MY_TABLE SET A = 5;

эквивалентно следующей записи:

uPDaTE my_TabLE SeT a = 5;

Согласно общепринятому соглашению, ключевые слова пишутся в верхнем регистре, а имена — в нижнем, например:

UPDATE my_table SET a = 5;

Существует второй вид идентификаторов: разграниченный идентификатор или идентификатор в кавычках. Он формируется путем заключения произвольной последовательности символов в двойные кавычки ("). Разграниченный идентификатор всегда интерпретируется как идентификатор, а не как ключевое слово. Таким образом, "select" может использоваться для обращения к столбцу или таблице с именем «select», тогда как слово без кавычек select будет воспринято как ключевое слово, что приведет к ошибке синтаксического анализа при его использовании в контексте имени таблицы или столбца. Этот пример можно записать с использованием идентификаторов в кавычках следующим образом:

UPDATE "my_table" SET "a" = 5;

Идентификаторы в кавычках могут содержать любые символы, за исключением символа с нулевым кодом. (Чтобы включить двойную кавычку, следует указать две двойные кавычки подряд.) Это позволяет формировать имена таблиц или столбцов, которые в противном случае были бы недопустимы, например, содержащие пробелы или амперсанды. Ограничение по длине по-прежнему сохраняется.

Использование кавычек в идентификаторе также делает его чувствительным к регистру, тогда как имена без кавычек всегда приводятся к нижнему регистру. Например, идентификаторы FOO, foo, и "foo" считаются эквивалентными в Digital Q.DataBase, но "Foo" и "FOO" отличаются от вышеуказанных трех и друг от друга. (Приведение имен без кавычек к нижнему регистру в Digital Q.DataBase несовместимо со стандартом SQL, согласно которому имена без кавычек должны приводиться к верхнему регистру. Таким образом, foo должно быть эквивалентно "FOO" а не "foo" согласно стандарту. Если вы хотите разрабатывать переносимые приложения, рекомендуется либо всегда заключать определенное имя в кавычки, либо не использовать кавычки вовсе.)

Вариант идентификаторов в кавычках позволяет включать экранированные символы Unicode, определяемые их кодовыми точками. Данный вариант начинается с U& (заглавная или строчная буква U, за которой следует амперсанд) непосредственно перед открывающей двойной кавычкой, без пробелов между ними, например U&"foo". (Обратите внимание, что это создает двусмысленность при взаимодействии с оператором &. Используйте пробелы вокруг оператора, чтобы избежать этой проблемы.) Внутри кавычек символы Unicode могут быть указаны в экранированной форме: с помощью обратной косой черты, за которой следует четырехзначный шестнадцатеричный код, либо с помощью обратной косой черты со знаком «плюс» и последующим шестизначным шестнадцатеричным кодом. Например, идентификатор "data" можно записать как

U&`"d\0061t\+000061"

В следующем менее тривиальном примере записывается русское слово «slon» (слон) кириллицей:

U&`"\0441\043B\043E\043D"

Если требуется использовать иной экранирующий символ вместо обратной косой черты, его можно указать при помощи предложения UESCAPE после строки, например:

U&`"d!0061t!+000061" UESCAPE '!'

Экранирующим символом может быть любой одиночный символ, отличный от шестнадцатеричной цифры, знака «плюс», одинарной кавычки, двойной кавычки или пробельного символа. Обратите внимание, что экранирующий символ указывается в одинарных кавычках, а не в двойных, после UESCAPE.

Чтобы включить экранирующий символ в идентификатор буквально, его необходимо записать дважды.

Для задания суррогатных пар UTF-16 с целью формирования символов с кодами выше U+FFFF можно использовать как 4-значную, так и 6-значную форму записи, хотя наличие 6-значной формы технически делает это излишним. (Суррогатные пары не хранятся напрямую, а объединяются в единую кодовую точку.)

Если кодировка сервера отлична от UTF-8, кодовый пункт Unicode, заданный одной из этих escape-последовательностей, преобразуется в текущую кодировку сервера; в противном случае возвращается ошибка.

2.1.1.2. Константы #

Существует три вида неявно типизированных констант в Digital Q.DataBase: строки, битовые строки и числа. Константы также могут быть заданы с явным указанием типов, что позволяет обеспечить более точное представление и более эффективную обработку системой. Эти альтернативы рассматриваются в следующих подразделах.

2.1.1.2.1. Строковые константы #

Строковая константа в SQL представляет собой произвольную последовательность символов, ограниченную одинарными кавычками ('), например 'This is a string'. Чтобы включить символ одинарной кавычки в строковую константу, используйте две идущие подряд одинарные кавычки, например, 'Dianne''s horse'. Обратите внимание, что это не то же самое, что и символ двойной кавычки (").

Две строковые константы, разделенные только пробельными символами при наличии как минимум одного символа новой строки конкатенируются и фактически обрабатываются так, будто строка была записана в виде единой константы. Например:

SELECT 'foo'
'bar';

эквивалентно:

SELECT 'foobar';

но:

SELECT 'foo'      'bar';

не является синтаксически верным. (Это несколько специфичное поведение определено стандартом SQL; SQL; Digital Q.DataBase следует данному стандарту.)

2.1.1.2.2. Строковые константы с ESC-последовательностями в стиле C #

Digital Q.DataBase также поддерживает «экранированные» строковые константы, являющиеся расширением стандарта SQL. Экранированная строковая константа задается путем указания буквы E (в верхнем или нижнем регистре) непосредственно перед открывающей одинарной кавычкой, например: E'foo'. (При переносе экранированной строковой константы на следующую строку пишите E только перед первой открывающей кавычкой.) Внутри экранированной строки символ обратной косой черты (\) начинает C-подобную escape-последовательность в которой сочетание обратной косой черты и последующих символов представляет собой специальное байтовое значение, как показано в таблице Таблица 2.1.1.

Таблица 2.1.1. Escape-последовательности

Escape-последовательностьИнтерпретация
\bbackspace
\fform feed
\nперевод строки
\rвозврат каретки
\tтабуляция
\o, \oo, \ooo (o = 0–7) восьмеричное значение байта
\xh, \xhh (h = 0–9, A–F) шестнадцатеричное значение байта
\uxxxx, \Uxxxxxxxx (x = 0–9, A–F) 16- или 32-битное шестнадцатеричное значение символа Unicode

Любой другой символ, следующий за обратной косой чертой, воспринимается буквально. Таким образом, чтобы включить символ обратной косой черты, следует указать две обратные косые черты (\\). Кроме того, одиночную кавычку можно включить в экранированную строку, написав \', в дополнение к обычному способу ''.

Пользователь несет ответственность за то, чтобы создаваемые последовательности байтов, особенно при использовании восьмеричного или шестнадцатеричного экранирования, формировали корректные символы в кодировке сервера. Полезной альтернативой является использование Unicode-экранирования или альтернативного синтаксиса Unicode-экранирования, описанного в Раздел 2.1.1.2.3; тогда сервер выполнит проверку возможности преобразования символов.

Внимание

Если параметр конфигурации standard_conforming_strings имеет значение off, тогда Digital Q.DataBase распознает управляющие последовательности с обратной косой чертой как в обычных, так и в экранированных строковых константах. Однако, начиная с версии Digital Q.DataBase 9.1, значением по умолчанию является on, что означает, что экранирование обратной косой чертой распознается только в экранированных строковых константах. Данное поведение в большей степени соответствует стандарту, но может нарушить работу приложений, использующих прежний механизм, при котором такие последовательности распознавались всегда. В качестве временного решения вы можете установить данный параметр в значение off, однако рекомендуется отказаться от использования экранирования обратной косой чертой. Если для представления специального символа необходимо использовать экранирование обратной косой чертой, записывайте строковую константу с E.

В дополнение к standard_conforming_strings, параметры конфигурации escape_string_warning и backslash_quote определяют режим обработки обратной косой черты в строковых константах.

Символ с кодом ноль не может содержаться в строковой константе.

2.1.1.2.3. Строковые константы с экранированием символов Unicode #

Digital Q.DataBase также поддерживает другой тип синтаксиса экранирования строк, позволяющий указывать произвольные символы Unicode по их коду. Строковая константа с экранированием Unicode начинается с U& (заглавная или строчная буква U, за которой следует амперсанд) непосредственно перед открывающей кавычкой, без пробелов между ними, например U&'foo'. (Обратите внимание, что это создает неоднозначность с оператором &. Используйте пробелы вокруг оператора во избежание этой проблемы.) Внутри кавычек символы Unicode могут быть указаны в экранированном виде путем записи обратной косой черты с последующим четырехзначным шестнадцатеричным кодом позиции или, как вариант, обратной косой черты со знаком «плюс» и последующим шестизначным шестнадцатеричным кодом позиции. Например, строка 'data' можно записать как

U&'d\0061t\+000061'

В следующем менее тривиальном примере записывается русское слово «slon» (слон) кириллицей:

U&'\0441\043B\043E\043D'

Если требуется использовать символ экранирования, отличный от обратной косой черты, его можно указать с помощью UESCAPE предложения после строки, например:

U&'d!0061t!+000061' UESCAPE '!'

Символом экранирования может быть любой одиночный символ, отличный от шестнадцатеричной цифры, знака плюс, одинарной кавычки, двойной кавычки или пробельного символа.

Чтобы включить символ экранирования в строку буквально, укажите его дважды.

Для задания суррогатных пар UTF-16 с целью формирования символов с кодовыми точками выше U+FFFF можно использовать как 4-значную, так и 6-значную форму экранирования, хотя наличие 6-значной формы технически делает это излишним. (Суррогатные пары не сохраняются напрямую, а объединяются в одну кодовую точку.)

Если кодировка сервера отличается от UTF-8, кодовая точка Unicode, заданная одной из этих escape-последовательностей, преобразуется в текущую кодировку сервера; в случае невозможности такого преобразования выдаётся ошибка.

Кроме того, синтаксис Unicode-экранирования для строковых констант работает только в том случае, если параметр конфигурации standard_conforming_strings включен. Это обусловлено тем, что в противном случае данный синтаксис может привести к некорректному разбору SQL-инструкций клиентскими приложениями, что чревато возникновением SQL-инъекций и аналогичных проблем безопасности. Если для параметра установлено значение off, использование данного синтаксиса будет отклонено с выдачей сообщения об ошибке.

2.1.1.2.4. Строковые константы в долларовых кавычках #

Хотя стандартный синтаксис задания строковых констант обычно удобен, он может быть труден для восприятия, если строка содержит много одинарных кавычек, поскольку каждую из них необходимо дублировать. Для повышения читаемости запросов в подобных ситуациях Digital Q.DataBase предусмотрен другой способ записи строковых констант, называемый «использование долларовых кавычек». Строковая константа с долларовым разделителем состоит из символа доллара ($), необязательного «тега» , содержащего ноль или более символов, еще одного символа доллара, произвольной последовательности символов, образующей содержимое строки, символа доллара, того же тега, который открывал конструкцию, и символа доллара. Например, ниже приведены два различных способа определения строки «Dianne's horse» с использованием долларовых разделителей:

$$Dianne's horse$$
$SomeTag$Dianne's horse$SomeTag$

Обратите внимание, что внутри строки с долларовым разделителем одинарные кавычки можно использовать без экранирования. Фактически, никакие символы внутри строки с долларовым разделителем не подлежат экранированию: содержимое строки всегда записывается буквально. Обратные косые черты не являются специальными символами, равно как и символы доллара, если только они не являются частью последовательности, соответствующей открывающему тегу.

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

$function$
BEGIN
    RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$

Здесь последовательность $q$[\t\r\n\v\\]$q$ представляет собой строковый литерал, заключенный в доллары, [\t\r\n\v\\], которое будет распознано при выполнении тела функции Digital Q.DataBase. Но так как эта последовательность не совпадает с внешним ограничителем долларовых кавычек $function$, она считается лишь набором символов внутри константы с точки зрения внешней строки.

Тег строковой константы в долларах (если он есть) подчиняется тем же правилам, что и идентификатор без кавычек, за исключением того, что он не может содержать знак доллара. Теги чувствительны к регистру, поэтому $tag$Содержимое строки$tag$ является допустимым вариантом, а $TAG$Содержимое строки$tag$ — нет.

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

Использование долларовых кавычек не предусмотрено стандартом SQL, но зачастую это более удобный способ записи сложных строковых литералов, чем соответствующий стандарту синтаксис с одинарными кавычками. Данный подход особенно полезен при представлении строковых констант внутри других констант, что часто требуется в определениях процедурных функций. При использовании синтаксиса с одинарными кавычками каждую обратную косую черту в приведенном выше примере пришлось бы записывать в виде четырех обратных косых черт; они сократились бы до двух при разборе исходной строковой константы, а затем до одной при повторном разборе внутренней константы в процессе выполнения функции.

2.1.1.2.5. Константы битовых строк #

Константы битовых строк записываются аналогично обычным строковым константам с символом B (в верхнем или нижнем регистре) непосредственно перед открывающей кавычкой (без промежуточных пробелов), например, B'1001'. Единственными символами, допустимыми в константах битовых строк, являются 0 и 1.

Также константы битовых строк могут быть представлены в шестнадцатеричном формате с использованием префикса X (в верхнем или нижнем регистре), например, X'1FF'. Данная нотация эквивалентна константе битовой строки, в которой каждой шестнадцатеричной цифре соответствуют четыре двоичные цифры.

Обе формы констант битовых строк могут переноситься на другие строки так же, как и обычные строковые константы. В константах битовых строк нельзя использовать долларовые кавычки.

2.1.1.2.6. Числовые константы #

Числовые константы могут иметь следующие общие формы:

цифры
цифры.[цифры][e[+-]цифры]
[цифры].цифры[e[+-]цифры]
цифрыe[+-]цифры

где цифры представляет собой одну или несколько десятичных цифр (от 0 до 9). По крайней мере одна цифра должна предшествовать десятичной точке или следовать за ней, если она используется. По крайней мере одна цифра должна следовать за маркером экспоненты (e), если он присутствует. Внутри константы не допускается наличие пробелов или иных символов, за исключением знаков подчёркивания, которые могут применяться для визуальной группировки, как описано ниже. Следует учитывать, что любой начальный знак «плюс» или «минус» фактически не является частью константы; он представляет собой оператор, применяемый к константе.

Примеры допустимых числовых констант:


42
3.5
4.
.001
5e2
1.925e-3

Кроме того, целочисленные константы в недесятичных системах счисления поддерживаются в следующих формах:

0xhexdigits
0ooctdigits
0bbindigits

где hexdigits представляет собой одну или несколько шестнадцатеричных цифр (0-9, A-F), octdigits представляет собой одну или несколько восьмеричных цифр (0–7), а bindigits представляет собой одну или несколько двоичных цифр (0 или 1). Шестнадцатеричные цифры и префиксы системы счисления могут быть в верхнем или нижнем регистре. Обратите внимание, что недесятичные формы могут иметь только целые числа, но не числа с дробной частью.

Примеры допустимых недесятичных целочисленных констант:


0b100101
0B10011001
0o273
0O755
0x42f
0XFFFF

Для визуальной группировки между цифрами могут быть вставлены символы подчеркивания. Они не влияют на значение константы. Например:


1_500_000_000
0b10001000_00000000
0o_1_755
0xFFFF_FFFF
1.618_034

Символы подчеркивания не допускаются в начале или в конце числовой константы, а также в начале или в конце группы цифр (то есть непосредственно перед десятичной точкой, маркером экспоненты или сразу после них); использование нескольких символов подчеркивания подряд также запрещено.

Числовая константа, не содержащая ни десятичной точки, ни экспоненты, изначально считается имеющей тип integer если её значение укладывается в диапазон типа integer (32 бита); в противном случае она считается имеющей тип bigint если её значение укладывается в диапазон типа bigint (64 бита); в противном случае она принимается как тип numeric. Константы, содержащие десятичные точки и/или экспоненты, всегда изначально считаются имеющими тип numeric.

Изначально назначенный тип данных числовой константы является лишь отправной точкой для алгоритмов разрешения типов. В большинстве случаев константа будет автоматически приведена к наиболее подходящему типу в зависимости от контекста. При необходимости можно принудительно интерпретировать числовое значение как конкретный тип данных, выполнив приведение типов. Например, можно принудительно обрабатывать числовое значение как тип real (float4) с помощью записи:

REAL '1.23'  -- строковый стиль
1.23::REAL   -- стиль PostgreSQL (исторический)

На самом деле это лишь частные случаи общих нотаций приведения типов, рассматриваемых далее.

2.1.1.2.7. Константы других типов #

Константа произвольного типа может быть введена с использованием любой из следующих нотаций:

тип 'строка'
'строка'::тип
CAST ( 'строка' AS тип )

Текст строковой константы передается процедуре входного преобразования для типа тип. Результатом является константа указанного типа. Явное приведение типов может быть опущено, если отсутствует двусмысленность в отношении типа константы (например, когда она присваивается непосредственно столбцу таблицы); в этом случае приведение выполняется автоматически.

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

Также можно указать приведение типов, используя синтаксис, подобный вызову функции:

имя_типа ( 'строка' )

но не все имена типов могут быть использованы таким образом; см. Раздел 2.1.2.9 для получения подробных сведений.

Конструкция ::, CAST(), а также синтаксис вызова функции могут также применяться для приведения типов произвольных выражений во время выполнения, как описано в Раздел 2.1.2.9. Во избежание синтаксической неоднозначности синтаксис тип 'строка' может использоваться только для задания типа простой литеральной константы. Еще одно ограничение синтаксиса тип 'строка' состоит в том, что он не применим к типам массивов; используйте ключевое слово ARRAY :: или CAST() для указания типа константы массива.

Конструкция CAST() синтаксис соответствует стандарту SQL. Синтаксис тип 'строка' является расширением стандарта: SQL определяет данный синтаксис только для некоторых типов данных, однако Digital Q.DataBase допускает это для всех типов. Синтаксис с :: является устаревшим Digital Q.DataBase вариантом использования, как и синтаксис вызова функции.

2.1.1.3. Операторы #

Имя оператора представляет собой последовательность длиной до NAMEDATALEN-1 (по умолчанию 63) символов из следующего списка:


+ - * / < > = ~ ! @ # % ^ & | ` ?

Тем не менее, на имена операторов накладывается несколько ограничений:

  • -- и /* не могут присутствовать в любом месте имени оператора, так как они будут восприняты как начало комментария.

  • Многосимвольное имя оператора не может заканчиваться на + или -, если только имя также не содержит хотя бы один из следующих символов:


    ~ ! @ # % ^ & | ` ?

    Например, @- является допустимым именем оператора, но *- не является. Данное ограничение позволяет Digital Q.DataBase выполнять синтаксический анализ соответствующих стандарту SQL запросов без необходимости использования пробелов между лексемами.

При работе с именами операторов, не соответствующими стандарту SQL, обычно требуется разделять соседние операторы пробелами во избежание неоднозначности. Например, если вы определили префиксный оператор с именем @, вы не можете написать X*@Y; вы должны написать X* @Y для обеспечения того, чтобы Digital Q.DataBase интерпретирует это как два имени оператора, а не как одно.

2.1.1.4. Специальные символы #

Некоторые символы, не являющиеся буквенно-цифровыми, имеют специальное значение, отличное от их использования в качестве оператора. Подробные сведения об использовании приведены в разделах, где описывается соответствующий элемент синтаксиса. Данный раздел предназначен только для информирования о существовании и краткого изложения назначения этих символов.

  • Знак доллара ($) с последующими цифрами используется для представления позиционного параметра в теле определения функции или подготовленного оператора. В других контекстах знак доллара может быть частью идентификатора или строковой константы с долларовыми кавычками.

  • Круглые скобки (()) имеют стандартное значение для группировки выражений и определения приоритета операций. В ряде случаев скобки обязательны как часть фиксированного синтаксиса конкретной команды SQL.

  • Квадратные скобки ([]) используются для выбора элементов массива. См. Раздел 2.5.15 для получения дополнительных сведений о массивах.

  • Запятые (,) используются в некоторых синтаксических конструкциях для разделения элементов списка.

  • Точка с запятой (;) завершает SQL-команду. Данный символ не может встречаться внутри команды, за исключением строковых констант или идентификаторов в кавычках.

  • Двоеточие (:) используется для выбора «срезов» из массивов. (См. Раздел 2.5.15.) В некоторых диалектах SQL (таких как Embedded SQL) двоеточие используется в качестве префикса имен переменных.

  • Звездочка (*) используется в некоторых контекстах для обозначения всех полей строки таблицы или составного значения. Она также имеет специальное значение при использовании в качестве аргумента агрегатной функции, а именно: такая функция не требует каких-либо явных параметров.

  • Точка (.) используется в числовых константах, а также для разделения имен схем, таблиц и столбцов.

2.1.1.5. Комментарии #

Комментарий представляет собой последовательность символов, начинающуюся с двойного тире и продолжающуюся до конца строки, например:

-- This is a standard SQL comment

Кроме того, можно использовать блочные комментарии в стиле C:

/* multiline comment
 * with nesting: /* nested block comment */
 */

где комментарий начинается с /* и продолжается до соответствующего вхождения */. Такие блочные комментарии могут быть вложенными, как определено в стандарте SQL (в отличие от C). Это позволяет закомментировать большие блоки кода, которые уже могут содержать блочные комментарии.

Комментарий удаляется из входного потока перед дальнейшим синтаксическим анализом и фактически заменяется пробелом.

2.1.1.6. Приоритет операторов #

Таблица 2.1.2 показывает приоритет и ассоциативность операторов в Digital Q.DataBase. Большинство операторов имеют одинаковый приоритет и являются левоассоциативными. Приоритет и ассоциативность операторов жестко закреплены в анализаторе. Используйте скобки, если выражение с несколькими операторами должно обрабатываться в порядке, отличном от установленного правилами приоритета.

Таблица 2.1.2. Приоритет операторов (от высшего к низшему)

Оператор/ЭлементАссоциативностьОписание
.левосторонняяразделитель имен таблицы и столбца
::левосторонняяDigital Q.DataBase-стиль приведения типов
[ ]левосторонняявыбор элемента массива
+ -правосторонняяунарный плюс, унарный минус
COLLATEлевосторонняявыбор правила сортировки
ATлевосторонняяAT TIME ZONE, AT LOCAL
^левосторонняявозведение в степень
* / %левосторонняяумножение, деление, остаток от деления
+ -левосторонняясложение, вычитание
(любой другой оператор)левосторонняявсе прочие встроенные и определенные пользователем операторы
BETWEEN IN LIKE ILIKE SIMILAR проверка вхождения в диапазон, принадлежность к множеству, сопоставление строк
< > = <= >= <>  операторы сравнения
IS ISNULL NOTNULL IS TRUE, IS FALSE, IS NULL, IS DISTINCT FROMи т. д.
NOTправосторонняялогическое отрицание
ANDлевосторонняялогическая конъюнкция
ORлевосторонняялогическая дизъюнкция

Обратите внимание, что правила приоритета операторов также распространяются на пользовательские операторы, имена которых совпадают с именами вышеупомянутых встроенных операторов. Например, если для некоторого пользовательского типа данных определен «+» оператор для пользовательского типа данных, он будет иметь тот же приоритет, что и встроенный «+» оператор, независимо от его реализации.

Если имя оператора с указанием схемы используется в синтаксической конструкции OPERATOR , как, например, в:

SELECT 3 OPERATOR(pg_catalog.+) 4;

эта OPERATOR конструкция будет иметь приоритет по умолчанию, указанный в Таблица 2.1.2 для «любого другого оператора». Это утверждение верно независимо от того, какой именно оператор указан внутри OPERATOR().

Примечание

Digital Q.DataBase в версиях до 9.5 использовались несколько иные правила приоритета операторов. В частности, <= >= и <> ранее рассматривались как обычные операторы; IS проверки имели более высокий приоритет; и NOT BETWEEN и родственные конструкции вели себя непоследовательно, в некоторых случаях принимая приоритет NOT а не BETWEEN. Данные правила были изменены для обеспечения лучшего соответствия стандарту SQL и устранения путаницы, вызванной неоднозначной обработкой логически эквивалентных конструкций. В большинстве случаев эти изменения не приведут к изменению поведения или, возможно, приведут к «оператор отсутствует» ошибкам, которые могут быть устранены путем добавления скобок. Однако существуют пограничные случаи, в которых поведение запроса может измениться без формирования сообщения об ошибке синтаксического анализа.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению