Adobe AIR включает компонент SQL Database Engine с поддержкой локальных баз данных SQL и многими стандартными возможностями SQL на основе системы баз данных с открытым кодом SQLite. Среда выполнения не определяет способ хранения данных баз данных и их расположение в файловой системе. Каждая база данных целиком хранится в одной файле. Разработчик может указать местоположение в файловой системе для хранения файла базы данных, и отдельное приложение AIR сможет получить доступ к одной или нескольким отдельным базам данных (т.е. отдельным файлам баз данных).
В данном документе описан синтаксис SQL и поддержка типов данных для локальных баз данных SQL Adobe AIR. Этот документ не претендует на роль исчерпывающего справочника по SQL. Наоборот, в нем приводятся конкретные сведения о диалекте SQL, поддерживаемом Adobe AIR. Среда выполнения поддерживает большую часть стандартного диалекта SQL-92. Поскольку существует большое число справочников, веб-узлов, книг и учебных материалов для изучения SQL, данный документ не следует рассматривать, как исчерпывающий справочник по SQL или учебник. Более того, этот документ посвящен, в частности, синтаксису SQL, поддерживаемому Apollo AIR, а также описывает различия между SQL-92 и поддерживаемым диалектом SQL.
Рассматриваются следующие темы:
Этот раздел посвящен синтаксису SQL, поддерживаемому компонентом SQL Database Engine Adobe AIR. Приведенный список можно разделить на описания различных инструкций и типов предложений, выражений, встроенных функций и операторов. Рассматриваются следующие темы:
SELECT
, INSERT
, UPDATE
и DELETE
)CREATE
, ALTER
и DROP
для таблиц, индексов, представлений и триггеров)В дополнение к определенному синтаксису для различных инструкций и выражений применяются следующие общие правила синтаксиса SQL:
Инструкции обработки данных являются наиболее часто используемыми инструкциями SQL. Эти инструкции служат для извлечения, добавления, изменения и удаления данных из таблиц баз данных. Поддерживаются следующие инструкции обработки данных:
Инструкция SELECT
служит для опроса базы данных. Результатом инструкции SELECT
является ноль или несколько строк данных, где у каждой строки имеется фиксированное число столбцов. Число столбцов в результате определяется именем столбца result
или списком выражений между SELECT
и необязательным ключевым словом FROM
.
В качестве результата можно использовать любое произвольное выражение. Если результирующее выражение — *
, то все столбцы всех таблиц заменяются этим выражением. Если выражение содержит имя таблицы после .*
, то результатом будут все столбцы в этой таблице.
По ключевому слову DISTINCT
возвращается подмножество строк результатов с разными строками результатов. Значения NULL
не рассматриваются как отличные друг от друга. По умолчанию возвращаются все строки результатов, если явным образом использовать ключевое слово ALL
.
Запрос выполняется по одной или нескольким таблицам, указанным после ключевого слова FROM
. Если несколько имен таблиц разделены запятыми, запрос использует перекрестное соединение различных таблиц. Синтаксис JOIN
можно также использовать для указания способа соединения таблиц. Поддерживаемый тип внешнего соединения — LEFT OUTER JOIN
. Выражение предложения ON
в join-args
должно приводить к логическому значению. Вложенный запрос в скобках можно использовать как таблицу в предложении FROM
. Предложение FROM
можно полностью опустить, в случае чего результатом будет отдельная строка значений списка выражений result
.
Предложение WHERE
служит для ограничения числа строк, извлекаемых запросом. Выражения предложения WHERE
должны приводить к логическому значению. Фильтрация по предложению WHERE
выполняется перед всякой группировкой, поэтому в выражениях предложения WHERE
не может быть статических функций.
Предложение GROUP BY
приводит к объединению одной или нескольких строк результатов в одну строку результата. Предложение GROUP BY
особенно полезно, если результат содержит статические функции. Выражения в предложении GROUP BY
не должны быть выражениями из списка выражений SELECT
.
Предложение HAVING
похоже на WHERE
тем, что оно ограничивает строки, возвращаемые инструкцией. При этом предложение HAVING
применяется после выполнения любой группировки, заданной предложением GROUP BY
. Следовательно, выражение HAVING
может относиться к значениям со статическими функциями. Выражение предложения HAVING
не обязательно должно присутствовать в списке SELECT
. Как и выражение WHERE
, выражение HAVING
должно приводить к логическому значению.
Предложение ORDER BY
вызывает сортировку выходных строк. Аргумент sort-expr-list
в предложении ORDER BY
представляет собой список выражений, используемых в качестве ключа для списка. Выражения не должны быть частью результата простой инструкции SELECT
, но в составной инструкции SELECT
(SELECT
с использованием одного из операторов compound-op
) каждое выражение сортировки должно в точности соответствовать одному из столбцов результатов. После каждого выражения сортировки можно использовать предложение sort-order
(необязательно), состоящее из ключевого слова COLLATE
и имени функции сортировки, используемое для упорядочивания текста, и/или ключевое слово ASC
или DESC
для указания порядка сортировки (по возрастанию или убыванию). Предложение sort-order
можно опустить и использовать значение по умолчанию (упорядочивание по возрастанию). Определение предложения COLLATE
и функций сортировки см. в разделе COLLATE.
Предложение LIMIT
устанавливает верхнюю границу числа строк, возвращаемых в результате. Отрицательное значение LIMIT
указывает на отсутствие верхней границы. Необязательный оператор OFFSET
после LIMIT
указывает количество пропускаемых строк в начале результирующего набора. В составном запросе SELECT
предложение LIMIT
может только следовать за конечным оператором SELECT
, и ограничение применяется к запросу целиком. Обратите внимание, что при использовании в предложении LIMIT
ключевого слова OFFSET
предельным значением является первое целое число, а смещением — второе целое число. Если вместо ключевого слова OFFSET
использовать запятую, то смещением будет первое число, а предельным значением — второе число. Такое внешнее противоречие является намеренным: оно позволяет достичь максимальной совместимости с устаревшими системами баз данных SQL.
Составная инструкция SELECT
формируется из одной или нескольких инструкций SELECT
, соединенных одним из операторов UNION
, UNION
ALL
, INTERSECT
или EXCEPT
. В составной инструкции SELECT
все входящие в нее инструкции SELECT
должны указывать то же число столбцов результатов. После конечной инструкции SELECT
может быть только одно предложение ORDER BY
(и перед отдельным предложением LIMIT
, если оно указано). Операторы UNION
и UNION ALL
объединяют результаты предшествующих и последующих инструкции SELECT
в одну таблицу. Отличие заключается в том, что в UNION
различными являются все строки результатов, а в UNION ALL
возможны повторения. Оператор INTERSECT
принимает пересечение результатов предшествующих и последующих инструкций SELECT
. EXCEPT
принимает результат предшествующей инструкции SELECT
после удаления результатов последующей инструкции SELECT
. При соединении трех и более инструкций SELECT
для образования составной инструкции, они группируются от первой до последней.
Определение разрешенных выражений см. в разделе Выражения
Инструкция INSERT
имеет две базовых формы и служит для заполнения таблиц данными.
Первая форма (с ключевым словом VALUES
) создает новую отдельную строку в существующей таблице. Если column-list
не указан, то число значений должно соответствовать числу столбцов в таблице. Если column-list
указан, то число значений должно соответствовать числу указанных столбцов. Столбцы таблицы, отсутствующие в списке столбцов, заполняются значением по умолчанию, определенным при создании таблицы, или значением NULL
, если значение по умолчанию не определено.
Вторая форма INSERT
берет свои данные из инструкции SELECT
. Число столбцов в результате SELECT
должно в точности соответствовать числу столбцов в таблице, если column-list
не указан, или должно соответствовать числу столбцов, чьи имена указаны в column-list
. Для каждой строки результата SELECT
создается новая запись в таблице. Инструкция SELECT
может быть простой или составной. Определение допустимых инструкций SELECT
см. в разделе SELECT.
Необязательный conflict-algorithm
позволяет указывать альтернативный алгоритм разрешения конфликтов ограничений во время этой команды. Определение и описание алгоритмов конфликтов см. в разделе ON CONFLICT (алгоритмы конфликтов).
Две формы инструкции — REPLACE INTO
— эквиваленты использованию стандартной инструкции INSERT [OR conflict-algorithm]
с алгоритмом конфликтов REPLACE
(т.е., форма INSERT OR REPLACE...
).
Инструкция UPDATE
служит для изменения значения столбцов в наборе строк в таблице.
Каждое назначение в инструкции UPDATE
указывает имя столбца слева от знака равенства (=) и произвольное выражение справа. В выражении можно использовать значения других столбцов. Перед любым назначением все выражения вычисляются. Определение разрешенных выражений см. в разделе Выражения
Предложение WHERE
служит для ограничения обновляемых строк. Выражение предложения WHERE
должно приводить к логическому значению.
Необязательный conflict-algorithm
позволяет указывать альтернативный алгоритм разрешения конфликтов ограничений во время этой команды. Определение и описание алгоритмов конфликтов см. в разделе ON CONFLICT (алгоритмы конфликтов).
Команда удаления служит для удаления записей из таблицы.
Команда состоит из ключевых слов DELETE FROM
, после которых указывается имя таблицы, из которой требуется удалить записи.
Без предложения WHERE
удаляются все строки таблицы. Если предложение WHERE
указано, то удаляются только те строки, которые соответствуют выражению. Выражение предложения WHERE
должно приводить к логическому значению. Определение разрешенных выражений см. в разделе Выражения.
Инструкции определения данных служат для создания, изменения и удаления объектов баз данных, таких как таблицы, представления индексы и триггеры. Поддерживаются следующие инструкции определения данных:
Инструкция CREATE TABLE
состоит из ключевых слов CREATE TABLE
с именем новой таблицы, а затем (в скобках) списком определений столбцов и ограничений. Имя таблицы может быть идентификатором или строкой.
Каждое определение столбца представляет имя столбца, после которого указан тип данных этого столбца, а затем одно или несколько необязательных ограничений столбца. Тип данных для столбца ограничивает тип данных, которые столбец может хранить. При попытке сохранения значения другого типа данных в столбце среда выполнения преобразует значение в соответствующие тип (если возможно) или создаст ошибку. Дополнительные сведения см. в разделе Поддерживаемые типы данных.
Ограничение столбца NOT NULL
указывает, что в столбце не могут содержаться значения NULL
.
Ограничение UNIQUE
вызывает создание индекса для заданного столбца или столбцов. Этот индекс должен содержать уникальные ключи — две строки не могут содержать одинаковые значения или сочетания значений для заданного столбца или столбцов. Инструкция CREATE TABLE
может иметь несколько ограничений UNIQUE
, в том числе несколько столбцов с ограничением UNIQUE
в определении столбца и/или несколько ограничений UNIQUE
уровня таблицы.
Ограничение CHECK определяет вычисляемое выражение и должно быть истинным (true) для вставки или обновления данных строки. Выражение CHECK должно приводить к логическому значению.
Предложение COLLATE
в определении столбца задает функцию сортировки текста, которая будет использоваться при сравнении текстовых записей для столбца. По умолчанию используется функция сортировки BINARY
. Подробные сведения о предложении COLLATE
и функциях сортировки см. в разделе COLLATE.
Ограничение DEFAULT
задает значение по умолчанию, используемое при выполнении INSERT
. Значение может быть NULL
, строковой константой или числом. Значение по умолчанию может также быть специальным независимым от регистра ключевым словом CURRENT_TIME
, CURRENT_DATE
или CURRENT_TIMESTAMP
. Если значение равно NULL
, является строковой константой или числом, оно буквально вставляется в столбец, если значение для столбца не задано инструкцией INSERT
. Если используется значение CURRENT_TIME
, CURRENT_DATE
или CURRENT_TIMESTAMP
, в столбец вставляется текущая дата и/или время в формате UTC. Для CURRENT_TIME
задается формат HH:MM:SS
. Для CURRENT_DATE
форматом является YYYY-MM-DD
. Формат для CURRENT_TIMESTAMP
— YYYY-MM-DD HH:MM:SS
.
Указание PRIMARY KEY
обычно создает индекс UNIQUE
для соответствующего столбца или столбцов. При этом если ограничение PRIMARY KEY
действует для отдельного столбца с типом данных INTEGER
, то столбец используется внутренне в качестве фактического первичного ключа для таблицы. Это означает, что в столбце могут содержаться только уникальные целочисленные значения. Если в таблице отсутствует столбец INTEGER PRIMARY KEY
, ключ целых значений будет автоматически создан при вставке строки. Доступ к первичному ключу строки можно всегда получить при помощи одного из специальных имен ROWID
, OID
или _ROWID_
. Эти имена можно использовать независимо от того, явно объявленный INTEGER PRIMARY KEY
это ключ или внутреннее созданное значение. Столбец INTEGER PRIMARY KEY
может также включать ключевое слово AUTOINCREMENT
. Когда используется ключевое слово AUTOINCREMENT
, база данных автоматически создает и вставляет последовательно увеличивающийся ключ целых значений в столбец INTEGER PRIMARY KEY
при выполнении инструкции INSERT
.
В инструкции CREATE TABLE
может быть только одно ограничение PRIMARY KEY
. Оно может быть частью определения одного столбца или одного отдельного ограничения PRIMARY KEY
уровня таблицы. Столбец первичного ключа неявно NOT NULL
.
Необязательный conflict-clause
после многих ограничений позволяет указывать альтернативный алгоритм разрешения конфликтов ограничений по умолчанию для такого ограничения. По умолчанию это ABORT
. Для различных ограничений в одной и той же таблице возможны разные алгоритмы разрешения конфликтов по умолчанию. Если инструкция INSERT
или UPDATE
задает другой алгоритм разрешения конфликтов, то он используется вместо алгоритма, указанного в инструкции CREATE TABLE. Дополнительные сведения см. в разделе ON CONFLICT (алгоритмы конфликтов).
Дополнительные ограничения, такие как FOREIGN KEY, не приводят к ошибке, но среда выполнения пропускает их.
Если ключевое слово TEMP
или TEMPORARY
стоит между CREATE
и TABLE
, то создаваемая таблица будет видимой только в рамках одного и того же подключения к базе данных (экземпляр SQLConnection). При закрытии подключения она автоматически удаляется. Любые индексы, созданные во временной таблице, также являются временными. Временные таблицы и индексы хранятся в отдельном файле, отличным от основного файла базы данных.
Если указан необязательный префикс database-name
, то таблица создается в именованной базе данных (базе данных, подключенной к экземпляру SQLConnection путем вызова метода attach()
с заданным именем базы данных). Ошибочным будет указание префикса database-name
и ключевого слова TEMP
, если префикс database-name
не является temp
. Если имя базы данных не указано, а ключевое слово TEMP
присутствует, то таблица создается в основной базе данных (базе данных, подключенной к экземпляру SQLConnection при помощи метода open()
или openAsync()
).
Не существует произвольных пределов на число столбцов или ограничений в таблице. Также отсутствует произвольный предел на объем данных в строке.
Форма CREATE TABLE AS
определяет таблицу как результирующий набор запроса. Имена столбцов таблицы — это имена столбцов в результате.
Если присутствует необязательное предложение IF NOT EXISTS
и другая таблица с тем же именем уже существует, то база данных пропускает команду CREATE TABLE
.
Таблицу можно удалить при помощи инструкции DROP TABLE
, а при помощи инструкции ALTER TABLE
можно внести ограниченные изменения.
Команда ALTER TABLE
позволяет пользователю переименовать столбец или добавить новый столбец в существующую таблицу. Столбец невозможно удалить из таблицы.
Синтаксис RENAME TO
используется для переименования таблицы, определенной [database-name.] table-name
, в new-table-name
. Эту команда нельзя использовать для переноса таблицы между присоединенными базами данных — она служит только для переименования таблицы в одной базе данных.
Если переименовываемая таблица содержит триггеры или индексы, они остаются прикрепленными к таблице после переименования. При этом, если имеются любые определения представлений или инструкции, выполняемые триггерами, которые ссылаются на переименовываемую таблицу, они не изменяются автоматически для использования нового имени таблицы. Если с переименованной таблицей связаны представления или триггеры, триггеры или определения представлений необходимо вручную удалить и создать повторно с новым именем таблицы.
Синтаксис ADD [COLUMN]
используется для добавления нового столбца в существующую таблицу. Новый столбец всегда добавляется в конец списка существующих столбцов. Предложение column-def
может принимать любые формы, допустимые в инструкции CREATE TABLE
, со следующими ограничениями:
PRIMARY KEY
или UNIQUE
.CURRENT_TIME
, CURRENT_DATE
или CURRENT_TIMESTAMP
.NOT NULL
, столбец должен иметь значение по умолчанию, отличное от NULL
.Объем данных в таблице не влияет на время выполнения инструкции ALTER TABLE
.
Инструкция DROP TABLE
удаляет таблицу, добавленную с помощью инструкции CREATE TABLE
. Таблица с указанным table-name
— это удаленная таблица. Она полностью удаляется из базы данных и с диска. Восстановить таблицу невозможно. Все связанные с таблицей индексы также удаляются.
По умолчанию инструкция DROP TABLE
не уменьшает размер файла базы данных. Пустой пространство в базе данных сохраняется и используется в последующих операциях INSERT
. Для удаления пустого пространства в базе данных служит метод SQLConnection.clean()
. Если параметру autoClean
присвоено значение true
при первоначальном создании базы данных, пространство высвобождается автоматически.
Необязательное предложение IF EXISTS
подавляет ошибку, которая обычно возникает, если таблица не существует.
Команда CREATE INDEX
состоит из ключевых слов CREATE INDEX
с именем нового индекса, ключевым словом ON
, именем ранее созданной таблицы, подлежащей индексации, и параметризованным списком имен столбцов в таблице, чьи значения используются для ключа индекса.
За каждым именем столбца должно следовать ключевое слово ASC
или DESC
для указания порядка сортировки, но обозначение порядка сортировки пропускается средой выполнения. Сортировка всегда выполняется по возрастанию.
Предложение COLLATE
после каждого имени столбца определяет параметры сортировки, применяемые к текстовым значениям в этом столбце. Параметры сортировки по умолчанию — это параметры сортировки, определенные для такого столбца в инструкции CREATE TABLE
. Если параметры сортировки не заданы, используются параметры сортировки BINARY
. Определение предложения COLLATE
и функций сортировки см. в разделе COLLATE.
Не существует произвольных пределов на число индексов, которые можно присоединить к отдельной таблице. Также отсутствуют пределы на число столбцов в индексе.
Инструкция удаления индекса позволяет удалить индекс, добавленный с помощью инструкции CREATE INDEX
. Указанный индекс полностью удаляется из файла базы данных. Единственным способом восстановления индекса является повторный ввод команды CREATE INDEX
.
По умолчанию инструкция DROP INDEX
не уменьшает размер файла базы данных. Пустой пространство в базе данных сохраняется и используется в последующих операциях INSERT
. Для удаления пустого пространства в базе данных служит метод SQLConnection.clean()
. Если параметру autoClean
присвоено значение true
при первоначальном создании базы данных, пространство высвобождается автоматически.
Команда CREATE VIEW
служит для назначения имени предопределенной инструкции SELECT
. Затем это имя можно использовать в предложении FROM
другой инструкции SELECT
вместо имени таблицы. Представления, как правило, служат для упрощения запросов путем объединения сложного (или часто используемого) набора данных в структуру, которую можно использовать в других операциях.
Если ключевое слово TEMP
или TEMPORARY
стоит между CREATE
и VIEW
, то создаваемое представление будет видимым только экземпляру SQLConnection, который открыл базу данных, и будет удалено при закрытии базы данных.
Если указан [database-name]
, то представление создается в именованной базе данных (базе данных, подключенной к экземпляру SQLConnection при помощи метода attach()
с указанным аргументом name
). Ошибочным будет указание [database-name]
и ключевого слова TEMP
, если [database-name]
не является temp
. Если имя базы данных не указано, а ключевое слово TEMP
присутствует, то представление создается в основной базе данных (базе данных, подключенной к экземпляру SQLConnection при помощи метода open()
или openAsync()
).
Представления доступны только для чтения. Инструкцию DELETE
, INSERT
или UPDATE
нельзя использовать с представлением, если не определен, по меньшей мере, один триггер связанного типа (INSTEAD OF DELETE
, INSTEAD OF INSERT
, INSTEAD OF UPDATE
). Дополнительные сведения о создании триггера для представления см. в разделе CREATE TRIGGER.
Для удаления представления из базы данных служит инструкция DROP VIEW
.
Инструкция DROP VIEW
удаляет представление, созданное с помощью инструкции CREATE VIEW
.
Указанный view-name
является именем удаляемого представления. Представление удаляется из базы данных, но данные в базовых таблицах не изменяются.
Инструкция создания триггера служит для добавления триггеров к схеме базы данных. Триггер — это операция базы данных (trigger-action
), выполняемая автоматически при возникновении заданного события базы данных (database-event
).
Триггер задается для запуска при возникновении события DELETE
, INSERT
или UPDATE
определенной таблицы базы данных, или при обновлении одного или нескольких заданных столбцов таблицы при помощи инструкции UPDATE
. Триггеры являются постоянными, если не используется ключевое слово TEMP
или TEMPORARY
. В таком случае триггер удаляется при закрытии подключения к основной базе данных экземпляра SQLConnection. Если время не указано (BEFORE
или AFTER
), триггер по умолчанию имеет значение BEFORE
.
Поддерживаются только триггеры FOR EACH ROW
, поэтому текст FOR EACH ROW
является необязательным. С триггером FOR EACH ROW
инструкции trigger-step
выполняются для каждой вставляемой, обновляемой или удаляемой при помощи инструкции строки базы данных, вызывая запуск триггера, если выражение предложения WHEN
получает значение true
.
При указании предложения WHEN
, инструкции SQL, указанные в качестве шагов триггера, выполняются только для строк, для которых предложение WHEN является истинным (true). Если предложение WHEN не указано, инструкции SQL выполняются для всех строк.
В теле триггера (предложение trigger-action
) значения до изменения и после изменения затронутой таблицы доступны при помощи специальных имен таблиц OLD
и NEW
. Структура таблиц OLD
и NEW
соответствует структуре таблицы, для которой создается триггер. Таблица OLD содержит любые строки, измененные или удаленные инструкцией триггера, и их состояние до операций инструкции триггера. Таблица NEW содержит любые строки, измененные или созданные инструкцией триггера, и их состояние после операций инструкции триггера. Как предложение WHEN
, так и инструкции trigger-step
могут обращаться к значениям из вставляемых, удаляемых или обновляемых строк посредством ссылок вида NEW.column-name
и OLD.column-name
, где column-name
— имя столбца из таблицы, с которой связан триггер. Доступность ссылок на таблицы OLD
и NEW
зависит от типа database-event
, обрабатываемого триггером:
INSERT
– NEW
являются допустимымиUPDATE
– NEW
и OLD
являются допустимымиDELETE
– OLD
являются допустимымиУказанное время (BEFORE
, AFTER
или INSTEAD OF
) определяет время выполнения инструкций trigger-step
относительно вставке, изменению или удалению связанной строки. Предложение ON CONFLICT
может быть указано в составе инструкции UPDATE
или INSERT
в trigger-step
. При этом если предложение ON CONFLICT
указано в составе инструкции, вызывающей запуск триггера, то вместо этого используется политика разрешения конфликтов.
Помимо триггеров таблиц, триггер INSTEAD OF
можно создать для представления. Если для представления определен один или несколько триггеров INSTEAD OF INSERT
, INSTEAD OF DELETE
или INSTEAD OF UPDATE
, выполнение связанного типа инструкции для представления не будет считаться ошибкой (INSERT
, DELETE
и UPDATE
). В этом случае выполнение INSERT
, DELETE
или UPDATE
для представления приводит к запуску связанных триггеров. Так как триггер является триггером INSTEAD OF
, таблицы в основе представления не изменяются инструкцией, запускающей триггер. При этом триггеры можно использовать для выполнения операций изменения с базовыми таблицами.
При создании триггера в таблице со столбцом INTEGER PRIMARY KEY
важно помнить об одном. Если триггер BEFORE
изменяет столбец INTEGER PRIMARY KEY
строки, которая подлежит обновлению инструкцией, вызывающей запуск триггера, обновление не происходит. Выходом может быть создание таблицы со столбцом PRIMARY KEY
вместо столбца INTEGER PRIMARY KEY
.
Триггер можно удалить с помощью инструкции DROP TRIGGER
. При удалении таблицы или представления, все триггеры, связанные с такой таблицей или представлением, также автоматически удаляются.
В инструкции trigger-step
триггера можно использовать специальную функцию SQL RAISE()
. Эта функция имеет следующий синтаксис:
Одна из трех форм вызывается во время выполнения триггера, выполняется указанное действие обработки ON CONFLICT
(ABORT
, FAIL
или ROLLBACK
) и выполнение текущей инструкции прекращается. ROLLBACK
считается ошибкой выполнения инструкции, поэтому экземпляр SQLStatement, чей метод execute()
выполнялся, выдает событие error
(SQLErrorEvent.ERROR
). Объект SQLError в свойстве error
выданного события объекта имеет свойство details
со значением error-message
, заданным в функции RAISE()
.
При вызове RAISE(IGNORE)
остальная часть текущего триггера, инструкция, вызвавшая выполнение триггера и любые последующие триггеры, которые должны были бы быть выполнены, пропускаются. Откат изменений базы данных не выполняется. Если инструкция, вызвавшая выполнение триггера сама является частью триггера, эта программа-триггер возобновляет выполнение с начала следующего шага. Дополнительные сведения об алгоритмах разрешения конфликтов см. в разделе ON CONFLICT (алгоритмы конфликтов).
Инструкция DROP TRIGGER
удаляет триггер, созданный с помощью инструкции CREATE TRIGGER
.
Триггер удаляется из базы данных. Следует помнить, что триггеры автоматически удаляются при удалении связанной с ними таблицы.
В этом разделе описано несколько предложений, представляющих собой расширения SQL, обеспечиваемые средой времени выполнения, а также два элемента языка, которые можно использовать во многих инструкциях, комментариях и выражениях. В этом разделе рассматриваются следующие элементы:
Предложение COLLATE используется в инструкциях SELECT
, CREATE TABLE
и CREATE INDEX
для указания алгоритма сравнения, используемого при сравнении или сортировке значений.
Для столбцов типом сортировки по умолчанию является BINARY
. При использовании сортировки BINARY
со значениями класса хранения TEXT
, двоичная сортировка выполняется путем сравнения байтов в памяти, представляющих значение, независимо от кодировки текста.
Параметры сортировки NOCASE
применяются только к значениями класса хранения TEXT
. При использовании сортировка NOCASE
выполняет независимое от регистра сравнение.
Параметры сортировки не используются для классов хранения типа NULL
, BLOB
, INTEGER
или REAL
.
Чтобы использовать тип сортировки, отличный от BINARY
со столбцом, в составе определения столбца в инструкции CREATE TABLE
необходимо указать предложение COLLATE
. Каждый раз при сравнении двух значений TEXT
, параметры сортировки используются для определения результатов сравнения по следующим правилам:
=
, <
, >
, <=
и >=
) если один из операндов является столбцом, то тип сортировки столбца по умолчанию определяет параметры сортировки, используемые для сравнения. Если оба операнда являются столбцами, то тип сортировки для левого операнда определяет используемые параметры сортировки. Если ни один из операндов не является столбцом, то используют параметры сортировки BINARY
.BETWEEN...AND
эквивалентен использованию двух выражений с операторами >=
и <=
. Например, выражение x BETWEEN y AND z
эквивалентно x >= y AND x <= z
. Таким образом, оператор BETWEEN...AND
следует описанному правилу для определения параметров сортировки.IN
по своему поведению напоминает оператор =
для целей определения используемых параметров сортировки. Например, параметры сортировки, используемые для выражения x IN (y, z)
, представляют тип сортировки по умолчанию для x
, если x
является столбцом. В противном случае, применяется сортировка BINARY
.ORDER BY
, являющемуся частью инструкции SELECT
, можно явно присвоить параметры сортировки, используемые для операции сортировки. В этом случае всегда используются явные параметры сортировки. И наоборот, если выражение, отсортированное предложением ORDER BY
, является столбцом, то тип сортировки по умолчанию для столбца используется для определения порядка сортировки. Если выражение не является столбцом, то используют параметры сортировки BINARY
.Модификатор команды EXPLAIN
является нестандартным расширением SQL.
Если ключевое слово EXPLAIN
указать после любой другой инструкции SQL, то вместо фактического выполнения команды результат выдаст последовательность инструкций виртуальной машины, которые бы использовались для выполнения команды, если бы ключевое слово EXPLAIN
отсутствовало. Функция EXPLAIN
— это дополнительная возможность, позволяющая разработчикам изменять текст инструкции SQL в попытке оптимизировать производительность или отладить инструкцию, которая работает неправильно.
Предложение ON CONFLICT
не является отдельной командой SQL. Это нестандартное предложение, которое может использоваться во многих других командах SQL.
Первая форма предложения ON CONFLICT
с ключевым словом ON CONFLICT
используется в инструкции CREATE TABLE
. Для инструкции INSERT
или UPDATE
используется вторая форма, где ON CONFLICT
заменяется OR
для придания более естественного вида синтаксису. Например, вместо INSERT ON CONFLICT IGNORE
используется инструкция INSERT OR IGNORE
. Несмотря на разные ключевые слова, значение предложения не меняется в обеих формах.
Предложение ON CONFLICT
задает алгоритм, используемый для разрешения конфликтов ограничений. Существует пять алгоритмов: ROLLBACK
, ABORT
, FAIL
, IGNORE
и REPLACE
. Алгоритм по умолчанию — ABORT
. Далее приводится описание пяти алгоритмов конфликтов:
ROLLBACK
, что завершает текущую транзакцию. Выполнение команды прекращается и экземпляр SQLStatement выдает событие error
. Если активной транзакции нет (кроме подразумеваемой транзакции, создаваемой для каждой команды), то этот алгоритм работает так же, как ABORT
.error
. ROLLBACK
не выполняется, поэтому изменения, внесенные предыдущими командами в транзакции, сохраняются. ABORT
— это поведение по умолчанию.error
. При этом любые изменения в базе данных, внесенные инструкцией до возникновения нарушения ограничения, сохраняются и не аннулируются. Например, если инструкция UPDATE
сталкивается с нарушением ограничения на 100-ой строке, которую она пытается обновить, то сохраняются только первые 99 строк и изменения 100-ой строки и последующих строк не происходят.UNIQUE
, ранее существующие строки, вызывающие нарушение ограничения, удаляются перед вставкой или обновлением текущей строки. Следовательно, вставки или обновление происходит всегда, и команда продолжает выполняться в обычном режиме. Ошибка не возвращается. При возникновении нарушения ограничения NOT NULL
значение NULL
заменяется значением по умолчанию для этого столбца. Если столбец не имеет значения по умолчанию, используется алгоритм ABORT
. Если возникает нарушение ограничения CHECK
, используется алгоритм IGNORE
. Когда строки удаляются этой стратегией разрешения конфликтов для удовлетворения ограничения, удаление триггеров в этих строках не вызывается.Алгоритм, заданный в предложении OR
инструкции INSERT
или UPDATE
, переопределяет любой алгоритм, указанный в инструкции CREATE TABLE
. Если в инструкции CREATE TABLE
или выполняющей инструкции INSERT
или UPDATE
алгоритм не указан, используется алгоритм ABORT
.
Команда REINDEX
служит для удаления и повторного создания одного или нескольких индексов. Эта команда полезна, когда определение параметров сортировки было изменено.
В первой форме все индексы в подключенных базах данных, использующих именованные параметры сортировки, создаются повторно. Во второй форме при указании table-name
происходит повторное построение всех индексов, связанных с таблицей. Если указан index-name
, то удаляется, а затем повторно создается только заданный индекс.
Комментарии не являются командами SQL, но могут содержаться в запросах SQL. Средой времени выполнения они воспринимаются как интервалы. Они могут начинаться в любом месте, где обнаружен интервал, в том числе внутри выражений, занимающих несколько строк.
Однострочный комментарий помечается двумя дефисами. Однострочный комментарий может простираться только до конца текущей строки.
Блоки комментариев могут распространяться на любое число строк или встраиваться в одну строку. Если завершающий разделитель отсутствует, блок комментариев простирается до конца ввода. Эта ситуация не считается ошибкой. Новая инструкция SQL может начинаться на строке после конца блока комментариев. Блоки комментариев можно встраивать в любое место, где имеется интервал, в том числе внутри выражений и в середине других инструкций SQL. Блоки комментариев не бывают вложенными. Однострочные комментарии внутри блока комментариев пропускаются.
Выражения представляют собой подкоманды внутри других блоков SQL. Ниже описан допустимый синтаксис выражения в инструкции SQL:
Выражение — это любое сочетание значений и операторов, которые могут приводить к одному значению. Выражения можно разделить на два основных типа согласно тому, приводят ли они к логическому (true или false) или не логическому значению.
В некоторых ситуациях (в предложении WHERE, предложении HAVING, выражении ON в предложении JOIN и выражении CHECK) выражение должно приводить к логическому значению. Этому условию удовлетворяют следующие типы выражений:
ISNULL
NOTNULL
IN ()
EXISTS ()
LIKE
GLOB
Числовые значения литерала записываются в виде целого числа или числа с плавающей запятой. Поддерживается экспоненциальное представление. Символ .
(точка) всегда используется в качестве десятичной точки.
Строковый литерал обозначается заключением строки в одинарные кавычки '
. Чтобы включить одинарные кавычки в строку, добавьте две одинарные кавычки в строку, например: ''
.
Логический литерал обозначается значением true
или false
. Логические значения литерала используются с логическим типом данных столбца.
Литерал BLOB представляет собой строковый литерал с шестнадцатиричными данными и символом x
или X
в начале, например: X'53514697465'
.
Значением литерала может также быть маркер NULL
.
Именем столбца может быть любое имя, определенное в инструкции CREATE TABLE
, или один из следующих специальных идентификаторов: ROWID
, OID
или _ROWID_
. Все эти специальные идентификаторы описывают уникальный произвольный ключ целых значений ("ключ строки"), связанный с каждой строкой каждой таблицы. Специальные идентификаторы относятся к ключу строки, только если инструкция CREATE TABLE
не определяет существующий столбец с тем же именем. Ключи строк действуют так же как столбцы только для чтения. Ключ строки можно использовать там, где можно использовать обычный столбец, однако значение ключа строки нельзя изменять в инструкции UPDATE
или INSERT
. Инструкция SELECT * FROM table
не содержит ключ строки в своем результирующем наборе.
Инструкция SELECT
может присутствовать в выражении в качестве правого операнда оператора IN
, скалярного количества (отдельное значение результата) или операнда оператора EXISTS
. При использовании в качестве скалярного количества или операнда оператора IN
, в результате SELECT
может быть только один столбец. Допускается составная инструкция SELECT
(соединенная ключевыми словами UNION
или EXCEPT
). С оператором EXISTS
столбцы в результирующем наборе SELECT
пропускаются, и выражение возвращает TRUE
, если существует одна или несколько строк, и FALSE
, если результирующий набор пуст. Если никакие условия в выражении SELECT
не ссылаются на значение в содержащем запросе, выражение вычисляется один раз перед любой другой обработкой и результат используется повторно по мере необходимости. Если в выражении SELECT
не содержатся переменные из внешнего запроса, известном как связанный вложенный запрос, SELECT
вычисляется повторно каждый раз, когда требуется.
Если SELECT
является правым операндом оператора IN
, оператор IN
возвращает TRUE
, если результат левого операнда равен любому из значений в результирующем наборе инструкции SELECT
. Оператору IN
может предшествовать ключевое слово NOT
для изменения значения теста.
Если SELECT
содержится внутри выражения и не является правым операндом оператора IN
, первая строка результата SELECT
становится значением, используемым в выражении. Если SELECT
выдает более одной строки результатов, все строки после первой пропускаются. Если SELECT
не выдает строк, значением SELECT
будет NULL
.
Выражение CAST
изменяет тип данных указанного значения на заданное. Указанный тип может быть любым непустым именем типа, допустимым для типа в определении столбца инструкции CREATE TABLE
. Подробные сведения см. в разделе Поддерживаемые типы данных.
В следующих разделах описаны дополнительные элементы SQL, которые можно использовать в выражениях:
Встроенные функции подразделяются на три основные категории:
Помимо этих функций существует специальная функция RAISE()
, которая используется для предоставления уведомления об ошибке в выполнении триггера. Эту функцию можно использовать только внутри тела инструкции CREATE TRIGGER
. Сведения о функции RAISE()
см. в разделе CREATE TRIGGER > RAISE().
Как и все ключевые слова в SQL, имена функций не зависят от регистра.
Статические функции выполняют операции со значениями из нескольких строк. Эти функции в основном используются в инструкциях SELECT
вместе с предложением GROUP BY
.
AVG(X) |
Возвращает среднее значение всех не NULL X в группе. Строковые и BLOB-значения, не похожие на числа, рассматриваются как 0. Результатом AVG() всегда является значение с плавающей запятой, даже если все входные значения — целые числа. |
|
Первая форма возвращает число раз, которое X не является NULL в группе. Вторая форма (с аргументом * ) возвращает общее число строк в группе. |
MAX(X) |
Возвращает максимальное значение всех значений в группе. Для определения максимального значения используется обычный порядок сортировки. |
MIN(X) |
Возвращает минимальное не NULL значение всех значений в группе. Для определения минимального значения используется обычный порядок сортировки. Если все значения в группе равны NULL , возвращается NULL . |
|
Возвращает сумму чисел всех не NULL значений в группе. Если все значения равны NULL , то SUM() возвращает NULL , а TOTAL() возвращает 0.0 . Результатом TOTAL() всегда является значение с плавающей запятой. Результатом SUM() является целочисленное значение, если все не NULL входные значения являются целыми числами. Если какое-либо входное значение для SUM() не является целым числом и не NULL , SUM() возвращает значение с плавающей запятой. Это значение может быть приблизительным числом верной суммы. |
В любой из предыдущих статических функций, принимающих отдельный аргумент, перед этим аргументом можно использовать ключевое слово DISTINCT
. В таком случае повторяющиеся элементы фильтруются перед передачей в статическую функцию. Например, вызов функции COUNT(DISTINCT x)
возвращает число неодинаковых значений столбца X, а не общее число не NULL
значений в столбце x
.
Скалярные функции выполняют операции со значениями по одной строке за раз. Ниже приводится список этих функций:
ABS(X) |
Возвращает абсолютное значение аргумента X . |
COALESCE(X, Y, ...) |
Возвращает копию первого не NULL аргумента. Если все аргументы равны NULL , возвращается NULL . Требуется, по меньшей мере, два аргумента. |
GLOB(X, Y) |
Эта функция служит для реализации синтаксиса X GLOB Y . |
IFNULL(X, Y) |
Возвращает копию первого не NULL аргумента. Если оба аргумента равны NULL , возвращается NULL . Эта функция действует так же, как COALESCE() . |
HEX(X) |
Аргумент рассматривается как значение типа хранения BLOB. Результатом является шестнадцатиричное отображение содержимого этого значения. |
LAST_INSERT_ROWID() |
Возвращает идентификатор (созданный первичный ключ) последней строки, вставленной в базу данных через текущий экземпляр SQLConnection. Это значение совпадает со значением, которое возвращает свойство SQLConnection.lastInsertRowID . |
LENGTH(X) |
Возвращает длину строки X в символах. |
LIKE(X, Y [, Z]) |
Эта функция служит для реализации синтаксиса SQL X LIKE Y [ESCAPE Z] . Если присутствует необязательное предложение ESCAPE , функция вызывается с тремя аргументами. В противном случае она вызывается только с двумя аргументами. |
LOWER(X) |
Возвращает копию строки X с преобразованием всех символов в строчные. |
|
Возвращает строку с удаленными пробелами слева от X . Если указан аргумент Y , функция удаляет любые символы в Y слева от X . |
MAX(X, Y, ...) |
Возвращает аргумент с максимальным значением. Аргументы могут представлять строки, добавленные к числам. Максимальное значение определяется заданным порядком сортировки. Следует отметить, что функция MAX() является простой, когда имеет 2 или более аргументов, но с одним аргументом является статической функцией. |
MIN(X, Y, ...) |
Возвращает аргумент с минимальным значением. Аргументы могут представлять строки, добавленные к числам. Минимальное значение определяется заданным порядком сортировки. Следует отметить, что функция MIN() является простой, когда имеет 2 или более аргументов, но с одним аргументом является статической функцией. |
NULLIF(X, Y) |
Возвращает первый аргумент, если аргументы отличаются; в противном случае возвращает NULL . |
QUOTE(X) |
Эта подпрограмма возвращает строку, которая представляет значение своего аргумента, подходящее для вставки в другую инструкцию SQL. Строки заключаются в одинарные кавычки с escape-символами во внутренних кавычках в зависимости от необходимости. Классы хранения BLOB кодируются в шестнадцатиричные литералы. Эту функция полезна при написании триггеров для реализации функций отмены или повтора действий. |
RANDOM(*) |
Возвращает псевдослучайное целое число из интервала -9223372036854775808 — 9223372036854775807. Это случайное значение не является стойким к шифрованию. |
RANDOMBLOB(N) |
Возвращает N -байтов объекта BLOB с псевдослучайными байтами. N должно быть положительным целым числом. Это случайное значение не является стойким к шифрованию. Если значение N является отрицательным, возвращается один байт. |
|
Округляет число X до Y знаков справа от десятичной точки. Если аргумент Y опущен, используется 0. |
|
Возвращает строку с удаленными пробелами слева от X . Если указан аргумент Y , функция удаляет любые символы в Y справа от X . |
SUBSTR(X, Y, Z) |
Возвращает подстроку входящей строки X , начинающейся с Y символа длиной Z символов. Крайний левый символ X представляет положение индекса 1. Если Y является отрицательным, первый символ подстроки находится путем подсчета справа, а не слева. |
|
Возвращает строку с удаленными пробелами слева и справа от X . Если указан аргумент Y , функция удаляет любые символы в Y слева и справа от X . |
TYPEOF(X) |
Возвращает тип выражения X . Возможные возвращаемые значения: "null", "integer", "real", "text" и "blob". Дополнительные сведения о типах данных см. в разделе Поддерживаемые типы данных. |
UPPER(X) |
Возвращает копию входящей строки X с преобразованием всех символов в прописные. |
ZEROBLOB(N) |
Возвращает BLOB с N байтами 0x00. |
Функции форматирования даты и времени представляют собой группу скалярных функций, используемых для создания форматированных данных даты и времени. Следует отметить, что эти функции работают со строковыми и числовыми значениями и возвращают их. Эти функции не предназначены для использования с типом данных DATE. Если их использовать с данными в столбце, объявленный тип данных которого — DATE, их поведение будет не таким, как требуется.
DATE(T, ...) |
Функция DATE() возвращает строку, содержащую дату в следующем формате: ГГГГ-ММ-ДД . Первый параметр (T ) задает строку времени формата, расположенного в разделе Форматы времени. После строки времени можно указать любое число модификаторов. Модификаторы расположены в разделе Модификаторы. |
||||||||||||||||||||||||||
TIME(T, ...) |
Функция TIME() возвращает строку, содержащую время в формате ЧЧ:ММ:СС. Первый параметр (T ) задает строку времени формата, расположенного в разделе Форматы времени. После строки времени можно указать любое число модификаторов. Модификаторы расположены в разделе Модификаторы. |
||||||||||||||||||||||||||
DATETIME(T, ...) | Функция DATETIME() возвращает строку, содержащую дату и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС. Первый параметр (T ) задает строку времени формата, расположенного в разделе Форматы времени. После строки времени можно указать любое число модификаторов. Модификаторы расположены в разделе Модификаторы. |
||||||||||||||||||||||||||
JULIANDAY(T, ...) | Функция JULIANDAY() возвращает число, обозначающее количество дней с полудня по Гринвичу 24 ноября 4714 до нашей эры и заданную дату. Первый параметр (T ) задает строку времени формата, расположенного в разделе Форматы времени. После строки времени можно указать любое число модификаторов. Модификаторы расположены в разделе Модификаторы. |
||||||||||||||||||||||||||
STRFTIME(F, T, ...) | Подпрограмма STRFTIME() возвращает дату по заданной строке формата в качестве первого аргумента F . Строка формата поддерживает следующие подстановочные знаки:
Второй параметр ( T ) задает строку времени формата, расположенного в разделе Форматы времени. После строки времени можно указать любое число модификаторов. Модификаторы расположены в разделе Модификаторы. |
Формат строки времени может быть любым из следующих:
ГГГГ-ММ-ДД | 2007-06-15 |
ГГГГ-ММ-ДД ЧЧ:ММ | 2007-06-15 07:30 |
ГГГГ-ММ-ДД ЧЧ:ММ:СС | 2007-06-15 07:30:59 |
ГГГГ-ММ-ДД ЧЧ:ММ:СС,ССС | 2007-06-15 07:30:59.152 |
ГГГГ-ММ-ДДTЧЧ:ММ | 2007-06-15T07:30 |
ГГГГ-ММ-ДДTЧЧ:ММ:СС | 2007-06-15T07:30:59 |
ГГГГ-ММ-ДДTЧЧ:ММ:СС,ССС | 2007-06-15T07:30:59.152 |
ЧЧ:ММ | 07:30 (дата: 2000-01-01) |
ЧЧ:ММ:СС | 07:30:59 (дата: 2000-01-01) |
ЧЧ:ММ:СС,ССС | 07:30:59:152 (дата: 2000-01-01) |
now | Текущая дата и время в формате UTC. |
ДДДД.ДДДД | День по юлианскому календарю в виде числа с плавающей запятой |
Символ T в этих форматах представляет буквенный символ "T", разделяющий дату и время. Форматы, включающие только время, предполагают дату 2001-01-01.
После строки времени может следовать ноль или несколько модификаторов, изменяющих дату или толкование даты. Доступны следующие модификаторы:
NNN дней | Число дней, прибавляемое к времени. |
NNN часов | Число часов, прибавляемое к времени. |
NNN минут | Число минут, прибавляемое к времени. |
NNN,NNNN секунд | Число секунд или миллисекунд, прибавляемое к времени. |
NNN месяцев | Число месяцев, прибавляемое к времени. |
NNN лет | Число лет, прибавляемое к времени. |
начало месяца | Смещение времени назад к началу месяца. |
начало года | Смещение времени назад к началу года. |
начало дня | Смещение времени назад к началу дня. |
день недели N | Смещение времени вперед на указанный день недели. (0 = воскресенье, 1 = понедельник и т.д.) |
localtime | Преобразование даты в местное время |
utc | Преобразование даты в формат UTC |
SQL поддерживает большое число операторов, включая распространенные операторы, существующие в большинстве языков программирования, а также несколько уникальных для SQL операторов.
Следующие двоичные операторы допускаются в блоке SQL и перечислены в порядке приоритета — от высшего до низшего:
Поддерживаются унарные префиксные операторы:
Оператор COLLATE
можно представить как унарный постфиксный оператор. Оператор COLLATE
имеет наивысший приоритет. Он всегда имеет более тесную привязку, чем префиксный унарный оператор или любой двоичный оператор.
Следует отметить, что существует две разновидности операторов равенства и неравенства. Равенство может иметь форму =
или ==
. Оператор неравенства может иметь вид !=
или <>
.
Оператор ||
является строковым оператором сцепления — он соединяет две строки своих операндов.
Оператор %
выдает остаток от деления правого операнда на левый операнд.
Результатом любого двоичного оператора является числовое значение, но это не относится к оператору сцепления ||
, который выдает строковый результат.
Оператор LIKE
выполняет сравнение шаблонов.
Операнд справа от оператора LIKE
содержит шаблон, а левые операнд содержит строку для соответствия шаблону. Символ процента (%
) в шаблоне представляет собой подстановочный знак и соответствует любой последовательности символов в строке (или отсутствию символов). Символ подчеркивания (_
) в шаблоне соответствует любому отдельному символу в строке. Любой другой символ соответствует самому себе или эквивалентному символу нижнего/верхнего регистра, то есть совпадения определяются вне зависимости от регистра. (Примечание. Ядро СУБД понимает только верхний/нижний регистр 7-битных символов латиницы. Следовательно, оператор LIKE
учитывает регистра для 8-битных символов iso8859 или символов UTF-8. Например, выражение 'a' LIKE 'A'
является TRUE
, но 'æ' LIKE 'Æ'
— FALSE
). Зависимость символов латинского алфавита от регистра можно изменить при помощи свойства SQLConnection.caseSensitiveLike
.
Если присутствует необязательное предложение ESCAPE
, то выражение после ключевого слова ESCAPE
должно приводить к строке, состоящей из одного символа. Этот символ можно использовать в шаблоне LIKE
для соответствия литеральному проценту или символам подчеркивания. Escape-знак после символа процента, символ подчеркивания или сам по себе соответствует символу литерального процента, символу подчеркивания или escape-знаку в строке, соответственно.
Оператор GLOB
похож на LIKE
, но использует синтаксис глобализации Unix-файла для своих подстановочных знаков. В отличие от LIKE
, GLOB
зависит от регистра.
Оператор IN
вычисляет, равен ли его левый операнд одному из значений правого операнда (набору значений в скобках).
Правый операнд может быть набором литеральных значений, разделенных запятыми, или результатом инструкции SELECT
. Описание и ограничения при использовании инструкций SELECT при использовании в качестве правого операнда оператора IN
см. в описании инструкций SELECT
.
Оператор BETWEEN...AND
эквивалентен использованию двух выражений с операторами >=
и <=
. Например, выражение x BETWEEN y AND z
эквивалентно x >= y AND x <= z
.
Оператор NOT является оператором отрицания. Перед операторами GLOB
, LIKE
и IN
можно поставить ключевое слово NOT
для обращения значения теста (другими словами, для проверки того, что значение не соответствует указанному шаблону).
Параметр указывает местозаполнитель в выражении для литерального значения, который заполняется во время выполнения путем присвоения значения ассоциативному массиву SQLStatement.parameters
. Параметры могут иметь три формы:
? |
Вопросительный знак обозначает индексированный параметр. Параметрам присваиваются числовые (на основе нуля) значения индекса согласно их порядку в инструкции. |
:AAAA |
Двоеточие с именем идентификатора обозначает место для именованного параметра с именем AAAA . Именованные параметры также нумеруются согласно своему порядку в инструкции SQL. Во избежание путаницы рекомендуется не совмещать именованные и нумерованные параметры. |
@AAAA |
Символ "@" эквивалентен двоеточию. |
Далее приводится список стандартных элементов SQL, которые не поддерживаются в Adobe AIR:
FOREIGN KEY
выполняется, но они не применяются.FOR EACH STATEMENT
не поддерживаются (все триггеры должны быть FOR EACH ROW
). Триггеры INSTEAD OF
не поддерживаются для таблиц (для представлений допускаются только триггеры INSTEAD OF
). Рекурсивные триггеры (вызывающие самих себя) не поддерживаются.RENAME TABLE
и ADD COLUMN
команды ALTER TABLE
. Другие типы операций ALTER TABLE
, такие как DROP COLUMN
, ALTER COLUMN
, ADD CONSTRAINT
и т.д., пропускаются.RIGHT OUTER JOIN
или FULL OUTER JOIN
не поддерживаются.DELETE
, INSERT
или UPDATE
. Триггер INSTEAD OF
, запускаемый при попытке выполнения DELETE
, INSERT
или UPDATE
для представления, поддерживается и может использоваться для обновления вспомогательных таблиц в теле триггера.GRANT
и REVOKE
, обычно существующие в клиентских/серверных реляционных СУБД, не реализованы.Следующие элементы SQL и возможности SQLite поддерживаются в некоторых реализациях SQLite, но не поддерживаются в Adobe AIR. Большая часть этих возможностей доступна через методы класса SQLConnection.
BEGIN
, END
, COMMIT
, ROLLBACK
): Следующие функции доступны через связанными с транзакциями методы класса SQLConnection: SQLConnection.begin()
, SQLConnection.commit()
и SQLConnection.rollback()
.ANALYZE
: Эта возможность доступна через метод SQLConnection.analyze()
.ATTACH
: Эта возможность доступна через метод SQLConnection.attach()
.COPY
: Эта инструкция не поддерживается.CREATE VIRTUAL TABLE
: Эта инструкция не поддерживается.DETACH
: Эта возможность доступна через метод SQLConnection.detach()
.PRAGMA
: Эта инструкция не поддерживается.VACUUM
: Эта возможность доступна через метод SQLConnection.compact()
.SQLConnection.loadSchema()
.SQLITE_VERSION()
: Функция sqlite_version()
не доступна для использования в инструкциях SQL.MATCH()
и REGEX()
). Эти функции не доступны в инструкциях SQL.Следующие возможности отличаются в различных реализациях SQLite и Adobe AIR:
Следующие типы сходства столбцов по умолчанию не поддерживаются в SQLite, но поддерживаются в Adobe AIR:
Следующие типы литеральных значений по умолчанию не поддерживаются в SQLite, но поддерживаются в Adobe AIR:
true
для работы со столбцами BOOLEAN.false
для работы со столбцами BOOLEAN.В отличие от большинства баз данных SQL, ядро СУБД SQL Adobe AIR не требует, чтобы значения в столбцах таблицы имени определенный тип. Наоборот, среда времени выполнения для управления типами данных использует две концепции: классы хранения и сходство столбцов. В этом разделе описаны классы хранения и сходство столбцов, а также то, как различия типов данных разрешаются в различных условиях:
Классы хранения представляют типы фактических данных, которые используются для хранения значений в базе данных. Доступны следующие классы хранения.
NULL
.Перед выполнением инструкции SQL всем значениям, передаваемым в базу данных в виде литералов, встроенных в инструкцию SQL, или значениям, привязанным при помощи параметров к подготовленной инструкции SQL, назначается класс хранения.
Литералам, являющимся частью инструкции SQL, назначается класс хранения TEXT, если они заключены в одинарные или двойные кавычки, INTEGER, если литерал указан в виде числа без кавычек и без десятичной точки или экспонента, REAL, если литерал представляет собой число без кавычек с десятичной точкой или экспонент, и NULL, если значение равно NULL. Литералы с классом хранения BLOB обозначаются как X'ABCD'
. Дополнительные сведения см. в разделе Значения литералов в выражениях.
Значениям, подставляемым в виде параметров при помощи ассоциативного массива SQLStatement.parameters
, назначается класс хранения, которые больше всего напоминает привязку к исходному типу данных. Например, значения int привязываются как класс хранения INTEGER, значениям Number назначается класс хранения REAL, значениям String — класс хранения TEXT, а объектам ByteArray — класс хранения BLOB.
Сходство столбца является рекомендуемым типом для данных в таком столбце. Если в столбце сохраняется значение (посредством инструкции INSERT
или UPDATE
), среда выполнения пытается преобразовать тип данных этого значение к заданному сходству. Например, если значение Date (экземпляр Date ActionScript или JavaScript) вставляется в столбец со сходством TEXT, значение Date преобразовывается в представление String (эквивалентно вызову метода toString()
объекта) перед сохранением в базе данных. Если значение не удается преобразовать к заданному сходству, возникает ошибка и операция не выполняется. При извлечении значения из базы данных при помощи инструкции SELECT
, оно возвращается в виде экземпляра класса, соответствующего сходству, независимо от того, было ли оно преобразовано из другого типа в момент сохранения.
Если столбец принимает значения NULL, значение null
ActionScript или JavaScript можно использовать как значение параметра для хранения NULL в столбце. При извлечении значения класса хранения NULL в инструкции SELECT
оно всегда возвращается как значение null
ActionScript или JavaScript независимо от сходства столбца. Если столбец принимает значения NULL, следует всегда проверять значения, извлекаемые из этого столбца, чтобы определить, равны ли они null
, прежде чем выполнить попытку приведения значения к ненулевому типу (такому как Number или Boolean).
Каждому столбцу в базе данных назначается одно из следующих сходств типа:
Столбец со сходством TEXT или STRING хранит все данные с использованием классов хранения NULL, TEXT или BLOB. Если в столбец вставляются данные со сходством TEXT, они преобразуются в текстовую форму перед сохранением.
Столбец со сходством NUMERIC содержит значения с использованием классов хранения NULL, REAL или INTEGER. При вставке текстовых данных в столбец NUMERIC, перед сохранением выполняется попытка их преобразования в целое число или вещественное число. Если преобразование выполняется успешно, значение сохраняется с использованием класса хранения INTEGER или REAL (например, значение '10.05'
преобразуется перед сохранением в класс хранения REAL). В случае невозможности выполнения преобразования происходит ошибка. Попытка преобразования значения NULL не выполняется. Значение, извлекаемое из столбца NUMERIC, возвращается как экземпляр самого специфического числового типа, в который подходит значение. Другими словами, если значение является положительным целым числом или 0, оно возвращается как экземпляр uint. Если оно представляет отрицательное целое число, то возвращается как экземпляр int. И, наконец, если в нем присутствует часть после запятой (не целое число), то оно возвращается как экземпляр Number.
По поведению столбец со сходством INTEGER напоминает столбец со сходством NUMERIC, но с одним исключением. Если сохраняемое значение является вещественным значением (таким как экземпляр Number) части после плавающей запятой, или если значение является текстом, которое можно преобразовать в вещественное значение с плавающей запятой, оно преобразуется в целое число и сохраняется с классом хранения INTEGER. При попытке сохранения вещественного значения с частью после плавающей запятой возникает ошибка.
Поведение столбца со сходством REAL или NUMBER аналогично поведению столбца со сходством NUMERIC, однако здесь целочисленные значения принудительно преобразуются в представление с плавающей запятой. Значение в столбце REAL всегда возвращается из базы данных в виде экземпляра Number.
Столбец со сходством BOOLEAN хранит истинные (true) или ложные (false) значения. Столбец BOOLEAN принимает значение, являющееся экземпляром Boolean ActionScript или JavaScript. При попытке кода сохранить значение String, String, длина которого превышает ноль, считается "true", а пустое значение String — "false". Если код попытается сохранить числовые данные, то любые ненулевые значения сохраняются как "true", а 0 как "false". При извлечении значения Boolean при помощи инструкции SELECT
, оно возвращается как экземпляр Boolean. Не-NULL значения хранятся с использованием класса хранения INTEGER (0 для "false" и 1 для "true") и преобразуются в объекты Boolean во время извлечения данных.
Столбец со сходством DATE хранит значения даты и времени. Столбец DATE может принимать значения, являющиеся экземплярами Date ActionScript или JavaScript Date. При попытке сохранить значение String в столбец DATE, среда выполнения попытает преобразовать его в юлианскую дату. В случае невозможности выполнения преобразования происходит ошибка. Если код попытается сохранить значение Number, int или uint, то попытка проверки данных не выполняется и значение считается допустимым значением даты по юлианскому календарю. При извлечении значения DATE при помощи инструкции SELECT
оно автоматически преобразуется в экземпляр Date. Значения DATE хранятся в виде значений юлианской даты с использованием класса хранения REAL, поэтому операторы сортировки и сравнения работают так, как требуется.
Столбец со сходством XML или XMLLIST содержит структуры XML. При попытке кода сохранить данные в столбце XML при помощи параметра SQLStatement среда выполнения попытается преобразовать и проверить значение с помощью функции ActionScript XML()
или XMLList()
. В случае невозможности преобразования значения в допустимый XML происходит ошибка. При попытке сохранения данных с использованием текстового значения SQL литерала (например, INSERT INTO (col1) VALUES ('
, разбор значения или проверка не выполняется, поскольку его форма считается правильной. Если сохранить недопустимое значение, то при извлечении оно возвращает пустой объект XML. Значение Data XML и XMLLIST Data сохраняется с использованием класса хранения TEXT или NULL.
Столбец со сходством OBJECT содержит сложные объекты ActionScript или JavaScript, включая экземпляры класса Object, а также экземпляры подклассов Object, такие как экземпляры Array и даже экземпляры пользовательских классов. Сериализация данных столбца OBJECT выполняется в формате AMF3 и они сохраняются с использованием класса хранения BLOB. При извлечении значения выполняется его десериализация из AMF3, и оно возвращается в виде экземпляра класса в том виде, в котором оно было сохранено. Следует отметить, что некоторые классы ActionScript, в особенности объекты представления, можно десериализовать как экземпляры их исходного типа данных. Прежде чем сохранять экземпляр пользовательского класса, необходимо зарегистрировать псевдоним класса при помощи метода flash.net.registerClassAlias()
(или в Flex, добавив к объявлению класса метаданные [RemoteObject]
). Кроме того, перед извлечением таких данных необходимо зарегистрировать такой же псевдоним для класса. Любые данные, правильную десериализацию которых невозможно выполнить по той причине, что класс изначально не поддается десериализации или псевдоним класса отсутствует или несогласован, возвращается как анонимный объект (экземпляр класса Object) со свойствами и значениями, соответствующими изначально сохраненному экземпляру.
Столбец со сходством NONE не различает классы хранения. Попытка преобразования данных перед вставкой не выполняется.
Сходство типа столбца определяется по объявленному типу столбца в инструкции CREATE TABLE
. При определении типа действуют следующие правила.
VARCHAR
содержит строку "CHAR" и ему назначается сходство TEXT.CREATE TABLE t AS SELECT...
, то тип данных для всех столбов не задается и им назначается сходство NONE.Поддерживаются операторы двоичного сравнения =
, <
, <=
, >=
и !=
, а также операция проверки заданного членства, оператор IN
и оператор троичного сравнения BETWEEN
. Подробные сведения об этих операторах см. в разделе Операторы.
Результат сравнения зависит от классов хранения двух сравниваемых значений. При сравнении двух значений действуют следующие правила.
При выполнении двоичных сравнений классов хранения числа и текста, перед выполнением преобразования база данных пытается преобразовать значения (если требуется). При сравнении классов хранения числа и текста действуют следующие правила (Примечание. Термин выражение, используемый в описанных далее правилах, включает любое скалярное выражение SQL или литерал, отличный от значения столбца. Например, если X
и Y.Z
представляют имена столбцов, то +X
и +Y.Z
считаются выражениями):
Троичный оператор BETWEEN
всегда преобразуется в качестве эквивалента двоичному выражению. Например, a BETWEEN b AND c
преобразуется к a >= b AND a <= c
, даже если это означает, что разные сходства применяются к a
при каждом сравнении, необходимом для вычисления выражения.
Выражения типа a IN (SELECT b ....)
следуют трем правилам, перечисленным ранее для двоичного сравнения, то есть, аналогичны a = b
. Например, если b
— значение столбца, а a
— выражение, то сходство b
применяется к a
перед любым сравнением. Выражение a IN (x, y, z)
преобразуется к a = +x OR a = +y OR a = +z
. Значения справа от оператора IN
(в приведенном примере это значения x
, y
и z
) считаются выражениями, даже если они являются значениями столбца. Если значение слева от оператора IN
является столбцом, то используется сходство этого столбца. Если значение является выражением, то преобразование не происходит.
На порядок выполнения сравнений может также влиять предложение COLLATE
. Дополнительные сведения см. в разделе COLLATE.
По каждому из поддерживаемых математических операторов *
, /
, %
, +
и -
применяется числовое сходство к каждому операнду перед вычислением выражения. Если какой-либо операнд не удается успешно преобразовать в класс хранения NUMERIC, результатом выражения будет NULL
.
При использовании оператора сцепления ||
каждый операнд преобразуется в класс хранения TEXT перед вычислением выражения. Если какой-либо операнд не удается преобразовать в класс хранения NUMERIC, результатом выражения будет NULL
. Невозможность преобразования значения может возникать в двух случаях: если значение операнда равно NULL
, или есть это объект BLOB с классом хранения, отличным от TEXT.
При сортировке значений при помощи предложения ORDER BY
, на первое место ставится класс хранения NULL. Затем следуют значения INTEGER и REAL в числовом порядке, далее значения TEXT в двоичном порядке или в зависимости от заданной сортировки (BINARY
или NOCASE
). Завершают список значения BLOB в двоичном порядке. Перед сортировкой преобразования классов хранения не выполняется.
При группировке значений с помощью предложение GROUP BY
, значения с различными классами хранения считаются разными. Исключением являются значения INTEGER и REAL, которые считаются равными, если их числа эквиваленты. Предложение GROUP BY
не приводит к применению сходства к каким-либо значениям.
Составные операторы SELECT
— UNION
, INTERSECT
и EXCEPT
— выполняют неявное сравнение значений. Перед выполнением этих сравнений к каждому значению может применяться сходство. Такое же сходство (если имеется) применяется ко всем значениям, которые могут быть возвращены в отдельном столбце результирующего набора составной инструкции SELECT
. Применяемое сходство является сходством столбца, возвращаемого первым компонентом инструкции SELECT
, имеющим значение столбца (а не какой-либо другой тип выражения) в этом положении. Если для заданного столбца составной инструкции SELECT
ни один из компонентов инструкции SELECT
не возвращает значение столбца, сходство не применяется к значениям из этого столбца перед их сравнением.
В определениях выражений в этом документе использовались следующие обозначения.
ВЕРХНИЙ РЕГИСТР
— ключевые слова SQL литерала написаны в верхнем регистренижний регистр
— термины местозаполнителей или имена предложений записаны в нижнем регистре::=
— обозначает определение предложения или выражения|
— символ прямой черты используется между альтернативными параметрами и может читаться как "или"[]
— элементы в квадратных скобках являются необязательными; в квадратные скобки может быть заключен один элемент или набор альтернативных элементов()
— круглые скобки, в которых заключены альтернативные варианты (набор элементов, разделенных символами прямой черты) обозначает обязательную группу элементов, то есть, набор элементов, которые являются возможными значениями отдельного обязательного элемента
Квантификаторы
+
— знак плюса после элемента в круглых скобках означает, что предшествующий ему элемент может встречаться 1 или более раз*
— символ звездочки после элемента в квадратных скобках означает, что предшествующий ему (заключенный в скобки) элемент может встречаться 0 или более раз*
— символ звездочки в имени столбца или между круглыми скобками после имени функции обозначает символ звездочки, а не квантификатора "0 или более".
— символ точки представляет точку литерала,
— символ запятой представляет запятую литерала()
— пара круглых скобок, в которые заключено отдельное предложение или элемент обозначает, что скобки являются обязательными символами скобок литерала.