Ввод 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, чтобы быть завершенным.

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

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

Идентификаторы 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будет восприниматься как ключевое слово и, следовательно, вызовет ошибку синтаксического анализа при использовании там, где ожидается имя таблицы или столбца. Пример можно записать с идентификаторами в кавычках следующим образом:

UPDATE "my_table" SET "a" = 5;

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

Заключение идентификатора в кавычки также делает его чувствительным к регистру, тогда как имена без кавычек всегда преобразуются в нижний регистр. Например, идентификаторы FOO, fooи "foo"считаются в PostgreSQL"Foo" одинаковыми , но "FOO"отличаются от этих трех и друг от друга. (Свертывание имен без кавычек в нижний регистр в PostgreSQL несовместимо со стандартом SQL, в котором говорится, что имена без кавычек должны быть преобразованы в верхний регистр. Таким образом, fooдолжно быть эквивалентно "FOO"не "foo"в соответствии со стандартом. Если вы хотите писать переносимые приложения, вам рекомендуется всегда цитировать конкретное имя или никогда не цитировать его.)

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

U&"d\0061t\+000061"

В следующем менее тривиальном примере русское слово « слон » (слон) пишется кириллическими буквами:

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

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

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

Управляющий символ может быть любым одиночным символом, кроме шестнадцатеричной цифры, знака плюс, одинарной кавычки, двойной кавычки или пробела. Обратите внимание, что escape-символ записывается в одинарных, а не в двойных кавычках после UESCAPE.

Чтобы включить escape-символ в идентификатор буквально, напишите его дважды.

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

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

Константы

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

Строковые Константы

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

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

SELECT 'foo'
'bar';

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

SELECT 'foobar';

но:

SELECT 'foo'      'bar';

недопустимый синтаксис. (Это немного странное поведение определяется SQL ; PostgreSQL следует стандарту.)

Строковые константы с экранированием в C-стиле

PostgreSQL также поддерживает строковые константы escape , являющиеся расширением стандарта SQL . Константа управляющей строки указывается путем написания буквы E(верхнего или нижнего регистра) непосредственно перед открывающей одинарной кавычкой, например, E'foo'. (При продолжении константы управляющей строки между строками пишите Eтолько перед первой открывающей кавычкой.) В управляющей строке символ обратной косой черты ( \) начинает управляющую последовательность обратной косой черты в стиле C, в которой комбинация обратной косой черты и следующих за ней символов представляют собой специальное значение байта.

Экранирующая последовательность обратной косой чертыИнтерпретация
\bназад
\fподача формы
\nновая линия
\rвозврат каретки
\tвкладка
\o, , ( = 0–7)\oo\ooooвосьмеричное значение байта
\xh, ( = 0–9, А–F)\xhhhшестнадцатеричное значение байта
\uxxxx, ( = 0–9, А–F)\Uxxxxxxxxx16- или 32-битное шестнадцатеричное значение символа Unicode

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

Вы несете ответственность за то, чтобы последовательности байтов, которые вы создаете, особенно при использовании восьмеричных или шестнадцатеричных escape-последовательностей, составляли допустимые символы в кодировке набора символов сервера. Полезной альтернативой является использование escape-последовательности Unicode или альтернативный синтаксис escape-последовательности Unicode; затем сервер проверит, возможно ли преобразование символов.

Строковые Константы С Экранированием Unicode

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

U&'d\0061t\+000061'

В следующем менее тривиальном примере русское слово « слон » (слон) пишется кириллическими буквами:

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

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

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

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

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

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

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

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

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

Хотя стандартный синтаксис для указания строковых констант обычно удобен, может быть трудно понять, когда нужная строка содержит много одинарных кавычек или обратную косую черту, поскольку каждая из них должна быть удвоена. Чтобы сделать запросы более читабельными в таких ситуациях, PostgreSQL предоставляет другой способ записи строковых констант , называемый « долларовыми кавычками » . Строковая константа в долларовых кавычках состоит из знака доллара ( $), необязательного « тега » из нуля или более символов, еще одного знака доллара, произвольной последовательности символов, составляющих содержимое строки, знака доллара, того же тега, с которого начинается эта кавычка доллара и знак доллара. Например, вот два разных способа указать строку« Лошадь Дайанны » с использованием долларовых котировок:

$$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\\], которая будет распознана при выполнении тела функции PostgreSQL . Но поскольку последовательность не соответствует внешнему разделителю в долларовых кавычках $function$, это всего лишь еще несколько символов внутри константы, если речь идет о внешней строке.

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

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

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

Битовые константы

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

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

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

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

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

digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits

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

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

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

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

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

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

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

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

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

type 'string'
'string'::type
CAST ( 'string' AS type )

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

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

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

typename(' string')

но не все имена типов можно использовать таким образом.

Синтаксисы ::, CAST(), и вызова функции также можно использовать для указания преобразования типов произвольных выражений во время выполнения. Чтобы избежать синтаксической двусмысленности, синтаксис можно использовать только для указания типа простой литеральной константы. Другое ограничение синтаксиса состоит в том, что он не работает для типов массивов; используйте или для указания типа константы массива.type 'string'type 'string'::CAST()

Синтаксис CAST()соответствует SQL. Синтаксис является обобщением стандарта: SQL определяет этот синтаксис только для нескольких типов данных, но PostgreSQL допускает его для всех типов. Синтаксис with является историческим использованием PostgreSQL , как и синтаксис вызова функции.type 'string'::

Операторы

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

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

Однако есть несколько ограничений на имена операторов:

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

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

~ ! @ # % ^ & | ` ?

Например, @-является разрешенным именем оператора, но *-не является. Это ограничение позволяет PostgreSQL анализировать SQL-совместимые запросы, не требуя пробелов между токенами.

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

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

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

  • Знак доллара ( $), за которым следуют цифры, используется для представления позиционного параметра в теле определения функции или подготовленного оператора. В других контекстах знак доллара может быть частью идентификатора или строковой константы в долларовых кавычках.
  • Скобки ( ()) имеют свое обычное значение для группировки выражений и обеспечения приоритета. В некоторых случаях круглые скобки требуются как часть фиксированного синтаксиса конкретной команды SQL.
  • Скобки ( []) используются для выбора элементов массива.
  • Запятые ( ,) используются в некоторых синтаксических конструкциях для разделения элементов списка.
  • Точка с запятой ( ;) завершает команду SQL. Он не может появляться нигде внутри команды, кроме строковой константы или идентификатора в кавычках.
  • Двоеточие ( :) используется для выбора « срезов » из массивов. В некоторых диалектах SQL (таких как Embedded SQL) двоеточие используется для префикса имен переменных.
  • Звездочка ( *) используется в некоторых контекстах для обозначения всех полей строки таблицы или составного значения. Он также имеет особое значение при использовании в качестве аргумента агрегатной функции, а именно то, что агрегат не требует явного параметра.
  • Точка ( .) используется в числовых константах и ​​для разделения имен схем, таблиц и столбцов.

Комментарии

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

-- This is a standard SQL comment

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

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

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

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

Приоритет оператора

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

Приоритет оператора (от высшего к низшему)

Оператор/ЭлементАссоциативностьОписание
.слеваразделитель имени таблицы/столбца
::слеваПриведение типов в стиле PostgreSQL
[ ]слевавыбор элемента массива
+ -Правильноунарный плюс, унарный минус
^слевавозведение в степень
* / %слеваумножение, деление, модуль
+ -слевасложение, вычитание
(любой другой оператор)слевавсе другие родные и определяемые пользователем операторы
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;