![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Большинство СУБД, используют статические типы.
Со статическим контролем типов тип данных значения определяется контейнером,
конкретной колонкой, в которой сохранено значение. SQLite использует более общую динамическую систему типов.
В SQLite тип данных связан с самим значением, не с контейнером.
Динамическая система типов SQLite обратно совместима с более общими
статическими системами типов других ядер базы данных в том смысле, что
SQL-операторы, которые работают со статическим контролем типов,
ведут себя аналогично в SQLite. Однако, динамический контроль типов в SQLite
позволяет ему делать вещи, которые невозможны в традиционных базах данных. Обновлено: с version 3.37.0 (2021-11-27) SQLite предоставляет
таблицы STRICT, которые делают принудительное
присвоение типов для разработчиков, которые предпочитают такую вещь.
У каждого значения в базе данных SQLite (или управляемого ядром базы
данных), есть один из следующих классов памяти: NULL. Значение NULL. INTEGER. Значение signed integer, хранится в 0, 1,
2, 3, 4, 6 или 8 байтах в зависимости от величины. REAL. Значение floating point, хранится в 8-байтовом числе
IEEE floating point. TEXT. Текстовая строка, сохраненная с использованием
кодирования базы данных (UTF-8, UTF-16BE или UTF-16LE). BLOB. Значение blob, сохранено точно как это было введено.
Класс памяти более общий, чем тип данных. Класс памяти INTEGER, например,
включает 7 различных целочисленных типа данных различных длин.
Это имеет значение на диске.
Но как только целочисленные значения прочитаны с диска и загружены в память
для обработки, они преобразовываются в самый общий тип данных (8-байтовое
целое число со знаком). Итак по большей части, "класс памяти"
неотличим от "типа данных", и два термина могут
быть использованы попеременно. Любая колонка в базе данных SQLite version 3, кроме
INTEGER PRIMARY KEY,
может использоваться, чтобы сохранить значение любого класса памяти. У всех значений в SQL-операторах, являются ли они литералами, включенными
в текст SQL-оператора, или параметрами,
связанными с предварительно собранными
SQL-операторами, есть неявный класс памяти. При обстоятельствах,
описанных ниже, ядро базы данных может преобразовать значения
между числовыми классами памяти (INTEGER и REAL) и TEXT во
время выполнения запросов. У SQLite нет отдельного Булева класса памяти. Вместо этого булевы значения
сохранены как целые числа 0 (false) и 1 (true). SQLite признает ключевые слова "TRUE" и "FALSE", с version 3.23.0
(2018-04-02), но те ключевые слова действительно просто альтернативное
правописание для 1 и 0 соответственно.
SQLite не имеет класс памяти для хранения дат и/или времени.
Вместо этого встроенные функции даты и времени
способны к хранению даты и времени как TEXT, REAL или INTEGER: Приложения могут сохранить даты и время в любом из этих форматов и
свободно преобразовывать между форматами, используя встроенные
функции. Базы данных SQL, которые используют строгую типизацию,
будут обычно пытаться автоматически преобразовать значения
в соответствующий тип данных. Рассмотрите это: Обычная база данных преобразует последовательность '123' в целое число
123, а целое число 456 в последовательность '456' до выполнения вставки. Чтобы максимизировать совместимость между SQLite и другими ядрами базы
данных и чтобы пример выше работал в SQLite так, как это делается в других
СУБД, SQLite поддерживает понятие "близости типа" на колонках.
Близость типа колонки это рекомендуемый тип для данных в той колонке.
Важная идея здесь состоит в том, что тип рекомендуется, но не требуется.
Любая колонка может все еще сохранить любой тип данных.
Просто некоторые колонки, учитывая выбор, предпочтут использовать один класс
памяти вместо другого. Предпочтительный класс памяти для колонки
называют ее "близостью". Каждой колонке в базе данных SQLite 3 назначают одно из
следующих сходств типа: Близость типа "BLOB" раньше называлась "NONE". Но тот термин
было легко перепутать с "no affinity"
и таким образом, это было переименовано. Колонка с близостью TEXT хранит все данные, используя классы памяти NULL,
TEXT или BLOB. Если числовые данные вставляются в колонку с близостью TEXT,
это преобразовывается в текстовую форму прежде чем быть сохраненным. Колонка с близостью NUMERIC может содержать значения, используя все пять
классов памяти. Когда текстовые данные вставляются в колонку NUMERIC, класс
памяти текста преобразовывается в INTEGER или REAL (в порядке предпочтения),
если текст это правильно построенное целое число или литерал.
Если значение TEXT это правильно построенный литерал целого числа,
который является слишком большим, чтобы поместиться в 64-битное целое число
со знаком, он преобразовывается в REAL. Для преобразований между TEXT и
классами памяти сохранены только первые 15 значительных десятичных цифр
числа. Если значение TEXT это не правильно построенное целое число или
литерал, то значение сохранено как TEXT. В целях этого параграфа
шестнадцатеричные литералы целого числа не считают правильно построенными и
хранят как TEXT. Это сделано для исторической совместимости с версиями SQLite
до version 3.8.6 2014-08-15,
где шестнадцатеричные литералы целого числа были сначала введены в SQLite.
Если значение с плавающей точкой, которое может быть представлено точно как
целое число, вставляется в колонку с близостью NUMERIC, значение
преобразовывается в целое число. Никакая попытка не предпринята, чтобы
преобразовать NULL или BLOB. Последовательность могла бы быть похожей на литерал
с плавающей запятой с нотацией десятичной точки и/или экспоненты, но пока
значение может быть выражено как целое число, близость NUMERIC преобразует
его в целое число. Следовательно, последовательность '3.0e+5'
сохранена в колонке с близостью NUMERIC как целое число 300000,
а не как значение с плавающей точкой 300000.0. Колонка, которая использует близость INTEGER, ведет себя
как колонка с близостью NUMERIC. Различие между INTEGER и близостью NUMERIC
очевидно только в выражении CAST:
выражение "CAST(4.0 AS INT)" вернет integer 4, выражение
"CAST(4.0 AS NUMERIC)" вернет floating-point 4.0. Колонка с близостью REAL ведет себя как колонка с близостью NUMERIC за
исключением того, что это переводит целочисленные значения в представление с
плавающей точкой. Как внутренняя оптимизация, небольшие значения с плавающей
точкой без фракционного компонента, снабженные в колонках близостью REAL,
написаны на диск как целые числа, чтобы занять меньше места, и автоматически
преобразовываются назад в плавающую точку при чтении.
Эта оптимизация абсолютно не видима на уровне SQL и может быть обнаружена,
только исследовав сырые части файла базы данных. Колонка с близостью BLOB не предпочитает никакого класса памяти. Для таблиц, не объявленных как STRICT,
близость колонки определяется заявленным типом колонки, согласно следующим
правилам в показанном порядке: Если заявленный тип содержит последовательность "INT",
тогда это назначенная близость INTEGER. Если заявленный тип колонки содержит какую-либо из последовательностей
"CHAR", "CLOB" или "TEXT",
у колонки есть близость TEXT. Заметьте, что тип VARCHAR содержит
последовательность "CHAR" и является таким образом
назначенной близостью TEXT. Если заявленный тип для колонки содержит последовательность
"BLOB" или если никакой тип не определяется,
у колонки есть близость BLOB. Если заявленный тип для колонки содержит какую-либо из
последовательностей "REAL", "FLOA" или "DOUB",
у колонки есть близость REAL. Иначе близость NUMERIC. Обратите внимание на то, что порядок
правил для определения близости колонки важен. Колонка, заявленный тип
которой "CHARINT", будет соответствовать обоим правилам 1 и 2, но первое
правило имеет приоритет, и таким образом близостью колонки будет INTEGER. Следующая таблица показывает, сколько общих имен типов данных от более
традиционных внедрений SQL преобразовывается в сходства по пяти правилам
предыдущей секции. Эта таблица показывает только маленькое подмножество имен
типов данных, что SQLite примет.
Отметьте, что числовые аргументы в круглых скобках за именем типа (например:
"VARCHAR(255)") проигнорированы SQLite: он
не вводит ограничений длины (кроме большого глобального предела
SQLITE_MAX_LENGTH)
на длину последовательностей, BLOB или числовых значений. Обратите внимание на то, что заявленный тип "FLOATING POINT"
дал бы близость INTEGER, а не близость REAL, из-за "INT" в конце
"POINT". Заявленный тип "STRING" обнаруживает сходство
NUMERIC, не TEXT.
У каждого столбца таблицы есть близость типа (одно из BLOB, TEXT, INTEGER,
REAL или NUMERIC), но выражения не обязательно обнаруживают сходство. Близость выражения определяется по следующим правилам: У правого операнда IN или NOT IN
нет близости, если операнд это список, или есть та же близость, как
близость выражения набора результатов, если операнд SELECT. Когда выражение это простая ссылка на колонку реальной таблицы (не
VIEW или подзапрос), тогда у выражения
есть та же самая близость, как у столбца таблицы. Круглые скобки вокруг имени столбца проигнорированы.
Следовательно, если X и Y.Z это имена столбцов, то (X) и (Y.Z) также
считаются именами столбцов и имеют близость соответствующих колонок. Любые операторы, обращенные к именам столбцов, включая не одноместный
оператор "+", преобразуют имя столбца в выражение, у которого никогда нет
близости. Следовательно, даже если X и Y.это Z имена столбцов, выражения +X и
+Y.Z не являются именами столбцов и не имеют никакой близости.
Выражение формы "CAST(expr AS type)" имеет сходство,
которое совпадает с колонкой с заявленным типом "type". У оператора COLLATE есть та же самая близость, как у операнда
его левой стороны. Иначе у выражения нет близости. "Колонки" VIEW или
FROM-подзапроса это действительно выражения в наборе результатов
SELECT, который осуществляет VIEW или
подзапрос. Таким образом близость к колонкам VIEW или подзапроса определяется
по правилам близости выражения выше. Рассмотрите пример: Близость колонки v1.x совпадет с близостью t1.b (TEXT),
с тех пор, как v1.x отображается непосредственно в t1.b. Но у колонок v1.y и
v1.z нет близости, поскольку они отображаются на выражения a+c и 42,
а у выражений нет близости.
Когда SELECT, который осуществляет
VIEW или
FROM-подзапрос, будет составной
SELECT, близость каждой колонки VIEW или подзапроса будет близостью
соответствующего столбца результата для одного из отдельных операторов
SELECT, которые составляют комплекс.
Однако, не определено, какой из операторов SELECT будет использоваться, чтобы
определить близость. Различные операторы SELECT могли бы использоваться,
чтобы определить близость в разное время во время оценки запроса.
Выбор мог бы измениться через различные версии SQLite. Выбор мог бы
измениться между одним запросом и следующим в той же самой версии SQLite.
Выбор мог бы отличаться в разное время в том же самом запросе.
Следовательно, вы никогда не можете быть уверены, какая близость будет
использоваться для колонок составного SELECT,
у которых есть различные сходства в подзапросах. Наиболее успешная практика должна избежать смешивать сходства в составном
SELECT, если вы заботитесь о типе данных результата. Смешивание сходств в
составном SELECT может привести к удивлению и неинтуитивным результатам. См.
forum post 02d7be94d7. Следующий SQL демонстрирует, как SQLite использует близость колонки,
чтобы сделать преобразования типов, когда значения вставляются в таблицу. У версии 3 SQLite есть обычный набор операторов сравнения SQL, включая
"=", "==", "<", "<=", ">", ">=", "!=", "",
"IN", "NOT IN", "BETWEEN", "IS" и "IS NOT".
Результаты сравнения зависят от классов памяти операндов,
согласно следующим правилам: Значение с классом памяти NULL считают меньше, чем
любое другое (включая другое значение с классом памяти NULL). INTEGER или REAL меньше, чем какой-либо TEXT или BLOB.
Когда INTEGER или REAL сравниваются с другим INTEGER или REAL,
числовое сравнение выполняется. TEXT меньше, чем BLOB. Когда TEXT сравнены, соответствующая
последовательность сопоставления используется,
чтобы определить результат. Когда два BLOB сравнены, результат
определяется, используя memcmp(). SQLite может попытаться преобразовать значения между классами памяти
INTEGER, REAL и/или TEXT прежде, чем выполнить сравнение.
Предприняты ли какие-либо преобразования, прежде чем сравнение происходит,
зависит от близости типа операндов. "Применять близость" означает преобразовывать операнд в
конкретный класс памяти, если и только если преобразование не теряет важную
информацию. Числовые значения могут всегда преобразовываться в TEXT.
TEXT могут быть преобразованы в числовые значения, если текстовое содержание
это правильно построенное целое число или литерал, но не шестнадцатеричное
литеральное целое число. BLOB преобразовываются в TEXT
просто интерпретируя двоичное содержание BLOB как текстовую строку в
текущем кодировании базы данных. Близость применяется к операндам оператора сравнения до сравнения
согласно следующим правилам в показанном порядке: Если у одного операнда есть близость INTEGER, REAL или NUMERIC, а
у другого операнда есть близость TEXT, BLOB или никакой близости, близость
NUMERIC применяется к другому операнду. Если у одного операнда есть близость TEXT, а другой не имеет никакой
близости, то близость TEXT применяется к другому операнду. Иначе никакая близость не применяется, и оба операнда
сравнены как есть. Выражение "a BETWEEN b AND c" рассматривают как два отдельных двоичных
сравнения "a >= b AND a <= c",
даже если это означает, что придут к различным сходствам в каждом из
сравнений. Преобразования типа данных в сравнениях формы
"x IN (SELECT y ...)" обработаны, как будто сравнение было действительно
"x=y". Выражение "a IN (x, y, z, ...)" аналогично "a = +x OR
a = +y OR a = +z OR ...". Другими словами, у значений справа от IN
("x", "y" и "z" в этом примере), как полагают, нет близости, даже если они
значения столбцов или выражения CAST. Математические операторы (+, -, *, /, %, <<, >>, & и |)
интерпретируют оба операнда, как будто они были числами. STRING или BLOB
автоматически преобразовывают в REAL или INTEGER.
Если STRING или BLOB похожи на вещественное число (если у этого есть
десятичная точка или экспонента), или если значение
вне диапазона, который может быть представлен как 64-битное целое число со
знаком, то это преобразовывает в REAL. Иначе операнд преобразовывает в
INTEGER. Подразумеваемое преобразование типов математических операндов
немного отличается от CAST to NUMERIC
в той последовательности и значениях BLOB, которые похожи на вещественные
числа, но не имеют никакой дробной части, сохранены как REAL вместо того,
чтобы быть преобразованным в INTEGER, как для
CAST to NUMERIC.
Преобразование от STRING или BLOB в REAL или INTEGER выполняется, даже
если это с потерями и необратимо.
Некоторые математические операторы (%, <<, >>, & и |)
ожидают операнды INTEGER. Для тех операторов операнды REAL преобразовываются
в INTEGER таким же образом, как CAST to
INTEGER. Операторы <<, >>, & и |
всегда возвращают результат INTEGER (или NULL), но оператор % возвращает
INTEGER или REAL (или NULL) в зависимости от типа его операндов.
Операнд NULL на математическом операторе приводит к результату NULL.
Операнд на математическом операторе, который не выглядит ни в каком случае
числовым и не является NULL, преобразовывается в 0 или 0.0.
Деление на нуль дает результат NULL. Когда результаты запроса сортированы пунктом ORDER BY,
значения с классом памяти NULL на первом месте, INTEGER и REAL за ними в
числовом порядке, затем TEXT в порядке сопоставления последовательности и
наконец BLOB в порядке memcmp().
Никакие преобразования класса памяти не происходят перед сортировкой. Группировку значений со значениями пункта GROUP BY с различными
классами памяти считают отличной, кроме значений INTEGER и REAL,
которые считают равными, если они численно равны. Никакие сходства не
применяются ни к каким значениям как к результату GROUP by. Составные операторы SELECT UNION, INTERSECT и EXCEPT
выполняют неявные сравнения между значениями. Никакая близость не применяется
к операндам сравнения для неявных сравнений, связанных с UNION, INTERSECT или
EXCEPT, значения сравнены как есть. Когда SQLite сравнивает две последовательности, он использует
последовательность сопоставления или сопоставление функции (два термина для
того же самого), чтобы определить, какая последовательность больше или две
последовательности равны. У SQLite есть три встроенных функции сопоставления:
BINARY, NOCASE и RTRIM. Применение может зарегистрировать дополнительные функции сопоставления,
используя
sqlite3_create_collation(). Сопоставление функций имеет значение, только сравнивая
последовательности. Числовые значения всегда сравниваются численно, и
BLOB всегда byte-by-byte через memcmp(). У каждой колонки каждой таблицы есть связанная функция сопоставления.
Если никакая функция сопоставления явно не определяется, то функции
сопоставления по умолчанию назначаются как BINARY.
Пункт COLLATE определения столбца
используется, чтобы определить альтернативные функции
сопоставления для колонки. Правила для определения, которую функцию
функцию использовать для двоичного оператора сравнения (=, <, >, <=,
>=, !=, IS и IS NOT): Если у любого операнда есть явное назначение функции
сопоставления, используя постфикс COLLATE
, то явная функция сопоставления используется для сравнения с
предшествованием функции сопоставления левого операнда. Если любой операнд это колонка, то используется функция сопоставления
той колонки с предшествованием левого операнда.
В целях предыдущего предложения имя столбца, которому предшествуют один или
несколько одноместных "+" и/или операторов CAST, все еще
считают именем столбца. Иначе используется BINARY. У операнда сравнения, как полагают, есть явное назначение функции
сопоставления (правило 1 выше), если какое-либо подвыражение операнда
использует постфикс COLLATE.
Таким образом, если COLLATE
используется где-нибудь в выражении сравнения, функция сопоставления,
определяемая тем оператором, используется для сравнения строк независимо от
того, какие столбцы таблицы могли бы быть частью того выражения.
Если два или больше подвыражения
COLLATE
появляются где-нибудь в сравнении,
самая явная функция сопоставления используется независимо от того, как
глубоко операторы COLLATE вложены в выражении и независимо от того,
как выражение вводится. Выражение "x BETWEEN y and z" логически эквивалентно двум сравнениям
"x >= y AND x <= z" и работает относительно сопоставления функций, как
будто это были два отдельных сравнения. Выражение "x IN (SELECT y ...)"
обработано таким же образом как выражение "x = y"
в целях определить последовательность сопоставления.
Последовательность сопоставления, используемая для выражений формы
"x IN (y, z, ...)", является последовательностью сопоставления x.
Если явная последовательность сопоставления требуется на операторе IN, она
должна быть применена к левому операнду:
"x COLLATE nocase IN (y,z, ...)". Условиям пункта ORDER BY, который является частью
SELECT, можно назначить последовательность
сопоставления, используя COLLATE,
в этом случае указанная функция сопоставления используется для сортировки.
Иначе, если выражение, отсортированное пунктом ORDER BY, является колонкой,
то последовательность сопоставления колонки используется,
чтобы определить порядок сортировки. Если выражение не колонка и не имеет
никакого пункта COLLATE, то последовательность
сопоставления BINARY используется. Примеры ниже определяют последовательности сопоставления, которые
использовались бы, чтобы определить результаты текстовых сравнений, которые
могут быть выполнены различными SQL-операторами. Обратите внимание на то, что
текстовое сравнение не может требоваться, и никакая последовательность
сопоставления не применяется в случае значений numeric, blob или NULL.
Choose any three.
1. Типы данных в SQLite
2.
Классы памяти и типы данных
2.1. Boolean
2.2. Date и Time
3. Близость типов
CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);
3.1.
Определение близости колонки
3.1.1.
Примеры имени близости
Имена типов в качестве примера для CREATE TABLE или CAST
Получающаяся близость
Правило, используемое, чтобы определить близость INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8INTEGER 1 CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOBTEXT 2 BLOB
Тип не заданBLOB
3 REAL
DOUBLE
DOUBLE PRECISION
FLOATREAL 4 NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIMENUMERIC
5 3.2.
Близость выражений
3.3.
Близость колонки к обзорам и подзапросам
CREATE TABLE t1(a INT, b TEXT, c REAL);
CREATE VIEW v1(x,y,z) AS SELECT b, a+c, 42 FROM t1 WHERE b!=11;
3.3.1.
Близость колонки к составным обзорам
3.4.
Пример поведения близости колонки
CREATE TABLE t1(
t TEXT, -- text affinity by rule 2
nu NUMERIC, -- numeric affinity by rule 5
i INTEGER, -- integer affinity by rule 1
r REAL, -- real affinity by rule 4
no BLOB -- no affinity by rule 3
);
-- Values stored as TEXT, INTEGER, INTEGER, REAL, TEXT.
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text
-- Values stored as TEXT, INTEGER, INTEGER, REAL, REAL.
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|real
-- Values stored as TEXT, INTEGER, INTEGER, REAL, INTEGER.
DELETE FROM t1;
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer
-- BLOBs are always stored as BLOBs regardless of column affinity.
DELETE FROM t1;
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob
-- NULLs are also unaffected by affinity
DELETE FROM t1;
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|null
4. Выражения сравнения
4.1. Порядок сортировки
4.2.
Преобразования типов до сравнения
4.3. Пример сравнения
CREATE TABLE t1(
a TEXT, -- text affinity
b NUMERIC, -- numeric affinity
c BLOB, -- no affinity
d -- no affinity
);
-- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectively
INSERT INTO t1 VALUES('500', '500', '500', 500);
SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t1;
text|integer|text|integer
-- Because column "a" has text affinity, numeric values on the
-- right-hand side of the comparisons are converted to text before
-- the comparison occurs.
SELECT a < 40, a < 60, a < 600 FROM t1;
0|1|1
-- Text affinity is applied to the right-hand operands but since
-- they are already TEXT this is a no-op; no conversions occur.
SELECT a < '40', a < '60', a < '600' FROM t1;
0|1|1
-- Column "b" has numeric affinity and so numeric affinity is applied
-- to the operands on the right. Since the operands are already numeric,
-- the application of affinity is a no-op; no conversions occur. All
-- values are compared numerically.
SELECT b < 40, b < 60, b < 600 FROM t1;
0|0|1
-- Numeric affinity is applied to operands on the right, converting them
-- from text to integers. Then a numeric comparison occurs.
SELECT b < '40', b < '60', b < '600' FROM t1;
0|0|1
-- No affinity conversions occur. Right-hand side values all have
-- storage class INTEGER which are always less than the TEXT values
-- on the left.
SELECT c < 40, c < 60, c < 600 FROM t1;
0|0|0
-- No affinity conversions occur. Values are compared as TEXT.
SELECT c < '40', c < '60', c < '600' FROM t1;
0|1|1
-- No affinity conversions occur. Right-hand side values all have
-- storage class INTEGER which compare numerically with the INTEGER
-- values on the left.
SELECT d < 40, d < 60, d < 600 FROM t1;
0|0|1
-- No affinity conversions occur. INTEGER values on the left are
-- always less than TEXT values on the right.
SELECT d < '40', d < '60', d < '600' FROM t1;
1|1|1
5. Операторы
6.
Сортировка, группировка и комплексный SELECT
7.
Сопоставление последовательностей
7.1. Назначение последовательностей сопоставления от SQL
7.2.
Примеры сортирующей последовательности
CREATE TABLE t1(x INTEGER PRIMARY KEY,
a, /* collating sequence BINARY */
b COLLATE BINARY, /* collating sequence BINARY */
c COLLATE RTRIM, /* collating sequence RTRIM */
d COLLATE NOCASE /* collating sequence NOCASE */
);
/* x a b c d */
INSERT INTO t1 VALUES(1,'abc','abc', 'abc ','abc');
INSERT INTO t1 VALUES(2,'abc','abc', 'abc', 'ABC');
INSERT INTO t1 VALUES(3,'abc','abc', 'abc ', 'Abc');
INSERT INTO t1 VALUES(4,'abc','abc ','ABC', 'abc');
/* Text comparison a=b is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = b ORDER BY x;
--result 1 2 3
/* Text comparison a=b is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE a = b COLLATE RTRIM ORDER BY x;
--result 1 2 3 4
/* Text comparison d=a is performed using the NOCASE collating sequence. */
SELECT x FROM t1 WHERE d = a ORDER BY x;
--result 1 2 3 4
/* Text comparison a=d is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = d ORDER BY x;
--result 1 4
/* Text comparison 'abc'=c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE 'abc' = c ORDER BY x;
--result 1 2 3
/* Text comparison c='abc' is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE c = 'abc' ORDER BY x;
--result 1 2 3
/* Grouping is performed using the NOCASE collating sequence (Values
** 'abc', 'ABC', and 'Abc' are placed in the same group). */
SELECT count(*) FROM t1 GROUP BY d ORDER BY 1;
--result 4
/* Grouping is performed using the BINARY collating sequence. 'abc' and
** 'ABC' and 'Abc' form different groups */
SELECT count(*) FROM t1 GROUP BY (d || '') ORDER BY 1;
--result 1 1 2
/* Sorting or column c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 ORDER BY c, x;
--result 4 1 2 3
/* Sorting of (c||'') is performed using the BINARY collating sequence. */
SELECT x FROM t1 ORDER BY (c||''), x;
--result 4 2 3 1
/* Sorting of column c is performed using the NOCASE collating sequence. */
SELECT x FROM t1 ORDER BY c COLLATE NOCASE, x;
--result 2 4 3 1