非常教程

Sqlite参考手册

语言 | Language

expression

[Top]

表达

expr: hide

expression

literal-value: show

expression

raise-function: show

expression

select-stmt: show

expression

common-table-expression: show

expression

compound-operator: show

expression

join-clause: show

expression

join-constraint: show

expression

join-operator: show

expression

ordering-term: show

expression

result-column: show

expression

table-or-subquery: show

expression

type-name: show

expression

signed-number: show

expression

本部分与其他部分不同。本文档的大部分其他部分都会讨论特定的 SQL 命令。本节不讨论独立命令,而是关于大多数其他命令的子组件的“表达式”。

运营商

SQLite 从最高到最低的优先顺序理解以下二元运算符:

||
*    /    %
+    -
<<   >>   &    |
<    <=   >    >=
=    ==   !=   <>   IS   IS NOT   IN   LIKE   GLOB   MATCH   REGEXP
AND   
OR

支持的一元前缀运算符如下:

-    +    ~    NOT

COLLATE 运算符是一个一元后缀运算符,它将一个排序序列分配给一个表达式。COLLATE 运算符具有比任何二元运算符和除“〜”之外的任何一元前缀运算符更高的优先级(绑定更紧密)。(COLLATE 和“〜”是关联的,所以它们的绑定顺序无关紧要。)由 COLLATE 运算符设置的整理顺序覆盖由表列定义中的COLLATE 子句确定的整理顺序。有关其他信息,请参阅有关数据类型在 SQLite3 文档中整理序列的详细讨论。

一元运算符+是一个空操作符。它可以应用于字符串,数字, Blob 或 NULL,并且它总是返回与操作数具有相同值的结果。

请注意,等于和不等于运算符有两个变体。等于可以是=或==。非等号运算符可以是!=或<>。|| 运算符是“连接” - 它将它的两个操作数字符串连接在一起。运算符%输出其左操作数的整数值取模其右操作数。换句话说,运算符%在 SQLite 中的工作方式与它在 ANSI-C 中的工作方式相同。

任何二元运算符的结果都是数值或 NULL,除了 || 连接运算符总是计算为 NULL 或文本值。

除非一个或两个操作数都为 NULL,否则 IS 和 IS NOT 运算符的工作方式与=和!=类似。在这种情况下,如果两个操作数均为 NULL,则 IS 运算符的计算结果为1(真),IS NOT 运算符的计算结果为0(假)。如果一个操作数是 NULL 而另一个不是,则 IS 运算符的计算结果为0(假),IS NOT 运算符的计算结果为1(真)。IS或IS NOT表达式不可能计算为 NULL。运算符 IS 和 IS 不具有与=相同的优先级。

Literal Values(常量)

字面值表示常量。文字值可以是整数,浮点数,字符串,BLOB 或 NULL。

整数和浮点文字(统称为“数字文字”)的语法如下图所示:

numeric-literal:

expression

如果数字文字有小数点或幂运算子句,或者其数值小于-9223372036854775808或大于9223372036854775807,则它是浮点数字。否则它是一个整数文字。开始浮点数字的乘方项的 “E” 字符可以是大写或小写。“。” 即使区域设置为该角色指定了“,”字符也始终用作小数点 - 小数点使用“,”会导致语法歧义。

十六进制整数文字遵循 “0x” 或 “0X” 后跟十六进制数字的 C 语言符号。例如,0x1234 表示与4660相同,0x8000000000000000表示与-9223372036854775808相同。十六进制整数文字被解释为64位二进制补码整数,因此被限制为十六个有效数字的精度。对 SQLite 版本3.8.6(2014-08-15)添加了对十六进制整数的支持。为了向后兼容,“0x”十六进制整数表示法只能由 SQL 语言解析器理解,而不能由类型转换例程来理解。包含格式为十六进制整数的文本的字符串变量由于 CAST 表达式或列亲和度转换或在执行数字操作或任何其他运行时转换之前,不会将字符串值强制转换为整数时被解释为十六进制整数。当以十六进制整数格式强制字符串值为整数值时,转换过程在看到 'x' 字符时停止,因此生成的整数值始终为零。当 SQLite 只出现在 SQL 语句文本中时,它只能理解十六进制整数表示法,而不是它作为数据库内容的一部分显示。当看到'x'字符时,转换过程停止,因此得到的整数值始终为零。当 SQLite 只出现在 SQL 语句文本中时,它只能理解十六进制整数表示法,而不是它作为数据库内容的一部分显示。当看到 'x' 字符时,转换过程停止,因此得到的整数值始终为零。当 SQLite 只出现在 SQL 语句文本中时,它只能理解十六进制整数表示法,而不是它作为数据库内容的一部分显示。

字符串常量是通过将字符串括在单引号(')中形成的。字符串中的单引号可以通过将两个单引号放在一行中进行编码 - 就像在 Pascal 中一样。不支持使用反斜杠字符的 C 样式转义,因为它们不是标准的 SQL。

BLOB 文字是包含十六进制数据的字符串文字,前面是单个 “x” 或 “X” 字符。例如:X'53514C697465'

字面值也可以是标记 “NULL”。

参数

“变量”或“参数”标记在表达式中为在运行时使用 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,...)接口将其最大参数数减少到编译时最大值以下。

LIKE,GLOB,REGEXP 和 MATCH 运营商

LIKE 运算符进行模式匹配比较。LIKE 运算符右侧的操作数包含模式,左侧操作数包含要与模式匹配的字符串。LIKE 模式中的百分号(“%”)与字符串中零个或多个字符的任何序列匹配。LIKE模式中的下划线(“_”)与字符串中的任何单个字符匹配。任何其他字符匹配其本身或其大写/小写大小写(即不区分大小写的匹配)。重要说明:默认情况下,SQLite 只能识别 ASCII 字符的大/小写。对于超出 ASCII 范围的 unicode 字符,LIKE 运算符默认为区分大小写。例如,表达式 'a'LIKE'A' 为 TRUE,但 ''LIKE'Æ' 是假的。ICU 对 SQLite 的扩展包括 LIKE 运算符的增强版本,它在所有 unicode 字符中进行大小写折叠。

如果存在可选的 ESCAPE 子句,则 ESCAPE 关键字后面的表达式必须求值为由单个字符组成的字符串。这个字符可以用在 LIKE 模式中以包含字面百分比或下划线字符。转义字符后跟一个百分号(%),下划线(_)或转义字符本身的第二个实例,分别与文字百分比符号,下划线或单个转义字符相匹配。

中缀 LIKE 运算符通过调用应用程序定义的 SQL 函数(如Y,X)或类似的函数(Y,X,Z)来实现。

LIKE 运算符可以使用 case_sensitive_like 编译指示来区分大小写。

GLOB 运算符类似于 LIKE,但是它的通配符使用 Unix 文件通配符语法。而且,与LIKE不同,GLOB 区分大小写。GLOB 和 LIKE 都可以在 NOT 关键字之前反转测试的意义。中缀 GLOB 操作符是通过调用函数 glob(YX)来实现的,可以通过覆盖该函数来修改。

REGEXP 运算符是 regexp()用户函数的特殊语法。默认情况下没有定义 regexp()用户函数,因此使用 REGEXP 运算符通常会导致错误消息。如果在运行时添加名为 “regexp” 的应用程序定义的 SQL 函数,那么 “ X REGEXP Y ” 运算符将作为 对 “regexp(Y,X)” 的调用而实现。

MATCH 运算符是 match()应用程序定义的函数的特殊语法。默认的 match()函数实现引发了一个异常,对任何事情都没有什么用处。但扩展可以用更有用的逻辑覆盖 match()函数。

BETWEEN 运算符

BETWEEN 运算符在逻辑上相当于一对比较。“ X BETWEEN Ÿ AND ž ” 等同于 “ X > = ý AND X <= ž ” 不同之处在于与之间时,X表达式仅被评估一次。BETWEEN 运算符的优先级与运算符==!=的优先级相同,LIKE 和组的优先级从左到右。

CASE 表达式

CASE 表达式在其他编程语言中的作用类似于 IF-THEN-ELSE。

在 CASE 关键字和第一个 WHEN 关键字之间出现的可选表达式称为“基本”表达式。CASE 表达式有两种基本形式:基本表达式和没有基本表达式的基本形式。

在没有基本表达式的 CASE 中,每个 WHEN 表达式都被计算并且结果被视为布尔值,从最左边开始并继续到右边。CASE 表达式的结果是对 THEN 表达式的评估,THEN 表达式对应于计算结果为 true 的第一个 WHEN 表达式。或者,如果没有 WHEN 表达式评估为真,则评估 ELSE 表达式的结果(如果有的话)。如果没有 ELSE 表达式并且没有 WHEN 表达式为真,则总体结果为 NULL。

在评估 WHEN 术语时,NULL 结果被认为是不真实的。

在具有基本表达式的 CASE 中,基本表达式仅被计算一次,并将结果与​​从每个 WHEN 表达式的评估从左到右进行比较。CASE 表达式的结果是评估 THEN 表达式,THEN 表达式对应于比较为真的第一个 WHEN 表达式。或者,如果没有任何 WHEN 表达式评估的值等于基本表达式,则评估 ELSE 表达式的结果(如果有的话)。如果没有 ELSE 表达式,并且 WHEN 表达式都不产生等于基本表达式的结果,则总体结果为 NULL。

将基本表达式与 WHEN 表达式进行比较时,应用相同的整理序列,相似性和 NULL 处理规则,就好像基本表达式和 WHEN 表达式分别是=运算符的左侧和右侧操作数一样。

如果基本表达式为 NULL,那么 CASE 的结果始终是评估 ELSE 表达式的结果(如果存在),否则返回 NULL。

CASE 表达式的两种形式都使用懒惰或短路评估。

以下两个 CASE 表达式之间唯一的区别在于,x 表达式在第一个示例中仅被计算一次,但在第二个示例中可能会被多次计算:

  • 案例 x 当 w1 然后 r1 当 w2 然后 r2 ELSE r3 结束
  • CASE 当 x = w1 则 r1 当 x = w2 则 r2 ELSE r3 END IN 和 NOT IN 运算符

IN 和 NOT IN 操作符在左边表达一个值,或者在右边的一个子查询。当 IN 或 NOT IN 运算符的右操作数是子查询时,子查询必须具有与左操作数的行值列中相同的列数。如果左表达式不是行值表达式,则 IN 或 NOT IN 运算符右侧的子查询必须是标量子查询。如果 IN 或 NOT IN 操作符的右操作数是值列表,则每个值必须是标量,而左表达式也必须是标量。IN 或 NOT IN 运算符的右侧可以是表名或表值函数名,在这种情况下右侧被理解为形式的子查询“(SELECT * FROM name)“。当右操作数是一个空集时,IN 的结果是假,NOT IN 的结果是真,不管左操作数是多少,即使左操作数是 NULL。

IN 或 NOT IN 运算符的结果由以下矩阵确定:

Left operand

NULL Right 操作数

包含 NULL Right 操作数

Left 操作数的空集

在 right 操作数内

IN 运算符结果

NOT IN 运算符无所谓 false 还是 true,NULL 请注意,SQLite 允许使用括号括起来的标量列表 IN 或 NOT IN 操作符右侧的值为空列表,但大多数其他 SQL 数据库数据库引擎和 SQL92 标准要求列表至少包含一个元素。

表列名称

列名可以是 CREATE TABLE 语句中定义的任何名称,也可以是以下特殊标识符之一:“ ROWID ”,“ OID ” 或 “ _ROWID_ ”。这三个特殊标识符描述与每个表的每一行关联的唯一整数键(rowid),因此在 WITHOUT ROWID 表上不可用。如果 CREATE TABLE 语句没有定义具有相同名称的实列,则特殊标识符仅引用行键。rowid 可以在任何可以使用常规列的地方使用。

EXISTS 运算符

EXISTS 操作符总是计算为整数值0和1中的一个。如果执行指定为 EXISTS 操作符的右侧操作数的 SELECT 语句将返回一个或多个行,则 EXISTS 操作符的计算结果为1.如果执行 SELECT 根本不会返回任何行,那么 EXISTS 运算符的计算结果为0。

SELECT 语句返回的每行中的列数(如果有)以及返回的特定值对 EXISTS 运算符的结果没有影响。特别是,包含 NULL 值的行与没有 NULL 值的行的处理方式不同。

子查询表达式

括号内的 SELECT 语句是一个子查询。所有类型的 SELECT 语句,包括聚合和复合 SELECT 查询(带有 UNION 或 EXCEPT 等关键字的查询)都被允许作为标量子查询。子查询表达式的值是所附 SELECT 语句结果的第一行。换句话说,隐含的 “LIMIT 1” 被添加到子查询中,覆盖了明确编码的 LIMIT。如果所包含的 SELECT 语句不返回任何行,则子查询表达式的值为 NULL。

返回单个列的子查询是一个标量子查询,可以在任何地方使用。返回两个或更多列的子查询是一个行值子查询,只能用作比较运算符的操作数。

相关子查询

用作标量子查询或作为 IN,NOT IN 或 EXISTS 表达式的右侧操作数的 SELECT 语句可能包含对外部查询中列的引用。这样的子查询被称为相关子查询。每次需要结果时,都会重新评估相关子查询。不相关的子查询只评估一次,并根据需要重新使用结果。

CAST 表达式

“CAST(expr AS type-name)” 形式的 CAST 表达式用于将 expr 的值转换为由 type-name 指定的不同存储类。CAST 转换与将列亲和力应用于某个值时发生的转换类似,但 CAST 操作符的转换总是发生,即使转换有损和不可逆转,而列亲和度仅更改值的数据类型如果变化是无损和可逆的。

如果 expr 的值是 NULL,那么 CAST 表达式的结果也是 NULL。否则,结果的存储类是通过将确定列关联的规则应用于类型名称来确定的。

Affinity of type-name   Conversion Processing     NONE   Casting a value to a type-name with no affinity causes the value to be converted into a BLOB. Casting to a BLOB consists of first casting the value to TEXT in the [encoding](pragma#pragma_encoding) of the database connection, then interpreting the resulting byte sequence as a BLOB instead of as TEXT.     TEXT   To cast a BLOB value to TEXT, the sequence of bytes that make up the BLOB is interpreted as text encoded using the database encoding.  Casting an INTEGER or REAL value into TEXT renders the value as if via [sqlite3\_snprintf()](c3ref/mprintf) except that the resulting TEXT uses the [encoding](pragma#pragma_encoding) of the database connection. 
 REAL   When casting a BLOB value to a REAL, the value is first converted to TEXT. When casting a TEXT value to REAL, the longest possible prefix of the value that can be interpreted as a real number is extracted from the TEXT value and the remainder ignored. Any leading spaces in the TEXT value are ignored when converging from TEXT to REAL. If there is no prefix that can be interpreted as a real number, the result of the conversion is 0.0. 
 INTEGER   When casting a BLOB value to INTEGER, the value is first converted to TEXT. When casting a TEXT value to INTEGER, the longest possible prefix of the value that can be interpreted as an integer number is extracted from the TEXT value and the remainder ignored. Any leading spaces in the TEXT value when converting from TEXT to INTEGER are ignored. If there is no prefix that can be interpreted as an integer number, the result of the conversion is 0. The CAST operator understands decimal integers only — conversion of [hexadecimal integers](lang_expr#hexint) stops at the "x" in the "0x" prefix of the hexadecimal integer string and thus result of the CAST is always zero. 

将 REAL 值强制转换为 INTEGER 会导致 REAL 值和零之间的最接近 REAL 值的整数。如果REAL大于最大可能的有符号整数(+9223372036854775807),那么结果是最大可能的有符号整数,如果 REAL 小于最小可能的有符号整数(-9223372036854775808),那么结果是最小可能的有符号整数。

在 SQLite 版本3.8.2(2013-12-06)之前,将一个大于+9223372036854775807.0的 REAL 值转换为一个整数导致了最负的整数-9223372036854775808。此行为旨在模仿 x86 / x64 硬件在执行等效强制转换时的行为。

 NUMERIC   Casting a TEXT or BLOB value into NUMERIC first does a forced conversion into REAL but then further converts the result into INTEGER if and only if the conversion from REAL to INTEGER is lossless and reversible. This is the only context in SQLite where the NUMERIC and INTEGER [affinities](datatype3#affinity) behave differently.  Casting a REAL or INTEGER value to NUMERIC is a no-op, even if a real value could be losslessly converted to an integer. 
Note that the result from casting any non-BLOB value into a BLOB and the result from casting any BLOB value into a non-BLOB value may be different depending on whether the database [encoding](pragma#pragma_encoding) is UTF-8, UTF-16be, or UTF-16le.  

布尔表达式

SQL 语言提供了几个上下文,在这些上下文中计算表达式并将结果转换为布尔值(true 或 false)。这些背景是:

  • SELECT,UPDATE 或 DELETE 语句的 WHERE 子句,
  • SELECT 语句中连接的 ON 或 USING 子句,
  • SELECT 语句的 HAVING 子句,
  • SQL 触发器的 WHEN 子句和
  • WHEN 子句或某些 CASE 表达式的子句。

要将 SQL 表达式的结果转换为布尔值,SQLite 首先将结果转换为 NUMERIC 值,方法与 CAST 表达式相同。数字零值(整数值0或实数值0.0)被认为是错误的。NULL 值仍然为 NULL。所有其他值都被认为是正确的。

例如,NULL,0.0,0,'english' 和 '0' 都被认为是错误的。值1,1.0,0.1,-0.1和'1 英语'被认为是正确的。

功能

SQLite 支持许多简单和集合的 SQL 函数。出于演示目的,简单的功能进一步细分为核心功能和日期时间功能。应用程序可以使用 sqlite3_create_function()接口添加用 C / C ++ 编写的新函数。

只要函数的两种形式的参数数量不同,就可以使用与简单函数名称相同的聚合函数。例如,具有单个参数的 max()函数是一个聚合函数,具有两个或多个参数的 max()函数是一个简单的函数。

Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By