Spec-Zone.ru › SQLite

Выражения языка SQL

Содержание
1. Синтаксис
2. Операторы и атрибуты, влияющие на разбор
3. Литеральные значения (константы)
4. Параметры
5. Операторы LIKE, GLOB, REGEXP, MATCH и extract
6. Оператор BETWEEN
7. Выражение CASE
8. Операторы IN и NOT IN
9. Имена столбцов таблиц
10. Оператор EXISTS
11. Подзапросные выражения
12. Связанные подзапросы
13. Выражения CAST
14. Булевы выражения
15. Функции

1. Синтаксис

expr:

литеральное значение связываемый параметр имя схемы . имя таблицы . имя столбца унарный оператор выражение выражение бинарный оператор выражение имя функции ( аргументы функции ) filter-clause over-clause ( выражение ) , CAST ( выражение AS имя типа
) expr COLLATE имя_сортировки expr НЕ ПОХОЖЕ GLOB REGEXP СОПОСТАВИТЬ expr expr ESCAPE expr expr ISNULL NOTNULL НЕ NULL expr ЯВЛЯЕТСЯ НЕ РАЗЛИЧНЫЕ ИЗ expr expr
НЕ МЕЖДУ expr И expr expr НЕ В ( select-stmt ) expr , имя_схемы . функция_таблицы ( expr ) имя_таблицы , НЕ СУЩЕСТВУЕТ ( select-stmt ) СЛУЧАЙ
expr WHEN expr THEN expr ELSE expr END raise-function

условие фильтрации:

ФИЛЬТР ( ГДЕ expr )

аргументы функции:

DISTINCT expr , * ORDER BY ordering-term ,

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

literal-value:

CURRENT_TIMESTAMP числовое_литерал строковое_литерал двоичный_литерал NULL ИСТИНА ЛОЖЬ ТЕКУЩЕЕ_ВРЕМЯ ТЕКУЩАЯ_ДАТА

оператор_over:

СВЕРХУ имя-окна ( базовое-имя-окна РАЗДЕЛЁННЫЙ ПО выражение , ПОРЯДОК ПО определяющий-термин , спецификация-кадра )

спецификация-кадра:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫЕ ПРЕДШЕСТВУЮЩИЕ И НЕОГРАНИЧЕННЫЕ СЛЕДУЮЩИЕ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫЕ ПРЕДШЕСТВУЮЩИЕ expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩАЯ СТРОКА expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИЕ expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИЕ
ИСКЛЮЧИТЬ ТЕКУЩИЙ СТРОКА ИСКЛЮЧИТЬ ГРУППА ИСКЛЮЧИТЬ СВЯЗИ ИСКЛЮЧИТЬ НЕТ ДРУГИЕ

ordering-term:

expr СОРТИРОВКА имя-сортировки УБЫВАЮЩЕМ ВОЗРАСТАЮЩЕМ С NULL СНАЧАЛА С NULL ВКОНЦЕ

raise-function:

ЗАПРОСИТЬ ( ОТКАТ , сообщение_об_ошибке ) ИГНОРИРОВАТЬ ПРЕРВАТЬ ПРОВАЛ

оператор_выбора:

С РЕКУРСИВНЫЙ общее-выражение-с-подзапросом , ВЫБРАТЬ УНИКАЛЬНЫЕ столбец-результата , ВСЕ ИЗ таблица-или-подзапрос присоединение , ГДЕ выражение СГРУППИРОВАТЬ ПО выражение С УСЛОВИЕМ выражение ,
WINDOW имя_окна КАК определение_окна , ЗНАЧЕНИЯ ( выражение ) , , составной_оператор select-core СОРТИРОВКА ПО ОГРАНИЧЕНИЕ выражение элемент_сортировки , СМЕЩЕНИЕ выражение , выражение

общие_табличные_выражения:

имя_таблицы ( имя_столбца ) КАК НЕ МАТЕРИАЛИЗОВАННЫЙ ( запрос_выбора ) ,

операция_составления:

ОБЪЕДИНЕНИЕ ОБЪЕДИНЕНИЕ ПЕРЕСЕЧЕНИЕ ИСКЛЮЧЕНИЕ ВСЁ

оператор_соединения:

table-or-subquery join-operator table-or-subquery join-constraint

join-constraint:

USING ( column-name ) , ON expr

join-operator:

NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS

join-operator:

NATURAL LEFT OUTER JOIN , <polygon class="fill" points="
expr COLLATE имя_сортировки DESC ASC NULLS первый NULLS последний

столбец_результата:

expr КАК псевдоним_столбца * имя_таблицы . *

таблица_или_подзапрос:

имя-схемы . имя-таблицы КАК псевдоним-таблицы ИНДЕКСИРОВАННЫЙ ПО имя-индекса НЕ ИНДЕКСИРОВАННЫЙ имя-функции-таблицы ( выражение ) , КАК псевдоним-таблицы ( выражение-выбор ) ( таблица-или-подзапрос ) ,
join-clause

window-defn:

( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )

frame-spec:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫМИ ПРЕДШЕСТВУЮЩИМИ И НЕОГРАНИЧЕННЫМИ СЛЕДУЮЩИМИ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫМИ ПРЕДШЕСТВУЮЩИМИ expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИМИ expr ПРЕДШЕСТВУЮЩИМИ ТЕКУЩАЯ СТРОКА expr СЛЕДУЮЩИМИ
EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS

type-name:

name ( signed-number , signed-number ) ( signed-number )

signed-number:

+ numeric-literal -

2. Операторы и атрибуты, влияющие на разбор

SQLite понимает эти операторы, перечисленные в порядке приоритета1
(сверху вниз / от наивысшего к наименьшему):

Операторы 2 ~ &lsqb;expr&rsqb; + &lsqb;expr&rsqb; - &lsqb;expr&rsqb; &lsqb;expr&rsqb; COLLATE &lpar;collation-name&rpar; 3 || -> ->> * / % + - & | << >> &lsqb;expr&rsqb; ESCAPE &lsqb;escape-character-expr&rsqb; 4 < > <= >= = == <> != IS IS NOT
IS DISTINCT FROM IS NOT DISTINCT FROM
&lsqb;expr&rsqb; BETWEEN5 &lsqb;expr&rsqb; AND &lsqb;expr&rsqb;
IN5 MATCH5 LIKE5 REGEXP5 GLOB5
&lsqb;expr&rsqb; ISNULL &lsqb;expr&rsqb; NOTNULL &lsqb;expr&rsqb; NOT NULL NOT &lsqb;expr&rsqb; AND OR

  1. Операторы, представленные в одной ячейке таблицы, имеют одинаковый приоритет.
  2. "&lsqb;expr&rsqb;" обозначает расположение операндов для небинарных операторов.
    Операторы без приставки "&lsqb;expr&rsqb;" являются бинарными и левоассоциативными.
  3. Оператор COLLATE (с именем сортировки) действует как единый постфиксный оператор.
  4. Оператор ESCAPE (с символом escape) действует как единый постфиксный оператор.
    Он может быть применён только к предшествующему выражению &lsqb;expr&rsqb; LIKE &lsqb;expr&rsqb;.
  5. Каждый ключевой оператор (BETWEEN IN GLOB LIKE MATCH REGEXP) может быть префиксным
    оператором NOT, сохраняя приоритет и ассоциативность основного оператора.

Оператор COLLATE — это унарный постфиксный оператор, который назначает последовательность сортировки выражению. Последовательность сортировки, заданная оператором COLLATE, переопределяет последовательность сортировки, заданную в операторе COLLATE в определении столбца таблицы столбца. Дополнительную информацию см. в подробном обсуждении последовательностей сортировки в документе Тип данных в SQLite3.

Унарный оператор + — это пустой оператор. Он может применяться к строкам, числам, BLOB или NULL, и всегда возвращает результат с тем же значением, что и операнд.

Обратите внимание, что существуют два варианта операторов равенства и неравенства. Оператор равенства может быть либо =, либо ==. Оператор неравенства может быть либо !=, либо <>. Оператор || — это "конкатенация" — он объединяет две строки своих операндов. Операторы -> и ->> — это "извлечение"; они извлекают компонент правой части из левой части. Пример см. в разделе извлечение подкомпонентов JSON.

Оператор % преобразует оба своих операнда к типу INTEGER, а затем вычисляет остаток от деления левого целого числа на правое целое число. Другие арифметические операторы выполняют арифметические операции с целыми числами, если оба операнда — целые числа и переполнение не произойдёт, или арифметические операции с плавающей точкой в соответствии со стандартом IEEE 754, если один из операндов — вещественное число или арифметические операции с целыми числами приведут к переполнению. Целочисленное деление даёт целочисленный результат, усеченный к нулю.

Результат любого бинарного оператора — числовое значение или NULL, за исключением оператора конкатенации ||, а также операторов извлечения -> и ->>, которые могут возвращать значения любого типа.

Все операторы обычно оцениваются как NULL, когда любой операнд равен NULL, за исключением случаев, указанных ниже. Это соответствует стандарту SQL92.

При парных операциях с NULL:
AND оценивается как 0 (ложь), когда другой операнд равен ложно; и
OR оценивается как 1 (истина), когда другой операнд равен истине.

Операторы IS и IS NOT работают как = и !=, за исключением случаев, когда один или оба операнда равны NULL. В этом случае, если оба операнда равны NULL, то оператор IS оценивается как 1 (истина), а оператор IS NOT оценивается как 0 (ложь). Если один операнд равен NULL, а другой — нет, то оператор IS оценивается как 0 (ложь), а оператор IS NOT оценивается как 1 (истина). Выражение IS или IS NOT не может быть равно NULL.

Оператор IS NOT DISTINCT FROM является альтернативным написанием оператора IS. Аналогично, оператор IS DISTINCT FROM означает то же самое, что и IS NOT. Стандартный SQL не поддерживает компактную запись IS и IS NOT. Эти компактные формы являются расширением SQLite. В других SQL-базах данных необходимо использовать громоздкие и менее читаемые операторы IS NOT DISTINCT FROM и IS DISTINCT FROM.

3. Литеральные значения (константы)

Литеральное значение представляет собой константу. Литеральные значения могут быть целыми числами, числами с плавающей точкой, строками, BLOB или NULL.

Синтаксис для целых чисел и чисел с плавающей точкой (вместе "числовые литералы") показан на следующей диаграмме:

numeric-literal:

цифра _ . Е е цифра _ . цифра _ - цифра _ + 0x 0X шестнадцатеричное_число _

Если числовая литерал содержит десятичную точку или показатель степени, или если она меньше -9223372036854775808 или больше 9223372036854775807, то это литерал с плавающей точкой. В противном случае это целочисленный литерал. Символ "E", начинающий показатель степени литерала с плавающей точкой, может быть как заглавным, так и строчным. Символ "." всегда используется в качестве десятичной точки, даже если в настройках региональных параметров для этой роли указана запятая. Использование запятой в качестве десятичной точки привело бы к синтаксической неоднозначности.

Начиная с версии SQLite 3.46.0 (2024-05-23), между любыми двумя цифрами можно добавить один дополнительный символ подчеркивания ("_"). Подчеркивания предназначены только для повышения читаемости и игнорируются SQLite.

Шестнадцатеричные целочисленные литералы следуют обозначениям языка C — "0x" или "0X", за которыми следуют шестнадцатеричные цифры. Например, 0x1234 эквивалентно 4660, а 0x8000000000000000 эквивалентно -9223372036854775808. Шестнадцатеричные целочисленные литералы интерпретируются как 64-битные целые числа в дополнительном коде и, таким образом, ограничены шестнадцатью значащими цифрами точности. Поддержка шестнадцатеричных целых чисел была добавлена в версию SQLite 3.8.6 (2014-08-15). Для обеспечения обратной совместимости обозначение шестнадцатеричного целого числа "0x" понимается только анализатором языка SQL, а не процедурами преобразования типов. Строковые переменные, содержащие текст, отформатированный как шестнадцатеричные целые числа, не интерпретируются как шестнадцатеричные целые числа при приведении значения строки к целому числу из-за выражения CAST или преобразования аффинитета столбца, или до выполнения арифметической операции, или при других преобразованиях во время выполнения. При приведении строкового значения в формате шестнадцатеричного целого числа к целому значению процесс преобразования останавливается, когда встречается символ 'x', поэтому полученное целое значение всегда равно нулю. SQLite понимает обозначение шестнадцатеричного целого числа только тогда, когда оно встречается в тексте SQL-запроса, а не как часть содержимого базы данных.

Строковая константа образуется путем помещения строки в одинарные кавычки ('). Одинарная кавычка внутри строки может быть закодирована путем помещения двух одинарных кавычек друг за другом, как в Паскале. Преобразования в стиле C с использованием обратной косой черты не поддерживаются, так как они не являются стандартным SQL.

Литералы BLOB — это строковые литералы, содержащие шестнадцатеричные данные и предваряемые одним символом "x" или "X". Пример: X'53514C697465'

Литеральное значение также может быть токеном "NULL".

4. Параметры

Токен «переменная» или «параметр» указывает заполнитель в выражении для значения, которое заполняется во время выполнения с помощью семейства функций sqlite3_bind() интерфейсов C/C++. Параметры могут принимать несколько форм:

   
?NNN

 A question mark followed by a number NNN holds a spot for the NNN-th parameter. NNN must be between 1 and SQLITE_MAX_VARIABLE_NUMBER.    ?
 A question mark that is not followed by a number creates a parameter with a number one greater than the largest parameter number already assigned. If this means the parameter number is greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. This parameter format is provided for compatibility with other database engines. But because it is easy to miscount the question marks, the use of this parameter format is discouraged. Programmers are encouraged to use one of the symbolic formats below or the ?NNN format above instead.    
:AAAA

 A colon followed by an identifier name holds a spot for a named parameter with the name :AAAA. Named parameters are also numbered. The number assigned is one greater than the largest parameter number already assigned. If this means the parameter would be assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. To avoid confusion, it is best to avoid mixing named and numbered parameters.   
@AAAA

 An "at" sign works exactly like a colon, except that the name of the parameter created is @AAAA.   
$AAAA

 A dollar-sign followed by an identifier name also holds a spot for a named parameter with the name $AAAA. The identifier name in this case can include one or more occurrences of "::" and a suffix enclosed in "(...)" containing any text at all. This syntax is the form of a variable name in the Tcl programming language. The presence of this syntax results from the fact that SQLite is really a Tcl extension that has escaped into the wild.   

Параметры, которым не назначены значения с помощью sqlite3_bind(), обрабатываются как NULL. Интерфейс sqlite3_bind_parameter_index() может использоваться для перевода символьного имени параметра в его эквивалентный числовой индекс.

Максимальное количество параметров устанавливается во время компиляции макросом SQLITE_MAX_VARIABLE_NUMBER. Отдельное соединение с базой данных D может уменьшить максимальное количество параметров ниже максимального значения, установленного во время компиляции, используя интерфейс sqlite3_limit(D, SQLITE_LIMIT_VARIABLE_NUMBER,...).

5. Операторы LIKE, GLOB, REGEXP, MATCH и extract

Оператор LIKE выполняет сравнение с шаблоном. Операнд справа от оператора LIKE содержит шаблон, а операнд слева — строку, которую нужно сопоставить с шаблоном. Символ процента ("%") в шаблоне LIKE соответствует любой последовательности нуля или более символов в строке. Подчеркивание ("_") в шаблоне LIKE соответствует любому одиночному символу в строке. Любой другой символ соответствует самому себе или своему эквиваленту в верхнем/нижнем регистре (т. е. сопоставление без учета регистра). Важно: SQLite по умолчанию понимает регистр только для символов ASCII. Оператор LIKE по умолчанию чувствителен к регистру для символов Unicode, которые выходят за пределы диапазона ASCII. Например, выражение 'a' LIKE 'A' истинно, но 'æ' LIKE 'Æ' ложно. Расширение ICU для SQLite включает улучшенную версию оператора LIKE, которая выполняет сворачивание регистра для всех символов Unicode.

Если присутствует необязательная часть ESCAPE, то выражение, следующее за ключевым словом ESCAPE, должно вычисляться в строку, состоящую из одного символа. Этот символ может использоваться в шаблоне LIKE для включения символов процента или подчеркивания. Символ экранирования, за которым следует символ процента (%), подчеркивание (_), или второй экземпляр самого символа экранирования, соответственно, соответствует литеральному символу процента, подчеркиванию или символу экранирования.

Инфиксный оператор LIKE реализуется путем вызова определенных пользователем SQL-функций like(Y,X) или like(Y,X,Z).

Оператор LIKE может быть сделан чувствительным к регистру с помощью псевдонима case_sensitive_like.

Оператор GLOB похож на LIKE, но использует синтаксис Unix file 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() более полезной логикой.

Операторы extract действуют как специальный синтаксис для функций "->"() и "->>"(). Реализации этих функций по умолчанию выполняют извлечение подкомпонентов JSON, но расширения могут переопределять их для других целей.

6. Оператор BETWEEN

Оператор BETWEEN логически эквивалентен паре сравнений. «x BETWEEN y AND z» эквивалентно «x>=y AND x<=z», за исключением того, что с BETWEEN выражение x вычисляется только один раз.

7. Выражение CASE

Выражение CASE выполняет роль, аналогичную IF-THEN-ELSE в других языках программирования.

Необязательное выражение, которое встречается между ключевым словом CASE и первым ключевым словом WHEN, называется «основным» выражением. Существуют две основные формы выражения CASE: те, которые содержат основное выражение, и те, которые не содержат его.

В выражении CASE без основного выражения каждое выражение WHEN вычисляется и результат обрабатывается как булево значение, начиная с левого и продолжая вправо. Результатом выражения CASE является вычисление выражения THEN, соответствующего первому выражению WHEN, которое вычисляется как истинное. Или, если ни одно из выражений WHEN не вычисляется как истинное, результатом является вычисление выражения ELSE, если оно есть. Если выражения ELSE нет и ни одно из выражений WHEN не истинно, то общий результат — NULL.

Результат NULL считается ложным при оценке членов WHEN.

В выражении CASE с основным выражением основное выражение вычисляется один раз, а результат сравнивается с результатом вычисления каждого выражения WHEN слева направо. Результатом выражения CASE является вычисление выражения THEN, соответствующего первому выражению WHEN, для которого сравнение истинно. Или, если ни одно из выражений WHEN не вычисляет значение, равное основному выражению, результатом является вычисление выражения ELSE, если оно есть. Если выражение ELSE отсутствует и ни одно из выражений WHEN не возвращает результат, равный основному выражению, общий результат — NULL.

При сравнении основного выражения с выражением WHEN применяются те же правила сортировки, аффинитета и обработки NULL, что и при сравнении основного и правого операндов оператора =.

Если основное выражение равно NULL, результат выражения CASE всегда равен результату вычисления выражения ELSE, если оно существует, или NULL, если оно отсутствует.

Обе формы выражения CASE используют ленивую или краткую оценку.

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

    
    
  • CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
  • CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
  • Встроенная SQL-функция iif(x,y,z) логически эквивалентна «CASE WHEN x THEN y ELSE z END». Функция iif() встречается в SQL Server и включена в SQLite для обеспечения совместимости. Некоторые разработчики предпочитают функцию iif(), так как она более лаконична.

    8. Операторы IN и NOT IN

    Операторы IN и NOT IN принимают выражение слева и список значений или подзапрос справа. Когда правым операндом оператора IN или NOT IN является подзапрос, подзапрос должен иметь то же количество столбцов, что и столбцы в значении строки левого операнда. Подзапрос справа от оператора IN или NOT IN должен быть скалярным подзапросом, если левое выражение не является выражением значения строки. Если правым операндом оператора IN или NOT IN является список значений, каждое из этих значений должно быть скалярным, а левое выражение также должно быть скалярным. Правая часть оператора IN или NOT IN может быть именем таблицы name или функцией, возвращающей таблицу name, в этом случае правая часть понимается как подзапрос вида "(SELECT * FROM name)". Когда правым операндом является пустой набор, результат IN ложный, а результат NOT IN истинный, независимо от левого операнда, и даже если левый операнд равен NULL.

    Результат оператора IN или NOT IN определяется следующей матрицей:

    Левый операнд
    равен NULL
    Правый операнд
    содержит NULL
    Правый операнд
    является пустым множеством
    Левый операнд найден
    в правом операнде
    Результат
    оператора IN
    Результат
    оператора NOT IN
    нетнетнетнетfalsetrue
    не имеет значениянетданетfalsetrue
    нетне имеет значениянетдаtruefalse
    нетданетнетNULLNULL
    дане имеет значениянетне имеет значенияNULLNULL

    Обратите внимание, что SQLite допускает пустой список скалярных значений в правой части оператора IN или NOT IN, но большинство других СУБД и стандарт SQL92 требуют, чтобы список содержал по крайней мере один элемент.

    9. Имена столбцов таблицы

    Имя столбца может быть любым именем, определённым в инструкции CREATE TABLE, или одним из следующих специальных идентификаторов: "ROWID", "OID" или "_ROWID_". Эти три специальных идентификатора описывают уникальный целочисленный ключ (rowid) каждой строки каждой таблицы и, следовательно, недоступны для таблиц WITHOUT ROWID. Специальные идентификаторы ссылаются только на ключ строки, если инструкция CREATE TABLE не определяет реальный столбец с тем же именем. Rowid можно использовать в любом месте, где можно использовать обычный столбец.

    10. Оператор EXISTS

    Оператор EXISTS всегда вычисляет одно из целочисленных значений 0 и 1. Если выполнение инструкции SELECT, указанной в качестве правого операнда оператора EXISTS, вернёт одну или несколько строк, то оператор EXISTS вычислит значение 1. Если выполнение инструкции SELECT не вернёт ни одной строки, то оператор EXISTS вычислит значение 0.

    Количество столбцов в каждой возвращённой строке (если таковые есть) и конкретные возвращённые значения не влияют на результаты оператора EXISTS. В частности, строки, содержащие значения NULL, обрабатываются неотличимо от строк без значений NULL.

    11. Подзапросы

    Инструкция SELECT в скобках является подзапросом. Все типы инструкций SELECT, включая агрегатные и составные запросы SELECT (запросы с ключевыми словами, такими как UNION или EXCEPT), разрешены в качестве скалярных подзапросов. Значение подзапроса — первая строка результата вложенной инструкции SELECT. Значение подзапроса равно NULL, если вложенная инструкция SELECT не возвращает ни одной строки.

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

    12. Связанные подзапросы

    Инструкция SELECT, используемая в качестве скалярного подзапроса или в качестве правого операнда операторов IN, NOT IN или EXISTS, может содержать ссылки на столбцы во внешнем запросе. Такой подзапрос известен как связанный подзапрос. Связанный подзапрос перевычисляется каждый раз, когда требуется его результат. Несвязанный подзапрос вычисляется только один раз, а результат используется по мере необходимости.

    13. Выражения CAST

    Выражение CAST в формате "CAST(expr AS type-name)" используется для преобразования значения expr в другой тип хранения, указанный именем типа type-name. Преобразование CAST аналогично преобразованию, которое происходит при применении сродства столбца к значению, за исключением того, что с оператором CAST преобразование всегда выполняется, даже если преобразование убыточное и необратимое, в то время как сродство столбца изменяет тип данных значения только в том случае, если изменение без потерь и обратимо.

    Если значение expr равно NULL, то результат выражения CAST также равен NULL. В противном случае тип хранения результата определяется применением правил определения сродства столбца к type-name.

    Сродство type-nameОбработка преобразования
    NONEПреобразование значения в type-name без сродства приводит к преобразованию значения в BLOB. Преобразование в BLOB включает сначала преобразование значения в TEXT в кодировке соединения с базой данных, а затем интерпретацию полученной последовательности байтов как BLOB вместо TEXT.
    TEXTДля преобразования значения BLOB в TEXT последовательность байтов, составляющих BLOB, интерпретируется как текст, закодированный с помощью кодировки базы данных.

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

    REALПри преобразовании значения BLOB в REAL значение сначала преобразуется в TEXT.

    При преобразовании значения TEXT в REAL из значения TEXT извлекается самая длинная возможная префиксная часть, которая может быть интерпретирована как вещественное число, а остальная часть игнорируется. Все ведущие пробелы в значении TEXT игнорируются при преобразовании из TEXT в REAL. Если нет префикса, который можно интерпретировать как вещественное число, результат преобразования равен 0,0.

    INTEGERПри преобразовании значения BLOB в INTEGER значение сначала преобразуется в TEXT.

    При преобразовании значения TEXT в INTEGER из значения TEXT извлекается самая длинная возможная префиксная часть, которая может быть интерпретирована как целое число, а остальная часть игнорируется. Все ведущие пробелы в значении TEXT игнорируются при преобразовании из TEXT в INTEGER. Если нет префикса, который можно интерпретировать как целое число, результат преобразования равен 0. Если целочисленное значение префикса больше +9223372036854775807, то результат преобразования равен ровно +9223372036854775807. Аналогично, если целочисленное значение префикса меньше -9223372036854775808, то результат преобразования равен ровно -9223372036854775808.

    При преобразовании в INTEGER оператор CAST понимает только десятичные целые числа; преобразование шестнадцатеричных целых чисел останавливается на символе "x" в префиксе "0x" шестнадцатеричного целого числа, и, следовательно, результат CAST всегда равен нулю.

    Преобразование вещественного значения в целое число приводит к целому числу между вещественным значением и нулём, которое наиболее близко к вещественному значению. Если вещественное число больше наибольшего возможного целого числа (+9223372036854775807), то результат равен наибольшему возможному целому числу, а если вещественное число меньше наименьшего возможного целого числа (-9223372036854775808), то результат равен наименьшему возможному целому числу.

    До версии SQLite 3.8.2 (2013-12-06) преобразование вещественного значения, большего +9223372036854775807,0, в целое число приводило к наименьшему целому числу, -9223372036854775808. Это поведение должно было имитировать поведение аппаратного обеспечения x86/x64 при выполнении эквивалентного преобразования.

    NUMERICПреобразование значения TEXT или BLOB в NUMERIC приводит к целочисленному или вещественному результату. Если входной текст выглядит как целое число (нет десятичной точки или показателя степени) и значение достаточно мало, чтобы поместиться в 64-битное знаковое целое число, то результатом будет целое число. Входной текст, который выглядит как значение с плавающей точкой (есть десятичная точка и/или показатель степени), и текст описывает значение, которое можно без потерь преобразовать в IEEE 754 64-битный float и 51-битное знаковое целое число, то результатом будет целое число. (В предыдущем предложении указано 51-битное целое число, поскольку это на один бит меньше, чем длина мантиссы 64-битного плавающего числа IEEE 754, и, следовательно, обеспечивает 1 бит запаса для операции преобразования текста в число с плавающей точкой.) Любой текстовый ввод, описывающий значение за пределами диапазона 64-битного знакового целого числа, приводит к результату с плавающей точкой.

    Преобразование значения REAL или INTEGER в NUMERIC является бесполезным действием, даже если вещественное значение можно без потерь преобразовать в целое число.

    Обратите внимание, что результат преобразования любого значения, отличного от BLOB, в BLOB и результат преобразования любого значения BLOB в значение, отличное от BLOB, могут отличаться в зависимости от кодировки базы данных (encoding), является ли она UTF-8, UTF-16be или UTF-16le.

    14. Булевы выражения

    Язык SQL имеет несколько контекстов, где выражение вычисляется, а результат преобразуется в булево (true или false) значение. Эти контексты:

    • оператор WHERE в инструкции SELECT, UPDATE или DELETE,
    • оператор ON или USING в соединении в инструкции SELECT,
    • оператор HAVING в инструкции SELECT,
    • оператор WHEN в SQL-триггере и
    • оператор WHEN в выражении CASE.

    Для преобразования результатов SQL-выражения в булево значение SQLite сначала преобразует результат в NUMERIC-значение так же, как и выражение CAST. Нулевое числовое значение (целое значение 0 или вещественное значение 0,0) считается ложным. Значение NULL остаётся NULL. Все остальные значения считаются истинными.

    Например, значения NULL, 0,0, 0, 'english' и '0' считаются ложными. Значения 1, 1,0, 0,1, -0,1 и '1english' считаются истинными.

    Начиная с SQLite 3.23.0 (2018-04-02), SQLite распознаёт идентификаторы "TRUE" и "FALSE" как булевы литералы, только если эти идентификаторы не используются для другого значения. Если уже существуют столбцы или таблицы или другие объекты с именем TRUE или FALSE, то для обратной совместимости идентификаторы TRUE и FALSE относятся к этим другим объектам, а не к булевым значениям.

    Булевы идентификаторы TRUE и FALSE обычно являются просто псевдонимами для целочисленных значений 1 и 0 соответственно. Однако, если TRUE или FALSE появляются в правой части оператора IS, то оператор IS рассматривает левый операнд как булево значение и возвращает соответствующий ответ.

    15. Функции

    SQLite поддерживает множество простых, агрегирующих и оконных функций SQL. Для наглядности, простые функции подразделяются на базовые функции, функции работы со временем и датами, математические функции и функции JSON. Приложения могут добавлять новые функции, написанные на C/C++, используя интерфейс sqlite3_create_function().

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

    вызов-функции:

    simple-func ( expr ) , *

    вызов агрегатной функции:

    aggregate-func ( DISTINCT expr ) фильтр-оператор , * ОПЕРАЦИЯ ПО условие_сортировки ,

    вызов оконной функции:

    window-func ( expr ) filter-clause OVER window-name window-defn , *

    Оператор OVER необходим для функций окна и запрещён в других случаях. Ключевое слово DISTINCT и оператор ORDER BY разрешены только для агрегатных функций. Оператор FILTER не может использоваться в простых функциях.

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

    Эта страница была изменена в последний раз 02.06.2024 10:08:16 по Гринвичу

    SQLite is in the Public Domain.
    https://sqlite.org/lang_expr.html

    Spec-Zone.ru

    Настройки Оффлайн Что нового Помощь О нас
    Spec-Zone .ru
    спецификации, руководства, описания, API