expression
SQL As Understood By SQLite
[Top]
表达
expr:
hide
literal-value:
show
raise-function:
show
select-stmt:
show
common-table-expression:
show
compound-operator:
show
join-clause:
show
join-constraint:
show
join-operator:
show
ordering-term:
show
result-column:
show
table-or-subquery:
show
type-name:
show
signed-number:
show
本部分与其他部分不同。本文档的大部分其他部分都会讨论特定的 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:
如果数字文字有小数点或幂运算子句,或者其数值小于-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(Y
,X
)来实现的,可以通过覆盖该函数来修改。
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()函数是一个简单的函数。