![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
SQLite понимает этих операторов, перечисленных в порядке
precedence1 COLLATE это одноместный постфиксный оператор, который назначает
последовательность сопоставления выражению.
Последовательность сопоставления, установленная оператором COLLATE, отвергает
последовательность сопоставления, определенную пунктом COLLATE в
определении столбца таблицы.
Посмотрите детальное обсуждение
сопоставления последовательностей здесь
для изучения подробностей. Унарный оператор + ничего не
делает. Это может быть применено к последовательностям, числам, blob или
NULL, всегда возвращает результат с тем же значением, как операнд. Обратите внимание на то, что есть два варианта операторов равенства и
неравенства. Равняется может быть
= или
==.
Неравенство может быть также
!= или
<>.
|| это "concatenate",
это объединяет две строки своих операндов.
-> и
->> это "extract",
они извлекают компонент RHS из LHS. Для примера см.
здесь. %
приводит
оба своих операнда к типу INTEGER
и затем вычисляет остаток после деления левого целого числа на правое.
Другие арифметические операторы выполняют арифметику целого числа,
если оба операнда целые числа, и никакое переполнение не произойдет, или
арифметику с плавающей точкой IEEE Standard 754, если операнд действительное
значение или арифметика целого числа произвела бы переполнение. Результат любого бинарного оператора это
числовое значение или NULL, за исключением оператора связи
|| и операторов извлечения
-> и
->>,
которые оценивают к NULL или к текстовому значению. Все операторы обычно оценивают к NULL, когда любой операнд
NULL за определенными исключениями, как указано ниже.
Это в соответствии со стандартом SQL92. Когда соединено с NULL: IS и
IS NOT работают подобно
= и
!=,
кроме тех случаев, когда один или оба из операндов NULL. В этом случае, если
оба операнда NULL, то оператор IS оценивается к 1 (true), IS NOT оценивается
к 0 (false). Если один операнд NULL, а другой нет,
то оператор IS оценивается к 0 (false), IS NOT оценивается к 1 (true).
Невозможно IS или IS NOT оценить как NULL.
IS NOT DISTINCT FROM
является альтернативным правописанием для оператора
IS.
Аналогично IS DISTINCT FROM
имеет в виду то же самое, как IS NOT.
Стандартный SQL не поддерживает компактный вариант IS и IS NOT.
Эти компактные формы это расширение SQLite. Необходимо использовать
намного менее удобочитаемое IS NOT DISTINCT FROM и
IS DISTINCT FROM в других системах SQL.
Литеральное значение представляет константу. Литеральные значения могут
быть целыми числами, числами с плавающей точкой, последовательностями,
BLOB или NULL. Синтаксис для целого числа и литералов
с плавающей точкой (коллективно "числовые литералы")
показывает следующая диаграмма: Если у числового литерала есть десятичная точка или пункт возведения в
степень, если это меньше -9223372036854775808 или больше
9223372036854775807, то это литерал с плавающей точкой.
Иначе он буквальное целое число. Символ "E", который начинает пункт
возведения в степень литерала с плавающей точкой, может быть верхним
или нижним регистром. Символ "." всегда используется в качестве десятичной
точки, даже если урегулирование места действия определяет ","
для этой роли, использование ","
для десятичной точки привело бы к синтаксической двусмысленности.
Шестнадцатеричные литералы целого числа следуют нотации языка C
"0x" или "0X", сопровождаемого шестнадцатеричными цифрами.
Например, 0x1234 означает то же самое, как 4660,
0x8000000000000000 это -9223372036854775808.
Шестнадцатеричные литералы целого числа интерпретируются как 64-битные
two's-дополнительные целые числа и таким образом ограничиваются шестнадцатью
значащими цифрами точности. Поддержка шестнадцатеричных целых чисел была
добавлена в SQLite version 3.8.6 (2014-08-15).
Для совместимости шестнадцатеричная нотация "0x"
целого числа понята только языковым анализатором SQL, не правилами
преобразований типов. Строковые переменные, которые содержат текст,
отформатированный как шестнадцатеричные целые числа, не интерпретируются как
шестнадцатеричные целые числа, переводя значения
последовательности в целое число из-за
выражения CAST или для близости
столбцов до выполнения числовой операции или для любых других
преобразований во время выполнения. Когда преобразование последовательности
оценивается в формате шестнадцатеричного целого числа в целочисленное
значение, процесс преобразования останавливается, когда символ
'x' замечен, так что получающееся целочисленное значение всегда ноль.
SQLite понимает только шестнадцатеричную нотацию
целого числа, когда появляется в тексте SQL-оператора, но не когда
это появляется как часть содержания базы данных. Строковая константа сформирована, приложив последовательность в одинарных
кавычках ('). Одинарная кавычка в последовательности может быть закодирована,
поместив две одинарных кавычки подряд, как в Pascal.
Экранировка C-стиля, используя символ наклонной черты влево не
поддерживается, потому что это не стандартный SQL. Литералы BLOB это строковые литералы, содержащие шестнадцатеричные данные,
предваренные одним символом "x" или "X". Например: X'53514C697465'. Литеральное значение может также быть токеном "NULL". Символ "переменной" или "параметра" определяет
заполнитель в выражении для значения, которое заполнено во время
выполнения, используя sqlite3_bind().
Параметры могут принять несколько форм: Параметры, которым не назначают значения через
sqlite3_bind(), рассматривают как NULL.
sqlite3_bind_parameter_index() может использоваться, чтобы перевести
символическое название параметра в его эквивалентный числовой индекс. Максимальный номер параметра определяется во время компиляции макросом
SQLITE_MAX_VARIABLE_NUMBER.
Отдельное соединение с базой данных D может
сократить свое максимальное количество параметров
ниже максимума времени компиляции с использованием
sqlite3_limit(D,
SQLITE_LIMIT_VARIABLE_NUMBER,...). Оператор LIKE делает сравнение сопоставления с образцом.
Операнд направо от оператора LIKE содержит образец, и левый операнд содержит
последовательность, чтобы соответствовать. Символ процента ("%") в шаблоне
LIKE соответствует любой последовательности из ноля или большего количества
знаков в последовательности. Подчеркивание ("_") в шаблоне LIKE
соответствует любому отдельному символу в последовательности. Любой другой
символ соответствует себе или его эквивалентному нижнему/верхнему регистру
(то есть, нечувствительное к регистру соответствие).
ВАЖНО: SQLite понимает верхний/нижний регистр только для знаков ASCII
по умолчанию. Оператор LIKE чувствительный к регистру по умолчанию для
unicode-знаков, которые вне диапазона ASCII. Например, выражение
'a' LIKE 'A' = TRUE, но
'æ' LIKE 'Æ' = FALSE.
Расширение ICU к SQLite включает расширенную версию оператора LIKE, который
действительно обрабатывает все unicode-знаки. Если есть ESCAPE, то выражение после ключевого слова ESCAPE должно
оцениться к последовательности, состоящей из отдельного символа.
Этот символ может использоваться в образце LIKE, чтобы включать буквальный
процент или символы подчеркивания. Символ ESC, сопровождаемый символом
процента (%), подчеркивания (_) или вторым экземпляром
самого символа ESC соответствует буквальному символу процента, подчеркивания
или единственному символу ESC, соответственно. Оператор LIKE осуществляется, вызывая определенные применением функции SQL
like(Y,X) или
like(Y,X,Z). Оператор LIKE может быть сделан чувствительным к регистру использованием
case_sensitive_like pragma. Оператор GLOB подобен LIKE, но использует синтаксис файла Unix
globbing для его подстановочных знаков. Кроме того, GLOB чувствительный
к регистру, в отличие от LIKE. GLOB и LIKE может предшествовать
NOT, чтобы инвертировать смысл теста. Оператор GLOB осуществляется, вызывая
функцию glob(Y,X)
и может быть изменен, отвергнув ту функцию. Оператор REGEXP это специальный синтаксис для
функции пользователя regexp(). Никакой функции пользователя regexp() не
определяется по умолчанию и таким образом, использование оператора REGEXP
будет обычно приводить к сообщению об ошибке. Если
определенная применением функция SQL "regexp"
будет добавлена во время выполнения, то оператор "X REGEXP Y"
будет осуществлен как вызов "regexp(Y,X)". Оператор MATCH это специальный синтаксис для
определенной применением функции match(). По умолчанию реализация функции
match() поднимает исключение и ни для чего не полезна. Но расширения могут
перекрыть match() с более полезной логикой. Операторы извлечения действуют как специальный синтаксис для функций
"->"() и "->>"(). Реализации по умолчанию для этих функций выполняют
извлечение субкомпонента JSON, но расширения
могут отвергнуть их для других целей. Оператор BETWEEN логически эквивалентен паре сравнений.
"x BETWEEN y AND z" эквивалент
"x>=y AND x<=z"
за исключением того, что с BETWEEN выражение x оценено только однажды.
Выражение CASE служит роли, подобной IF-THEN-ELSE
на других языках программирования. Дополнительное выражение, которое происходит между ключевым словом CASE и
первым ключевым словом WHEN, называют "основным". Есть две фундаментальных
формы выражения CASE: с основным выражением и без. В CASE без основного выражения оценено каждое выражение WHEN, и результат
рассматривается как boolean, начиная с крайнего левого и далее вправо.
Результат выражения CASE это оценка выражения THEN, которое соответствует
первому выражению WHEN, которое оценивается к true.
Или, если ни одно из выражений WHEN не оценивается к true,
результат оценки выражения ELSE, если таковой имеется.
Если нет никакого выражения ELSE, и ни одно из выражений WHEN не верно,
то полный результат NULL. Результат NULL считают неверным, оценивая условия WHEN. В CASE с основным выражением основное выражение оценено только однажды, и
результат сравнен с оценкой каждого выражения WHEN слева направо.
Результат выражения CASE это оценка выражения THEN, которое соответствует
первому выражению WHEN, для которого сравнение верно. Или, если ни одно из
выражений WHEN не оценивается к значению, равному основному выражению,
результат оценки выражения ELSE, если таковой имеется.
Если нет никакого выражения ELSE, и ни одно из выражений WHEN не приводит к
результату, равному основному выражению, полный результат NULL. Сравнивая основное выражение с выражением WHEN, та же самая
последовательность сопоставления, близость и правила обработки NULL
применяются, как будто основное выражение и выражение WHEN
соответственно левый и правый операнды оператора =. Если основное выражение NULL, тогда результат CASE всегда результат
оценки выражения ELSE, если это существует, или NULL, если это не так. Единственная разница между следующими двумя выражениями CASE это то, что
x оценено точно однажды в первом примере, но могло бы быть оценено
многократно во втором: Встроенная SQL-функция iif(x,y,z)
логически эквивалентна "CASE WHEN x THEN y ELSE z END". iif() найдена в SQL
Server и включена в SQLite для совместимости.
Некоторые разработчики предпочитают iif() потому, что это более кратко.
Операторы IN и NOT IN берут выражение слева и список значений или
подзапрос справа. Когда правый операнд IN или NOT IN это подзапрос,
у него должно быть то же самое количество колонок, как
в row value левого операнда.
Подзапрос справа от IN или NOT IN
должен быть скалярным подзапросом, если левое выражение не
row value.
Если правый операнд IN или NOT IN это список значений, каждое из них
должно быть скаляром, и левое выражение должно также быть скаляром.
Правая сторона IN или NOT IN может быть именем таблицы или
табличной функции, в этом случае правая
сторона, как понимают, является подзапросом формы
"(SELECT * FROM name)". Когда правый операнд это пустое множество,
результат IN = false, результат NOT IN = true,
независимо от левого операнда и даже если левый операнд NULL. Результат IN или NOT IN определяется следующей матрицей: Обратите внимание на то, что SQLite позволяет введенному списку скалярных
величин на правой стороне IN или NOT IN быть пустым списком, но большинство
других систем базы данных SQL и стандарт SQL92 требуют, чтобы список содержал
по крайней мере один элемент. Имя столбца может быть любым из имен, определенных в
CREATE TABLE
или одним из следующих специальных идентификаторов: "ROWID",
"OID" или "_ROWID_".
Три специальных идентификатора описывают уникальный ключ целого числа
(rowid),
связанный с каждой строкой таблицы и недоступны на таблицах
WITHOUT ROWID.
Специальные идентификаторы относятся только к ключу строки, если
CREATE TABLE
не определяет реальную колонку с тем же самым именем. rowid может
использоваться где угодно, где используется имя столбца. Оператор EXISTS всегда оценивается к одному из целочисленных значений 0
или 1. Если выполнение оператора SELECT, определенного как правый операнд
оператора EXISTS, возвратило бы одну или несколько строк, тогда оператор
EXISTS оценивается к 1. Если выполнение SELECT не возвратило бы
строк вообще, тогда оператор EXISTS оценивается к 0. Количество колонок в каждой строке из SELECT
(если таковые имеются) и определенные возвращенные значения
не имеет никакого эффекта на результаты оператора EXISTS. В частности строки,
содержащие значения NULL, не обработаны по-другому по сравнению со строками
без значений NULL.
SELECT, приложенный в круглых скобках,
является подзапросом. Все типы оператора SELECT, включая совокупные и
составные запросы Select (запросы с ключевыми словами UNION или EXCEPT)
позволены как скалярные подзапросы. Значение выражения подзапроса это
первая строка результата вложенного SELECT.
Значение выражения подзапроса NULL, если вложенный
SELECT не вернул строк. Подзапрос, который возвращает отдельный столбец, является скалярным
подзапросом и может использоваться где угодно.
Подзапрос, который возвращает две или больше колонки, является подзапросом
row value
и может использоваться только в качестве операнда оператора сравнения или как
значение в UPDATE SET, у списка имен столбца которого есть тот
же самый размер.
SELECT, используемый в качестве скалярного
подзапроса или в качестве правого операнда IN, NOT IN или EXISTS,
может содержать ссылки на колонки во внешнем запросе. Такой подзапрос
известен как связанный подзапрос. Связанный подзапрос переоценен каждый раз,
когда его результат требуется. Некоррелированый подзапрос оценен только
однажды и результат снова использован по мере необходимости.
Выражение CAST формы "CAST(expr AS type-name)"
используется, чтобы преобразовать expr в другой
класс хранения
type-name. Преобразование CAST подобно
преобразованию, которое происходит, когда
близость колонки применяется к
значению за исключением того, что с оператором CAST преобразование всегда
происходит, даже если преобразование с потерями и необратимо, тогда как
близость колонки изменяет тип данных только
если изменение без потерь и обратимо. Если значение expr = NULL, результат CAST тоже NULL.
Иначе класс памяти результата определяется, применяя
правила для определения близости колонки
к type-name. Преобразование INTEGER или REAL в TEXT транслирует значение как
sqlite3_snprintf()
за исключением того, что получающийся TEXT использует
кодировку
соединения с базой данных. Затем самый длинный префикс значения, который может интерпретироваться
как вещественное число, извлечен из TEXT, остаток игнорируется.
Любые ведущие пробелы в TEXT тоже игнорируются. Если нет никакого префикса,
который может интерпретироваться как вещественное
число, результат преобразования 0.0. Затем самый длинный префикс значения, который может интерпретироваться
как целое число, извлечен из TEXT, остаток игнорируется.
Любые ведущие пробелы в TEXT тоже игнорируются. Если нет никакого префикса,
который может интерпретироваться как integer, результат преобразования 0.
Если префикс больше +9223372036854775807, результат точно
+9223372036854775807. Точно так же, если целое число префикса меньше
-9223372036854775808, результат -9223372036854775808. Конвертируя к INTEGER, если текст похож на значение с плавающей точкой с
экспонентой, экспонента будет проигнорирована, потому что это не входит в
префикс целого числа. Например, "CAST('123e+5' AS INTEGER)" = 123, не
12300000. Оператор CAST понимает десятичные целые числа только,
преобразование hexadecimal integers
остановится на "x" в префиксе "0x" шестнадцатеричной последовательности
целого числа, и таким образом результат CAST всегда ноль. Преобразование REAL в INTEGER приводит к целому числу между значением
REAL и 0, которое является самым близким к значению REAL.
Если REAL больше, чем самое большое целое число со знаком
(+9223372036854775807), результат самое большое целое число со знаком, если
REAL меньше, чем наименее возможное целое число со знаком
(-9223372036854775808), результат наименьшее возможное целое
число со знаком. До SQLite version 3.8.2 (2013-12-06)
преобразование REAL больше +9223372036854775807.0 в integer
приводило к самому отрицательному целому числу -9223372036854775808.
Это поведение предназначалось, чтобы подражать поведению оборудования
x86/x64, делая эквивалентное преобразование. Преобразование REAL или INTEGER в NUMERIC ничего не делает,
даже если действительное значение могло бы быть без потерь
преобразовано в целое число. Обратите внимание на то, что следствие трансляции любого не-BLOB в
BLOB и трансляции любого BLOB в не-BLOB
может отличаться в зависимости от того, является ли
кодировка UTF-8,
UTF-16be или UTF-16le.
Язык SQL показывает несколько контекстов, где выражение оценено,
и результат преобразовывается в булево значение
(true или false). Эти контексты: Чтобы преобразовать результаты SQL-выражения к булеву значению, SQLite
сначала переводит результат к NUMERIC таким же образом, как
CAST.
Числовое нулевое значение (целочисленное значение 0 или действительное
значение 0.0) считается false. NULL все еще NULL.
Все другие значения считают true. Например, значения NULL, 0.0, 0, 'english' и '0'
все считаются false. Значения 1, 1.0, 0.1, -0.1 и '1english' true. С SQLite 3.23.0 (2018-04-02), SQLite признает идентификаторы
"TRUE" and "FALSE" как литералы boolean, если и только если те идентификаторы
уже не используются для некоторого другого значения. Если там уже существует
колонки или таблицы или другие объекты под названием TRUE или FALSE,
то ради совместимости TRUE и FALSE относятся к тем другим объектам, а
не к булевым значениям. Булевы идентификаторы TRUE и FALSE обычно просто псевдонимы для
целочисленных значений 1 и 0, соответственно. Однако, если TRUE или FALSE
происходит на правой стороне оператора IS, то оператор IS оценивает левый
операнд как булево значение и дает соответствующий ответ.
SQLite поддерживает многие простые,
совокупные и
оконные функции SQL.
В целях представления простые функции далее подразделены на
основные функции,
функции даты и времени,
математические функции и
функции JSON. Приложения могут добавить новые
функции, написанные на C/C++, используя
sqlite3_create_function(). Главная диаграмма выражения выше показывает единственный синтаксис для
всех вызовов функции. Но это должно просто упростить диаграмму пузыря
выражения. В действительности у каждого типа функции есть немного
отличающийся синтаксис, показанный ниже.
Синтаксис вызова функции, показанный в главной диаграмме пузыря выражения,
является союзом этих трех синтаксисов, показанных здесь:
aggregate-function-invocation: Пункт OVER требуется для
функций окна
и запрещается иначе. Ключевое слово DISTINCT и пункт ORDER BY позволены
только в агрегатных функциях.
Пункт FILTER может не появиться в
простой функции. Возможно иметь агрегатную функцию с тем же самым именем как простая
функция, пока количество аргументов для двух форм функции отличается.
Например, max() с
отдельным аргументом это совокупность и
max()
с двумя или больше аргументами это простая функция. Агрегатные функции могут
обычно также использоваться в качестве функций окна.
Choose any three.
1. Синтаксис
2.
Операторы и затрагивающие разбор признаки
(от начала до конца / самый
высокий к самому низкому):
Операторы 2
~ [expr]
+ [expr]
- [expr]
[expr]
COLLATE (collation-name) 3
|| -> ->>
* / %
+ -
& | << >>
[expr]
ESCAPE [escape-character-expr] 4
< > <= >=
= == <> != IS IS NOT
IS DISTINCT FROM IS NOT DISTINCT FROM
[expr] BETWEEN5 [expr] AND [expr]
IN5 MATCH5 LIKE5 REGEXP5 GLOB5
[expr] ISNULL
[expr] NOTNULL
[expr] NOT NULL
нетT [expr]
AND OR
Операторы без "[expr]"
дополнение двоичное и левоассоциативное.
Это можно связать только с предыдущим выражением
[expr] LIKE [expr].
NOT, сохраняя предшествование и
ассоциативность голого оператора.
AND будет 0 (false),
когда другой операнд false,
OR будет 1 (true),
когда другой операнд true.3.
Литеральные значения (константы)
4. Параметры
?NNN
Вопросительный знак, сопровождаемый числом NNN, место для NNN-го
параметра. NNN должен быть между 1 и
SQLITE_MAX_VARIABLE_NUMBER
. ?
Вопросительный знак, который не сопровождается числом, создает параметр с
номером на один больше, чем самый большой номер уже назначенного параметра.
Если это означает, что номер параметра больше, чем
SQLITE_MAX_VARIABLE_NUMBER,
это ошибка. Этот формат параметра обеспечивается для совместимости с другими
ядрами базы данных. Но потому что легко просчитать вопросительные знаки,
использованию этого формата параметра препятствуют. Программисты поощряются
использовать один из символических форматов ниже или формат ?NNN. :AAAA
Двоеточие, сопровождаемое именем идентификатора, место для
названного параметра
с именем :AAAA. Названные параметры также пронумерованы. Назначенное число
на один больше, чем самый большой уже назначенный номер параметра.
Если это означает, что параметру назначили бы число, больше
SQLITE_MAX_VARIABLE_NUMBER,
это ошибка. Чтобы избежать беспорядка, лучше избегать смешивать
названные и пронумерованные параметры. @AAAA
Символ "at" работает точно как двоеточие, за исключением того,
что название созданного параметра @AAAA. $AAAA
Знак доллара, сопровождаемый именем идентификатора, также
место для названного параметра с именем $AAAA.
Имя идентификатора в этом случае может включать одни или более "::" и
суффикс, приложенный в "(...)", содержащий любой текст вообще.
Этот синтаксис это форма имени переменной на
Tcl.
Присутствие этого синтаксиса следует из того, что SQLite действительно
расширение Tcl. 5.
LIKE, GLOB, REGEXP, MATCH и операторы извлечения
6. Оператор BETWEEN
7. Выражение CASE
8.
Операторы IN и NOT IN
Левый операнд
NULL
Правый операнд
содержит NULL
Правый операнд
пустое множество
Левый операнд есть
в правом операнде
Результат
IN
Результат
NOT INнет
нет
нет
нет
false
true не имеет значения
нет
да
нет
false
true нет
не имеет значения
нет
да
true
false нет
да
нет
нет
NULL
NULL да
не имеет значения
нет
не имеет значения
NULL
NULL 9. Названия столбца таблицы
10. Оператор EXISTS
11. Выражения подзапросов
12.
Связанные подзапросы
13. Выражение CAST
Близость
Конверсионная обработка NONE
Приводит значение к type-name
без близости, заставляет значение быть преобразованным в BLOB.
Приведение к BLOB состоит из первого приведения значения к TEXT в
кодировке
соединения с базой данных, затем интерпретируя получающуюся
последовательность байт как BLOB вместо TEXT. TEXT
Для конвертации BLOB в TEXT
последовательность байтов, которые составляют BLOB, интерпретируется как
текст с использованием кодирования базы данных.
REAL
Для преобразования BLOB в REAL, значение
сначала преобразовывается в TEXT.
INTEGER
Для конвертации BLOB в INTEGER, значение
сначала конвертируется в TEXT.
NUMERIC
Трансляция TEXT или BLOB в NUMERIC
приводит к результату INTEGER или REAL. Если входной текст похож на целое
число (нет никакой десятичной точки или экспоненты), и
значение достаточно маленькое, чтобы поместиться в 64-битное целое число со
знаком, то результатом будет INTEGER. Входной текст, который похож на
плавающую точку (есть десятичная точка и/или экспонента)
и текст, который описывает значение, которое может быть без потерь
преобразовано назад и вперед между IEEE 754 64-bit float и
51-bit signed integer, то результат INTEGER.
В предыдущем предложении определяется 51-битное целое число, так как это
составляет на один бит меньше, чем длина мантиссы IEEE 754 64-bit float и
таким образом обеспечивает 1 бит края для конверсионной операции текста к
float. Любой ввод текста, который описывает значение
вне диапазона 64-битного целого числа со знаком, приводит к результату REAL.
14. Выражения Boolean
15. Функции