Общие сведения
Для начала ознакомьтесь с несколькими замечаниями о некоторых характеристиках, лежащих воснове языковой реализации Firebird.
Для начала ознакомьтесь с несколькими замечаниями о некоторых характеристиках, лежащих воснове языковой реализации Firebird.
SQL имеет четыре подмножества SQL, используемых в различных областях применения:
DSQL |
Dynamic SQL (Динамический SQL ) |
PSQL |
Procedural SQL (Процедурный SQL) |
ESQL |
Embedded SQL (Встроенный SQL) |
ISQL |
Interactive SQL (Интерактивный SQL) |
Динамический SQL является основной частью языка, которая соответствует Части 2 (SQL/Foundation – SQL/Основы) спецификации SQL. DSQL представляет собой конструкции, которые передаются клиентскими приложениями с помощью Firebird API и обрабатываются сервером базы данных.
Процедурный SQL является расширением Динамического SQL, в котором дополнительно присутствуют составные операторы, содержащие локальные переменные, присваивание, циклы и другие процедурные конструкции. PSQL относится к Части 4 (SQL/PSM) спецификации SQL. Изначально расширение PSQL было доступно только лишь в постоянно хранимых в базе модулях (процедурах и триггерах), но сравнительно недавно они стали также доступны в Динамическом SQL (смотри EXECUTE BLOCK).
Встроенный SQL определяет подмножество DSQL, поддерживаемое средством Firebird GPRE. GPRE — приложение-препроцессор, которое позволяет вам внедрять SQL конструкции в ваш непосредственный язык программирования (C, C++, Pascal, Cobol и так далее) и производить обработку этих внедрённых конструкций в правильные вызовы Firebird API. Обратите внимание, что ESQL поддерживает только часть конструкций и выражений DSQL.
Интерактивный SQL подразумевает собой язык, который может быть использован для работы с приложением командной строки Firebird ISQL для интерактивного доступа к базам данных. isql является обычным клиентским приложением. Для него обычный язык — это язык DSQL. Однако приложение поддерживает несколько дополнительных команд.
Оба языковых подмножества, как DSQL, так и PSQL полностью представлены в данном руководстве. Из набора инструментария ни ESQL, ни ISQL не описаны здесь отдельно, за исключением тех мест, где это указано явно.
SQL диалект — это термин, определяющий специфические особенности языка SQL, которые доступны во время доступа с его помощью к базе данных. SQL диалект может быть определён как на уровне базы данных, так и на уровне соединения с базой данных. В настоящее время доступны три диалекта:
Диалект 1 предназначен исключительно для обеспечения обратной совместимости с устаревшими базами данных из очень старых версий InterBase, v.5 и ниже. Базы данных Dialect 1 сохраняют определенные языковые особенности, которые отличаются от Dialect 3, используемого по умолчанию для баз данных Firebird.
Информация о дате и времени хранится в типе данных DATE
. Имеется тип данных TIMESTAMP
, который идентичен DATE
.
Двойные кавычки могут использоваться как альтернатива апострофам для разделения строковых данных. Это противоречит стандарту SQL - двойные кавычки зарезервированы для особых синтаксических целей как в стандартном SQL, так и в диалекте 3. Поэтому строки с двойными кавычками следует избегать.
Точность типов данных NUMERIC
и DECIMAL
меньше, чем в 3-м диалекте и в случае, если значение точности более 9, Firebird хранит такие значения как длинные значения с плавающей точкой.
BIGINT не является доступным типом данных.
Идентификаторы нечувствительны к регистру и всегда должны соответствовать правилам для обычных идентификаторов — см. Раздел Идентификаторы ниже.
Хотя значения генератора хранятся как 64-битные целые числа, запрос клиента Dialect 1, например, SELECT GEN_ID (MyGen, 1)
, вернет значение генератора, усеченное до 32 бит.
Диалект 2 доступен только в клиентском соединении к Firebird и не может быть применён к базе данных. Он предназначен для того, чтобы помочь в отладке в случае возможных проблем с целостностью данных при проведении миграции с диалекта 1 на 3.
В базах данных Диалекта 3:
Числа с типами данных DECIMAL и NUMERIC хранятся как длинные значения с фиксированной точкой (масштабируемые целые числа) в случае если точность числа больше 9.
Тип данных TIME доступен и используется для хранения значения только времени.
Тип данных DATE хранит информацию только о дате.
Тип данных BIGINT доступен в качестве целого 64-х битного типа данных.
Двойные кавычки могут использоваться, но только для идентификаторов, которые являются зависимыми от регистра, а не для строковых данных.
Все строки должны быть разделены одинарными кавычками (апострофам).
Значения генераторов возвращаются как 64-битное целое.
Important
|
Для вновь разрабатываемых баз данных и приложений настоятельно рекомендуется использовать 3-й диалект. Диалект при соединении с базой данных должен быть таким же, как и базы данных. Исключением является случай миграции с 1-го в 3-й диалект, когда в строке соединения с базой данных используется 2-й диалект. По умолчанию это руководство описывает семантику SQL третьего диалекта, если только в тексте явно не указывается диалект. |
Обработка любого оператора либо успешно завершается, либо прерывается из-за вызванной определёнными условиями ошибки. Обработку ошибок можно производить, как в клиентском приложении, так и на стороне сервера средствами SQL.
Основная конструкция SQL — оператор (statement). Оператор описывает, что должна выполнить система управления базами данных с конкретным объектом данных или метаданных, обычно не указывая, как именно это должно быть выполнено. Достаточно сложные операторы содержат более простые конструкции — предложения (clause) и варианты, альтернативы (options).
Предложение описывает некую законченную конструкцию в операторе. Например, предложение WHERE в операторе SELECT и в ряде других операторов (UPDATE, DELETE) задаёт условия поиска данных в таблице (таблицах), подлежащих выборке, изменению, удалению. Предложение ORDER BY задаёт характеристики упорядочения выходного, результирующего, набора данных.
Альтернативы, будучи наиболее простыми конструкциями, задаются при помощи конкретных ключевых слов и определяют некоторые дополнительные характеристики элементов предложения (допустимость дублирования данных, варианты использования и др.).
В SQL существуют ключевые слова и зарезервированные слова. Ключевые слова — это все слова, входящие в лексику (словарь) языка SQL. Ключевые слова можно (но не рекомендуется) использовать в качестве имён, идентификаторов объектов базы данных, внутренних переменных и параметров. Зарезервированные слова — это те ключевые слова, которые нельзя использовать в качестве имён объектов базы данных, переменных или параметров.
Например, следующий оператор будет выполнен без ошибок потому, что ABS является ключевым, но не зарезервированным словом.
CREATE TABLE T (ABS INT NOT NULL);
При выполнении такого оператора будет выдана ошибка потому, что ADD является ключевым и зарезервированным словом.
CREATE TABLE T (ADD INT NOT NULL);
Список зарезервированных и ключевых слов представлен в приложении Зарезервированные и ключевые слова.
Все объекты базы данных имеют имена, которые иногда называют идентификаторами. Максимальная длина идентификатора составляет 63 символа. Существует два типа идентификаторов — имена, похожие по форме на имена переменных в обычных языках программирования, и имена с разделителями (delimited name), которые являются отличительной особенностью языка SQL.
Длина идентификатора не должна превышать 63 символа
Обычное имя должно начинаться с буквы латинского алфавита (первые 7 бит таблицы ASCII), за которой могут следовать буквы (латинского алфавита), цифры, символ подчёркивания и знак доллара. В имени нельзя использовать буквы кириллицы, пробелы, другие специальные символы. Такое имя нечувствительно к регистру, его можно записывать как строчными, так и прописными буквами. Следующие имена с точки зрения системы являются одинаковыми:
fullname
FULLNAME
FuLlNaMe
FullName
<name> ::= <letter> | <name><letter> | <name><digit> | <name>_ | <name>$ <letter> ::= <upper letter> | <lower letter> <upper letter> ::= A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z <lower letter> ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Длина идентификатора не должна превышать 63 символа.
Имя должно быть заключено в двойные кавычки, например "anIdentifier"
.
Идентификатор может содержать любой символ из набора символов UTF-8, включая символы с диакритическими знаками, пробелы и специальные символы.
Идентификатор может быть зарезервированным словом.
Идентификаторы с разделителями чувствительны к регистру во всех контекстах.
Завершающие пробелы в именах с разделителями игнорируются, как и в случае любой строковой константы.
Идентификаторы с разделителями доступны только в Диалекте 3. Подробнее о диалектах см. Диалекты SQL
<delimited name> ::= "<permitted_character>[<permitted_character> ...]"
Note
|
Идентификатор с разделителями, например |
Литералы служат для непосредственного представления данных. Ниже приведены примеры стандартных литералов:
целочисленные — 0, -34, 45, 0X080000000;
числа с фиксированной точкой — 0.0, -3.14;
вещественные — 3.23e-23;
строковые — 'текст', 'don''t!', Q'{don’t!}';
двоичные строки — x'48656C6C6F20776F726C64';
дата — DATE '10.01.2014';
время — TIME '15:12:56';
временная отметка — TIMESTAMP '10.01.2014 13:32:02';
логические — TRUE, FALSE, UNKNOWN;
неопределённое состояние — null.
Подробней о литералах для каждого из типов данных см. Типы и подтипы данных.
Существует набор специальных символов, используемых в качестве разделителей.
<special char> ::= <space> | " | % | & | ' | ( | ) | * | + | , | - | . | / | : | ; | < | = | > | ? | [ | ] | ^ | { | }
Часть этих символов, а так же их комбинации могут быть использованы как операторы (арифметические, строковые, логические), как разделители команд SQL, для квотирования идентификаторов, и для обозначения границ строковых литералов или комментариев.
<operator> ::= <string concatenation operator> | <arithmetic operator> | <comparison operator> | <logical operator> <string concatentation operator> ::= "||" <arithmetic operator> ::= * | / | + | - | <comparison operator> ::= = | <> | != | ~= | ^= | > | < | >= | <= | !> | ~> | ^> | !< | ~< | ^< <logical operator> ::= NOT | AND | OR
Подробнее об операторах см. Выражения.
В SQL скриптах, операторах SQL и PSQL модулях могут встречаться комментарии. Комментарий — это произвольный текст заданный пользователем, предназначенный для пояснения работы отдельных частей программы. Синтаксический анализатор игнорирует текст комментариев.
В Firebird поддерживается два типа комментариев: блочные и однострочные.
<comment> ::= <block comment> | <single-line comment> <block comment> ::= /* <character>[<character> ...] */ <single-line comment> ::= -- <character>[<character> ...]<end line>
Блочные комментарии начинаются с символов /*
и заканчиваются символам */
.Блочные комментарии могут содержать текст произвольной длины и занимать несколько строк.
Однострочные комментарии начинаются с символов --
и действуют до конца текущей строки.
CREATE PROCEDURE P(APARAM INT)
RETURNS (B INT)
AS
BEGIN
/* Данный текст не будет учитываться
при работе процедуры, т.к. является комментарием
*/
B = A + 1; -- Однострочный комментарий
SUSPEND;
END