返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

DB2 指定Schema
........................................
24

在 GBase 8s 中,为达到作为 root dbspace 的初始 chunk 镜像的 chunk,MIRROROFFSET
指定磁盘分区中的偏移量或设备中的偏移量。
onconfig.std 值
MIRROROFFSET 0

大于或等于 0 的任意值
单位
KB
生效
编辑 onconfig 文件并重启数据库服务器之后。

使用条件来测试数据是否满足某些限定条件。在语法图中您看到对条件的引用的
任何地方,请使用此段。
语法
条件

元素
描述
限制
语法
Logical_Operator
组合两个
条件
有效的选项是 OR ( =
logical union) 或 AND
( = logical
intersection)
带有 AND 或 OR
的条件
用法
条件是搜索标准,通过逻辑运算符 AND 或 OR 可选地连接起来。可将条件划分
为下列几类:

比较条件(也称为过滤器或布尔表达式)

带有子查询的条件

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1258

用户定义的函数(仅限于 GBase 8s )
条件可包含聚集函数,仅当它用在 SELECT 语句的 HAVING 子句中,或在子查
询的 HAVING 子句中。
在 DELETE、SELECT 或 UPDATE 语句的 WHERE 子句中的条件中不可出现聚集函
数,除非下列二者都是 TRUE:

起源于父查询的相关列上的聚集。

WHERE 子句出现在 HAVING 子句内的子查询中。
在 GBase 8s 中,在下列上下文中,用户定义的函数作为条件是无效的:

在 SELECT 语句的 HAVING 子句中

在检查约束的定义中
在下列上下文中,SPL 例程作为条件是无效的:

在检查约束的定义中

在 SELECT 语句的 ON 子句中

在 DELETE、SELECT 或 UPDATE 语句的 WHERE 子句中
在下列上下文中,外部的例程作为条件是无效的:

在检查约束的定义中

在 SELECT 语句的 ON 子句中

在 DELETE、SELECT 或 UPDATE 语句的 WHERE 子句中

在 CREATE TRIGGER 的 WHEN 子句中

在 SPL 的 IF、CASE 或 WHILE 语句中
比较条件(布尔表达式)
比较表达式常被称为布尔表达式,因为它们返回 TRUE 或 FALSE 结果。
六种布尔运算符可指定比较条件:

关系运算符

[NOT] BETWEEN … AND 运算符

[NOT] IN 运算符

IS [NOT] NULL 运算符

触发器类型运算符

[NOT] LIKE 或 MATCHES 运算符
在此图中总结它们的语法并在后面的部分说明。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1259
比较条件

元素
描述
限制
语法
char
在括起来的字符串中要作为转
义字符的 ASCII 字符。单引号
(')和双引号(" )作为
char 是无效的。
请参阅 ESCAPE 与
LIKE 一起使用 和
ESCAPE 与 MATCHES
一起使用
引用字
符串
column
列名称(或 ROW 类型列的字
段),以其数据值与 NULL、与
string 或与另一 column 做比

可通过标识符、同
义词或表或视图的
别名来限定。
请参阅
列名称
expression
返回单个值的 SQL 表达式
必须返回单个值
表达式
string
通过单引号(')或双引号
(" )定界的字符串
两个定界符必须是
相同的
请参阅
引用字
符串
下列部分描述比较条件的不同类型:

关系运算符条件

BETWEEN 条件

IN 条件

IS NULL 和 IS NOT NULL 条件

LIKE 和 MATCHES 条件。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1260
要获取在 SELECT 语句的上下文中比较条件的讨论,请参阅 在 WHERE 子句中
使用条件。
警告: 比较条件中的字面 DATE 或 DATETIME 值应为年份指定 4 为数字。
当您指定 4 位字符年份时,DBCENTURY 环境变量对结果不起作用。当您指定 2
位数字年份时,DBCENTURY 可影响数据库服务器解释比较条件的方式,这可能产
生您不希望的结果。要获取更多关于 DBCENTURY 的信息,请参阅 GBase 8s SQL
参考指南。
列名称
Column Name 段可为比较条件中的一个元素。列的名称(或 ROW 数据类型的列
内一个或多个字段)不是比较的主体,但数据库服务器使用此 SQL 标识符来访
问数据库表或视图中指定列的或行字段的数据值。
列名称

元素
描述
限制
语法
alias
表或视图的临
时的替换名称
必须在 SELECT 语句的 FROM
子句中定义
标识符
column
列的名称
在指定的表中必须存在
标识符
field
在 ROW 类型列
中要比较的字

必须是 row-column name 或
field name(对于嵌套的行)
的组件
标识符
row_column 类型 ROW 的列 必须是现有的命名的 ROW 类型
或未命名的 ROW 类型
标识符
synonym、
table、view
同义词、表或
视图的名称
synonym 和它指向的表或视图
必须在数据库中存在
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1261
要获取更多关于在这些条件中 column 名称的含义的信息,请参阅 IS NULL 和
IS NOT NULL 条件 和 LIKE 和 MATCHES 条件。
条件中的引号
当您将列表达式与任何比较条件中的常量表达式做比较时,请遵守下列规则:

如果该列有数值数据类型,则请不要在引号之间括起常量表达式。

如果该列有字符数据类型,则请在引号之间括起常量表达式。

如果该列有时间数据类型,则请在引号之间括起常量表达式。
否则,您可能得不到期望的结果。
下列示例展示在比较条件中引号的正确用法。在此,ship_instruct 列有字符数
据类型,order_date 列有日期数据类型,而 ship_weight 列有数值数据类型。
SELECT * FROM orders
WHERE ship_instruct = 'express'
AND order_date > '05/01/98'
AND ship_weight < 30;
关系运算符条件
关系运算符定量地比较两个表达式。
要获取受到支持的关系运算符及其描述的列表,请参阅 关系运算符。
下列示例展示一些关系运算符条件:
city[1,3] = 'San'
o.order_date > '6/12/98'
WEEKDAY(paid_date) = WEEKDAY(CURRENT- (31 UNITS DAY))
YEAR(ship_date) < YEAR (TODAY)
quantity <= 3
customer_num <> 105
customer_num != 105
关系运算符条件中的运算对象不可有 UNKNOWN 或 NULL 值。如果 condition
内的表达式有 UNKNOWN 值,则由于它引用未初始化的变量,数据库服务器会
产生异常。
NULL 值的条件测试

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1262
如果 condition 内的任何表达式求值为 NULL,则 condition 不可为真,除非
您正在使用 IS NULL 运算符显式地进行测试。例如,如果 paid_date 列有
NULL 值,则下列查询都不可检索那一行:
SELECT customer_num, order_date FROM orders
WHERE paid_date = '';
SELECT customer_num, order_date FROM orders
WHERE NOT (paid_date !='');
您必须使用 IS NULL 运算符来测试 NULL 值,如下一示例所示。
SELECT customer_num, order_date FROM orders
WHERE paid_date IS NULL;
在 IS NULL 和 IS NOT NULL 条件 中描述 IS NULL 运算符及其逻辑反、IS
NOT NULL 运算符。
BETWEEN 条件
使用 BETWEEN 条件来测试数字表达式、字符表达式或时间表达式的值是否在
指定的范围内。
BETWEEN 条件

用法
NULL 值不可满足该条件。定义的范围可求值为 NULL 的表达式也不可满足。
BETWEEN 条件中的三个表达式必须满足这些限制:

所有三个表达式都必须求值为相互可比的数值、时间或字符数据类型。

紧跟在 BETWEEN 关键字之后的表达式的值必须小于跟在 AND 关键字之
后的表达式的值。
BETWEEN 条件中的数值和时间表达式
对于数值表达式,小于意味着在数轴的左边。
对于 DATE 和 DATETIME 表达式,小于意味着时间较早。
对于 INTERVAL 表达式,小于意味着更短的时间跨度。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1263
BETWEEN 条件中的字符表达式
对于 CHAR、VARCHAR 和 LVARCHAR 表达式,小于意味着在代码集顺序之
前。
对于 NCHAR 和 NVARCHAR 表达式,小于 意味着在本地化的排序顺序之前,
如果存在一个的话;否则小于意味着在代码集合顺序之前。
如果该语言环境定义了排序顺序的话,则将基于语言环境的排序顺序用于
NCHAR 和 NVARCHAR 表达式。因此,对于 NCHAR 和 NVARCHAR 表达
式,小于意味着在基于语言环境的排序顺序之前。要获取更多关于基于语言环境
的排序顺序以及 NCHAR 和 NVARCHAR 数据类型的信息,请参阅 GBase 8s
GLS 用户指南。
要获取关于在有 NLCASE INSENSITIVE 属性的数据库中带有 NCHAR 和
NVARCHAR 运算对象的关系运算符表达式如何不同于在区分大小写的数据库中
它们的行为的信息,请参阅主题 在区分大小写的数据库中的 NCHAR 和
NVARCHAR 表达式。
BETWEEN 条件中的 NOT 关键字
对于要为 TRUE 的 BETWEEN 条件,依赖于您是否包括 NOT 关键字。

如果您省略 NOT 关键字,则仅当 BETWEEN 关键字左边的表达式的值在
BETWEEN 关键字右边的两个表达式的包括范围之中时,BETWEEN 条件
才为 TRUE。

如果 NOT 关键字在 BETWEEN 关键字的紧前边,则仅当 BETWEEN 关
键字左边的表达式的值不在 BETWEEN 关键字的右边的两个表达式的值
的包括范围之中时,BETWEEN 条件才为 TRUE。
否则,BETWEEN 条件为 FALSE。
BETWEEN 条件的示例
下列示例说明 BETWEEN 条件:
order_date BETWEEN '6/1/97' and '9/7/97'
zipcode NOT BETWEEN '94100' and '94199'
EXTEND(call_dtime, DAY TO DAY) BETWEEN
(CURRENT - INTERVAL(7) DAY TO DAY) AND CURRENT
lead_time BETWEEN INTERVAL (1) DAY TO DAY

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1264
AND INTERVAL (4) DAY TO DAY
unit_price BETWEEN loprice AND hiprice
IN 条件
当项列表中包括该关键字左边的表达式时,满足 IN 条件。
IN 条件

元素
描述
限制
语法
collection_col
在 IN 条件中使用的
集合列的名称
该列必须在指定的表
中存在
标识符
如果您指定 NOT 运算符,则当该表达式不在项的列表中时,该 IN 条件为
TRUE。NULL 值不满足 IN 条件。
下列示例展示一些 IN 条件:
WHERE state IN ('CA', 'WA', 'OR')
WHERE manu_code IN ('HRO', 'HSK')
WHERE user_id NOT IN (USER)
WHERE order_date NOT IN (TODAY)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1265
在 GBase 8s ESQL/C 中,在执行时刻对内建的 TODAY 函数求值。当打开游标
或当执行查询时,对内建的 CURRENT 函数求值,如果它是单个 SELECT 语句
的话。
内建的 USER 函数区分大小写;例如,它将 minnie 与 Minnie 解释为不同的
值。
使用带有集合数据类型的 IN 运算符
您可使用 IN 运算符来确定集合中是否包含某个元素。
集合可为简单的集合或嵌套的集合。(在嵌套的集合类型中,集合的元素类型也
是集合类型。)当您使用 IN 来搜索集合中的元素时,IN 左边或右边的表达式不
可包含 BYTE 或 TEXT 数据类型。
假设您创建包含两个集合列的下列表:
CREATE TABLE tab_coll
(
set_num SET(INT NOT NULL),
list_name LIST(SET(CHAR(10) NOT NULL) NOT NULL)
);
下列语句片段展示您可能对 tab_coll 表的集合列上的搜索条件使用 IN 运算符
的方式:
WHERE 5 IN set_num
WHERE 5.0::INT IN set_num
WHERE "5" NOT IN set_num
WHERE set_num IN ("SET{1,2,3}", "SET{7,8,9}")
WHERE "SET{'john', 'sally', 'bill'}" IN list_name
WHERE list_name IN ("LIST{""SET{'bill','usha'}"",
""SET{'ann' 'moshi'}""}",
"LIST{""SET{'bob','ramesh'}"",
""SET{'bomani' 'ann'}""}")
通常,当您在集合数据类型上使用 IN 运算符时,数据库服务器检查 IN 运算符
左边的值是否是 IN 运算符右边值的集合中的一个元素。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1266
IS NULL 和 IS NOT NULL 条件
如果紧接在 IS 关键字之前的术语指定下列未定义的值之一,则满足该 IS NULL
条件:

包含空值的 column 的名称。

求值为空的 expression。
反之,如果您使用 IS NOT NULL 运算符,则当 column 包含一个非空的值时,
或当紧接在 IS NOT NULL 关键字之前的 expression 求值不为空时,满足该条
件。
假设您希望在可包含 NULL 值的列上执行算术计算。您可创建表、将值插入到表
内,然后为了数据计算执行一使用将空值转换为 0 的通用的 CASE 表达式的查
询:
CREATE TABLE employee (emp_id INT, savings_in_401k INT, total_salary
INT);

INSERT INTO employee VALUES(1, 5000, 40000);
INSERT INTO employee VALUES(2, 0, 40000);
INSERT INTO employee VALUES(3, NULL, 100000);

SELECT emp_id, savings_in_401k AS employer_match FROM employee
WHERE
CASE WHEN(savings_in_401k IS NULL) THEN 0
ELSE savings_in_401k END * 0.06 > 0;
此示例展示通过使用 CASE 表达式中的 IS NULL,您可为不可计算的条目提供
值,因为空不是有效的数值。
如果该列包含空值,或如果该表达式由于包含一个或多个空值而不可求值,则满
足 IS NULL 条件。如果您使用 IS NOT NULL 运算符,则当运算对象是不为空
的列值,或是求值不为空的表达式时,满足该条件。
触发器类型的布尔运算符
GBase 8s 的触发器类型的布尔运算符可在运行时测试当前正在执行的触发器活动
是否是通过 DML 事件的指定的类型触发了的。这些运算符不使用操作对象。
触发器类型的布尔运算符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1267

如果当前正在执行的触发器的触发事件是对应于操作符的名称的 DML 操作,则
这些操作符返回 TRUE ('t'),否则它们返回 FALSE ('f')。在 IF 语句中,在 CASE
表达式中,以及在布尔条件为有效的 SPL 触发器例程内的其他上下文中,这些操
作符是有效的。
例如,在下列语句片断中,仅当通过 INSERT 事件激活的当前正在执行的触发器
时,才执行第一个 THEN 子句中的 LET 语句,且仅当通过 DELETE 事件激活了该
触发器时,才执行第二个 THEN 子句中的 LET 语句:
IF (INSERTING = 't') THEN
LET square = NEW.X * NEW.X
ELIF (DELETING = 't') THEN
LET square = 0
仅在表上触发器或(对于 DELETING、INSERTING 和 UPDATING 运算符)在
视图上 INSTEAD OF 触发器的 FOR EACH ROW 触发的活动中调用的触发器
UDR 中,SELECTING、DELETING、INSERTING 和 UPDATING 运算符才是
有效的。如果您尝试在任何其他的上下文中使用触发器类型的布尔运算符,则发
出错误。
如果通过 MERGE 语句已激活了的 Delete、Insert 或 Update 触发器调用触发器
例程,则

在 MERGE 正在从目标表删除行时,DELETING 返回 TRUE。

在 MERGE 正在将行插入到目标表内时,INSERTING 返回 TRUE。

在 MERGE 正在更新目标表的行时,UPDATING 返回 TRUE。
LIKE 和 MATCHES 条件
LIKE 或 MATCHES 条件测试字符串的匹配。
当下列测试为 TRUE 时,条件为 TRUE,或满足:

左边的列的值与括起来的字符串指定的模式相匹配。您可在字符串中使用
通配符。NULL 值不满足该条件。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1268

左边的列的值与右边指定的列的模式相匹配。右边的列的值用作该条件中
的匹配模式。
如果括起来的字符串包括字面字符,这些字符与 LIKE 或 MATCHES 运算符识
别的任何通配符相匹配,则 ESCAPE 子句可定义您可在括起来的字符串中包括的
ASCII 字符。当将左边的列值与括起来的字符串相比较时,将紧跟在转义字符之
后的下一字符解释为字面字符,而不解释为通配符,且忽略该转义字符。LIKE
和 MATCHES 运算符识别不同的通配符。要获取更多关于 LIKE 和 MATCHES
转义字符的信息,请参阅 ESCAPE 与 LIKE 一起使用 和 ESCAPE 与
MATCHES 一起使用 主题。
您仅可使用带有括起来的字符串的单引号(')来匹配字面的单引号;您不可使用
ESCAPE 子句。您可使用单引号字符作为与任何其他模式相匹配的转义字符,如
果您将它写作 '''' 这样的话。
重要: 您在 LIKE 或 MATCHES 条件中指定的列应为简单的字符数据类型,像
CHAR、LVARCHAR、NCHAR、NVARCHAR 或 VARCHAR。例如,您不可在 LIKE 或
MATCHES 条件中指定复合的数据类型,诸如 ROW 类型列。(ROW 类型列是声明为
命名的或未命名的 ROW 类型的列。)类似地,数据库服务器不可对使用带有简单
大对象或智能大对象列(诸如 CLOB 列)的 LIKE 或 MATCHES 的条件求值;包括
此条件的查询失败并报错 -640。
NOT 运算符
当左边的列有一非 NULL 的值,且与括起来的字符串指定的模式不匹配时,NOT
运算符使得该搜索条件成功。
例如,下列条件排除 lname 列中以字符 Baxter 开头的所有行:
WHERE lname NOT LIKE 'Baxter%'
WHERE lname NOT MATCHES 'Baxter*'
LIKE 运算符
LIKE 是用于将列值与另一列值或括起来的字符串相比较的 ANSI/ISO 标准运算
符。
LIKE 运算符支持括起来的字符串中的这些通配符。
通配符 作用

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1269
% 与零个或多个字符相匹配
_ 与任何单个字符相匹配
除了 % 和 _ 之外,当 DEFAULTESCCHAR 配置参数和 DEFAULTESCCHAR
会话环境变量都未设置时,LIKE 支持第三个通配符:
通配符 作用
\ 移除下一字符的特殊意义(通过指定 \% 或 \_ 或 \\ 来匹配
字面的 % 或 _ 或 \)
使用反斜杠(\)符号作为缺省的转义字符(当未设置 DEFAULTESCCHAR 时)
是对 SQL 的 ANSI/ISO 标准的 GBase 8s 扩展。通过将 DEFAULTESCCHAR
值设置为那个字符,您可指定反斜杠(\)符号或某些其他 ASCII 字符作为缺省
的转义字符。要获取更多信息,请参阅 DEFAULTESCCHAR 环境选项。
在符合 ANSI 的数据库中,您仅可使用 LIKE 转义字符来转义百分号(%)、下
划线(_)或转义字符自身。
下列条件单独或在更长的字符串中测试字符串 tennis 的 description 列,诸如
tennis ball 或 table tennis paddle:
WHERE description LIKE '%tennis%' ESCAPE '\'
下一个示例测试包含一下划线字符的行的 description。在此,反斜杠(\)转义
字符是必要的,因为下划线(_)是通配符。
WHERE description LIKE '%\_%' ESCAPE '\'
LIKE 运算符有一相关联的名为 like( ) 的运算符函数。您可定义 like( ) 函数来处
理您自己的用户定义的数据类型。另请参阅 GBase 8s 用户定义的例程和数据类
型开发者指南 。
MATCHES 运算符
MATCHES 运算符是用于将列值与另一列值或括起来的字符串相比较的 GBase 8s
扩展。
MATCHES 运算符支持括起来的字符串中的这些通配符。
通配符 作用
* 与零个或多个字符的任何字符串相匹配

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1270
? 与任何单个字符相匹配
[ . . . ] 与包括范围的任何括起来的字符相匹配,如在 [a-z] 中那样。不可
转义方括号内的字符。
^ 作为方括号内的第一个字符,与未罗列的任何字符相匹配。因此,
[^abc] 与除了 a、b 或 c 之外的任何字符相匹配。
\ 移除下一字符的特殊意义(通过指定 \\ 或 \* 或 \?,等等,来
与字面的 \ 或任何其他通配符相匹配)
下列条件单独或在更长的字符串内测试字符串 tennis,诸如 tennis ball 或 table
tennis paddle:
WHERE description MATCHES '*tennis*'
对于名称 Frank 和 frank,下列条件为 TRUE:
WHERE fname MATCHES '[Ff]rank'
对于以 F 或 f 开头的任何名称,下列条件为 TRUE:
WHERE fname MATCHES '[Ff]*'
对于任何以字母 a、b、c 或 d 结尾的任何名称,下一条件为 TRUE:
WHERE fname MATCHES '*[a-d]'
MATCHES 有一相关联的 matches( ) 运算符函数。您可为您自己的用户定义的数
据类型定义 matches( ) 函数。要获取更多信息,请参阅 GBase 8s 用户定义的例
程和数据类型开发者指南 。
如果 DB_LOCALE 或 SET COLLATION 指定支持本地化排序的非缺省的语言
环境,且您使用方括号([ . . . ])符号为 MATCHES 运算符指定范围,则数据库
服务器使用本地化的排序顺序,而不是代码集顺序,来解释该范围并比较那些有
CHAR、CHARACTER VARYING、LVARCHAR、NCHAR、NVARCHAR 和
VARCHAR 数据类型的值。
通常的规则是,仅可在本地化的排序顺序中比较 NCHAR 和 NVARCHAR 数据
类型,此行为是该规则的例外。要获取更多关于包括 MATCHES 或 LIKE 运算
符的条件的 GLS 方面的信息,请参阅 GBase 8s GLS 用户指南。
在 NLSCASE INSENSITIVE 数据库中,对 NCHAR 和 NVARCHAR 数据的比
较操作不理会大小写的差异,因此数据库服务器将包含相同序列字符的字符串之

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1271
中的大写变量作为重复处理。作为 MATCH 运算符的运算对象,下列字符串的所
有对都返回 TRUE:
'beta' 'Beta' 'BETA' 'bETa' 'betA' 'BetA'
要获取更多信息,请参阅 在 NLSCASE INSENSITIVE 数据库中重复的行 和 在
区分大小写的数据库中的 NCHAR 和 NVARCHAR 表达式。
ESCAPE 与 LIKE 一起使用
ESCAPE 子句可指定与缺省的转义字符不同的一个转义字符。通过
DEFAULTESCCHAR 配置参数或 DEFAULTESCCHAR 会话环境选项设置缺省
的转义字符。
例如,如果您在 ESCAPE 子句中指定 z,则将包含了 z_ 的括起来的字符串运算
对象解释为包括字面的下划线(_)字符,而不将 _ 作为通配符。 类似地,将
z% 解释作为字面的百分号(% ),而不将 % 当做通配符。最后,会将字符串中
的字符 zz 解释为单个字面的 z。 下列语句从 customer 表检索行,其中的
company 列包括字面的下划线字符:
SELECT * FROM customer WHERE company LIKE '%z_%' ESCAPE 'z';
您还可使用包含单个字符的主变量。下一语句使用主变量来指定一转义字符:
EXEC SQL BEGIN DECLARE SECTION;
char escp='z';
char fname[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL select fname from customer
into :fname where company like '%z_%' escape :escp;
ESCAPE 与 MATCHES 一起使用
ESCAPE 子句可指定与缺省的转义字符不同的转义字符。通过
DEFAULTESCCHAR 配置参数或 DEFAULTESCCHAR 会话环境选项设置缺省
的转义字符。
使用此作为您想要的缺省的转义字符,反斜杠,来在括起来的字符串中包括问号
(?)、星号(*)、插入符(^) 或左方括号([)或右方括号(])作为字面的字
符,以防止将它们解释为特殊字符。如果您选择使用 z 作为该转义字符,则字符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1272
串中的字符 z? 代表字面的问号(?)。类似地,字符 z* 代表字面的星号
(*)。最后,字符串中的字符 zz 代表单个字符 z。
下列示例从 customer 表检索行,其中的 company 列的值包括问号(?):
SELECT * FROM customer WHERE company MATCHES '*z?*' ESCAPE 'z';
独立条件
独立条件可为没有显式地罗列在比较条件的语法中的任何表达式。仅当表达式返
回 BOOLEAN 值时,它作为条件才是有效的。例如,下列示例返回 BOOLEAN
数据类型的值:
funcname(x)
带有子查询的条件
在条件内包括 SELECT 语句,指定带有子查询的条件。您可在 SELECT、
INSERT、DELETE 或 UPDATE 语句中使用子查询来执行下列这样的任务:

将表达式与查询的结果作比较。

确定查询的结果中是否包括表达式。

询问查询是否选择任何行。
带有子查询的条件

子查询可依赖于外部 SELECT 语句正在求值的当前行;在此情况下,该子查询称
为相关的子查询。(要获取相关的子查询及其对性能的影响的讨论,请参阅
GBase 8s SQL 教程指南。)
下列部分描述子查询条件及其语法。

要获取在 SELECT 语句的上下文中子查询条件的类型的讨论,请参阅
在 WHERE 子句中使用条件。

要获取在 INSERT 语句的上下文中子查询条件的类型的讨论,请参阅
SELECT 语句的子集。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1273

要获取在 DELETE 语句的上下文中子查询条件的类型的讨论,请参阅
DELETE 的 WHERE 子句中的子查询。

要获取在 UPDATE 语句的上下文中子查询条件的类型的讨论,请参阅
UPDATE 的 WHERE 子句中的子查询。
依赖于子查询的上下文,子查询可返回单个值、无值或值集。如果子查询返回
值,它必须仅选择单个列。如果子查询简单地检查一行(或多行)是否存在,则
它可选择任何数目的行和列。
子查询不可引用 BYTE 或 TEXT 列,也不可包含 ORDER BY 子句。然而,在
FROM 子句中指定表表达式的子查询可包括 ORDER BY 子句。
如果子查询的 FROM 子句指定外部语句在这些子句之一中引用的同一表或视图,
则子查询及其外部 DML 语句在同一表对象上操作:

在 DELETE 或 SELECT 语句的 FROM 子句中

在 INSERT 语句的 INTO 子句中

在 UPDATE 语句的“表选项”或“集合派生的表”规范中。
仅在 DELETE 或 UPDATE 语句的 WHERE 子句中,那些返回多行和与括起来
的 DML 语句操作的同一表或视图的子查询才是有效的。即使在此上下文中,这
样的子查询也返回错误 -360,除非满足所有下列条件:

该子查询不引用它的 FROM 列表中的任何列名称,它在 projection 列表
中未指定的表中

使用带有 Subquery 语法的 Condition 指定该子查询。

该子查询内的任何 SPL 例程不可引用正在修改的表。
下列程序片断包括在 UPDATE 和 DELETE 语句中带有子查询的条件的示例:
CREATE TABLE t1 ( a INT, a1 INT)
CREATE TABLE t2 ( b INT, b1 INT) ;
. . .
UPDATE t1 SET a = a + 10 WHERE EXISTS
(SELECT a FROM t1 WHERE a > 1);
UPDATE t1 SET a = a + 10 WHERE a IN
(SELECT a FROM t1, t2 WHERE a > b
AND a IN
(SELECT a FROM t1 WHERE a > 50 ) );
DELETE FROM t1 WHERE EXISTS

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1274
(SELECT a FROM t1);

要获取更多关于在 DELETE 语句中的子查询的信息,请参阅 DELETE 的
WHERE 子句中的子查询。
要获取更多关于在 UPDATE 语句中的子查询的信息,请参阅 UPDATE 的
WHERE 子句中的子查询。
IN 子查询
如果表达式的值与来自子查询的一个或多个值相匹配,则 IN 子查询条件为
TRUE。(该子查询必须仅返回一行,但它可返回多个列。)关键字 IN 等同于
=ANY 规范。关键字 NOT IN 等同于 !=ALL 规范。请参阅 ALL、ANY 和
SOME 子查询。
IN 子查询

元素
描述
限制
语法
subquery 内嵌的查询 不可包含 FIRST 子句也不可包含
ORDER BY 子句
SELECT 语

下列 IN 子查询的示例查找不包含 baseball gloves (stock_num = 1)的订单的订
单号:
WHERE order_num NOT IN
(SELECT order_num FROM items WHERE stock_num = 1)
由于 IN 子查询测试行的出现,因此子查询结果中的重复的行不影响主查询的结
果。因此,子查询中的 UNIQUE 或 DISTINCT 关键字对查询结果不起作用,尽
管不测试重复可提升查询性能。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1275
EXISTS 子查询条件
如果子查询返回行,则 EXISTS 子查询条件求值为 TRUE。以 EXISTS 子查询,
可返回一个或多个列。该子查询总是包含对主查询中表的列的引用。如果您在不
包含 HAVING 子句的 EXISTS 子查询中使用聚集函数,则总会返回至少一行。
EXISTS 子查询

元素
描述
限制
语法
subquery 内嵌的查询 不可包含 FIRST 子句也不可包含
ORDER BY 子句
SELECT 语

下列带有 EXISTS 子查询的 SELECT 语句的示例返回从未被订购(且因此未罗
列在 items 表中)的每个项的存货编号和制造商代码。您可在此 SELECT 语句
中适当地使用 EXISTS 子查询,因为您使用子查询来测试 items 中的
stock_num 以及 manu_code。
SELECT stock_num, manu_code FROM stock
WHERE NOT EXISTS (SELECT stock_num, manu_code FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code);
如果您在列名称的位置中的子查询中使用 SELECT *,则前面的示例同样奏效,
因为测试整行的存在;不测试特定的列值。
ALL、ANY 和 SOME 子查询
使用 ALL、ANY 和 SOME 关键字来指定何种情况下产生条件 TRUE 或
FALSE。当使用 ALL 关键字时,当使用 ANY 关键字时为 TRUE 的搜索条件可
能不为 TRUE,反之亦然。
ALL、ANY、SOME 子查询

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1276

元素
描述
限制
语法
subquery 嵌入的查询 不可包含 FIRST 或 ORDER BY 子句 SELECT 语句
使用 ALL 关键字
如果子查询返回的每个值的比较都为 TRUE,则 ALL 关键字指定该搜索条件为
TRUE。如果子查询未返回值,则该条件为 TRUE。
在下列示例中,第一个条件测试是否每一 total_price 都大于订单号 1023 中每
个项的总价。第二个条件使用 MAX 聚集函数来产生同样的结果。
total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)

total_price > (SELECT MAX(total_price) FROM items
WHERE order_num = 1023)
使用带有 ALL 子查询的 NOT 关键字测试对于子查询返回的至少一个元素是否
有一个表达式不为 TRUE。例如,当表达式 total_price 不大于所有被选择的值
时,下列条件为 TRUE。也就是说,当 total_price 不大于订单号 1023 中最高
的总价时,它为 TRUE。
NOT total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)
使用 ANY 或 SOME 关键字
ANY 关键字表示,如果对于至少一个返回值的比较是 TRUE,则搜索条件为
TRUE。如果子查询未返回值,则搜索条件为 FALSE。SOME 关键字是 ANY 的
同义词。
当总价大于订单号 1023 中至少一个项的总价时,下列条件为 TRUE。第一个条件
使用 ANY 关键字;第二个使用 MIN 聚集函数:
total_price > ANY (SELECT total_price FROM items

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1277
WHERE order_num = 1023)

total_price > (SELECT MIN(total_price) FROM items
WHERE order_num = 1023)
使用带有 ANY 子查询的 NOT 关键字测试对于子查询返回的所有元素表达式是
否不是 TRUE。例如,当表达式 total_price 不大于任何被选择的值时,下列条
件为 TRUE。也就是说,当 total_price 不大于订单号 1023 中的总价时,它是
TRUE。
NOT total_price > ANY (SELECT total_price FROM items
WHERE order_num = 1023)
省略 ANY、ALL 或 SOME 关键字
如果您知道子查询将正好返回一个值,则您可省略子查询中的关键字 ANY、ALL
或 SOME。如果您省略 ANY、ALL 或 SOME 关键字,且该子查询返回多个
值,则您收到错误。在下列示例中的子查询仅返回一行,因为它使用聚集函数:
SELECT order_num FROM items
WHERE stock_num = 9 AND quantity =
(SELECT MAX(quantity) FROM items WHERE stock_num = 9);
NOT 运算符
如果您以关键字 NOT 作为条件的开始,则仅当 NOT 限定的条件为 FALSE
时,该测试才是 TRUE。如果 NOT 限定的条件有一 NULL 或一 UNKNOWN
值,则 NOT 运算符无效。
下列真值展示带有 3– 有值的布尔运算对象的 NOT 的作用。在此,T
代表 TRUE 条件,F 代表 FALSE 条件,且问号(?)表示
UNKNOWN 条件。(当运算对象为 NULL 时,可发生 UNKNOWN
值)。

左边的列展示 NOT 运算符的运算对象的值,右边的列展示将 NOT 应用于操作
对象之后返回的值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1278
带有 AND 或 OR 的条件
您可将简单的条件与逻辑运算符 AND 或 OR 组合来形成复合的条件。
下列 SELECT 语句在它们的 WHERE 子句中包含复合的条件的示例:
SELECT customer_num, order_date FROM orders
WHERE paid_date > '1/1/97' OR paid_date IS NULL;
SELECT order_num, total_price FROM items
WHERE total_price > 200.00 AND manu_code LIKE 'H
SELECT lname, customer_num FROM customer
WHERE zipcode BETWEEN '93500' AND '95700'
OR state NOT IN ('CA', 'WA', 'OR');
下列真值表展示 AND 和 OR 运算符的作用。字母 T 代表 TRUE 条
件,F 代表 FALSE 条件,问号(?)代表 UNKNOWN 值。当使用逻
辑运算符的表达式的一部分为 NULL 时,可发生 UNKNOWN 值。

在左边的临界值代表第一个操作对象,最上面一行中的值代表第二个操作对象。
每一 3x3 矩阵内的值展示将该操作符应用于那些值的操作对象之后所返回的值。
如果布尔表达式球值为 UNKNOWN。则不满足该条件。
请考虑下列 WHERE 子句内的示例:
WHERE ship_charge/ship_weight < 5 AND order_num = 1023
order_num = 1023 的行是 ship_weight 为 NULL 的行。因为 ship_weight 为
NULL,所以 ship_charge/ship_weight 也是 NULL;因此,
ship_charge/ship_weight < 5 的真值是 UNKNOWN。因为 order_num = 1023 为
TRUE,因此,AND 表声明整个条件的真值为 UNKNOWN。因此,不选择那行。如
果在 AND 的位置使用 OR 作为条件,则该条件会是 TRUE。