返回首页

gbase数据、南大通用产品文档:GBase8s创建比较条件

更新日期:2024年09月11日

SELECT 语句的 WHERE 子句指定了您想要看到的行。
比较条件使用特定关键字和运算符
来定义搜索条件。
例如,可使用 BETWEEN 、IN 、LIKE 或 MATCHES 中的一个来测试相等性。或者使
用关键字 IS NULL 来测试空值。可将关键字 NOT 与这些关键字中的任何一个组合来指
定相反条件。
下表列出可在 WHERE 子句中用来代替关键字测试相等性的关系运算符。
运算符
操作
=
等于
!= 或 <>
不等于
>
大于

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 32 -

>=
大于并或等于
<
小于
<=
小于或等于
对于 CHAR 表达式,大于在 ASCII 整理顺序中意味着之后,其中小写字母在大写字母之
后,
而大写字母和小写字母都在数字之后。
请参阅
《GBase 8s SQL 指南:
语法》
中的 ASCII
字符集图表。对于 DATE 和 DATETIME 表达式,大于意味着时间上更迟,对于
INTERVAL 表达式,它意味着更长的持续时间。
不能使用 TEXT 或 BYTE 列创建比较条件(使用 IS NULL 或 IS NOT NULL 关键字来
测试 NULL 值时除外)。
不能指定 BLOB 或 CLOB 列从而在 GBase 8s 上创建比较条件
(用 IS NULL 或 IS NOT
NULL 关键字来测试 NULL 值时除外)。
可以在 WHERE 子句中使用上述关键字或运算符来创建执行下列操作的比较条件查询:

包括值

排除值

查找值范围

查找值的子集

标识 NULL 值
要使用以下条件执行变量文本搜索,
在 WHERE 子句中使用上述关键字或运算符来创建比
较条件查询:

精确文本比较

单字符通配符

受限单字符通配符

可变长通配符

下标
下一节包含说明这些查询类型的示例。

包括行
在 WHERE 子句中使用等号(=)关系运算符包括行,如以下查询所示。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 33 -

图: 查询
SELECT customer_num, call_code, call_dtime, res_dtime
FROM cust_calls
WHERE user_id = 'maryj';
该查询返回以下行集。
图: 查询结果
customer_num call_code call_dtime res_dtime

106 D 1998-06-12 08:20 1998-06-12 08:25
121 O 1998-07-10 14:05 1998-07-10 14:06
127 I 1998-07-31 14:30

排除行
在 WHERE 子句中使用关系运算符 != 或 <> 排除行。
以下查询假设您从符合 ANSI 的数据库中选择;
该语句指定所有者或 customer 表的创建者
的登录名。当表的创建者就是当前用户时,或者当数据库不符合 ANSI 时,不需要此限定
符。
然而,
在任一情况下都可以包括该限定符。
有关所有者命名的详细讨论,
请参阅
《GBase
8s SQL 指南:语法》。
图: 查询
SELECT customer_num, company, city, state
FROM odin.customer
WHERE state != 'CA';

SELECT customer_num, company, city, state
FROM odin.customer
WHERE state <> 'CA';
此查询中的两个语句都通过指定在用户 odin 拥有的 customer 表中 state 列中的值不应等
于 CA 来排除值,如下所示。
图: 查询结果
customer_num company city state

119 The Triathletes Club Cherry Hill NJ
120 Century Pro Shop Phoenix AZ
121 City Sports Wilmington DE

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 34 -

122 The Sporting Life Princeton NJ
123 Bay Sports Jacksonville FL
124 Putnum's Putters Bartlesville OK
125 Total Fitness Sports Brighton MA
126 Neelie's Discount Sp Denver CO
127 Big Blue Bike Shop Blue Island NY
128 Phoenix College Phoenix AZ

指定一定范围的行
下列查询显示在 WHERE 子句中指定一定范围内行的两种方法。
图: 查询
SELECT catalog_num, stock_num, manu_code, cat_advert
FROM catalog
WHERE catalog_num BETWEEN 10005 AND 10008;

SELECT catalog_num, stock_num, manu_code, cat_advert
FROM catalog
WHERE catalog_num >= 10005 AND catalog_num <= 10008;
查询中的每个子句都指定 catalog_num 的范围,从 10005 至 10008(包括 10005 和
10008),第一个语句使用关键字,第二个语句使用关系运算符检索行。如下所示。
图: 查询结果
catalog_num 10005
stock_num 3
manu_code HSK
cat_advert High-Technology Design Expands the Sweet Spot

catalog_num 10006
stock_num 3
manu_code SHM
cat_advert Durable Aluminum for High School and Collegiate Athletes

catalog_num 10007
stock_num 4
manu_code HSK
cat_advert Quality Pigskin with Joe Namath Signature

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 35 -


catalog_num 10008
stock_num 4
manu_code HRO
cat_advert Highest Quality Football for High School
and Collegiate Competitions
尽管 catalog 表标记具有 BYTE 数据类型的列,
但该列不包括在此 SELECT 语句中,
原因
是输出将按列名只显示词 。可以编写 SQL API 应用程序来显示 TEXT 和
BYTE 值。

排除一定范围的行
以下查询使用关键字 NOT BETWEEN 排除 zipcode 列中字符范围在 94000 到 94999 的
行,如下所示。
图: 查询
SELECT fname, lname, city, state
FROM customer
WHERE zipcode NOT BETWEEN '94000' AND '94999'
ORDER BY state;
图: 查询结果
fname lname city state

Frank Lessor Phoenix AZ
Fred Jewell Phoenix AZ
Eileen Neelie Denver CO
Jason Wallack Wilmington DE
Marvin Hanlon Jacksonville FL
James Henry Brighton MA
Bob Shorter Cherry Hill NJ
Cathy O'Brian Princeton NJ
Kim Satifer Blue Island NY
Chris Putnum Bartlesville OK

使用 WHERE 子句查找值的子集
就像排除行,以下查询假定使用符合 ANSI 的数据库。所有者限定符在引号中,以保护文
字字符串的区分大小写。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 36 -

图: 查询
SELECT lname, city, state, phone
FROM 'Aleta'.customer
WHERE state = 'AZ' OR state = 'NJ'
ORDER BY lname;

SELECT lname, city, state, phone
FROM 'Aleta'.customer
WHERE state IN ('AZ', 'NJ')
ORDER BY lname;
查询中的每个语句在 Aleta.customer 表的 state 列中检索包括 AZ 或 NJ 子集的行。
图: 查询结果
lname city state phone

Jewell Phoenix AZ 602-265-8754
Lessor Phoenix AZ 602-533-1817
O'Brian Princeton NJ 609-342-0054
Shorter Cherry Hill NJ 609-663-6079
不能使用 IN 关键字来测试 TEXT 或 BYTE 列。
另外,当使用 GBase 8s 时,不能使用 IN 关键字来测试 BLOB 或 CLOB 列。
在查询(对符合 ANSI 的数据库进行查询的示例)中,表所有者名称两边没有引号。鉴于
图 1中两个语句搜索 Aleta.customer 表,以下查询搜索表 ALETA.customer,这是一个不同
的表,原因在于符合 ANSI 的数据库查看所有者名称的方式。
图: 查询
SELECT lname, city, state, phone
FROM Aleta.customer
WHERE state NOT IN ('AZ', 'NJ')
ORDER BY state;
上一个查询添加了关键字 NOT IN,以便子集更改为排除 state 列中的子集 AZ 和 NJ,下图
以 state 列的顺序显示结果。
图: 查询结果
lname city state phone

Pauli Sunnyvale CA 408-789-8075

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 37 -

Sadler San Francisco CA 415-822-1289
Currie Palo Alto CA 415-328-4543
Higgins Redwood City CA 415-368-1100
Vector Los Altos CA 415-776-3249
Watson Mountain View CA 415-389-8789
Ream Palo Alto CA 415-356-9876
Quinn Redwood City CA 415-544-8729
Miller Sunnyvale CA 408-723-8789
Jaeger Redwood City CA 415-743-3611
Keyes Sunnyvale CA 408-277-7245
Lawson Los Altos CA 415-887-7235
Beatty Menlo Park CA 415-356-9982
Albertson Redwood City CA 415-886-6677
Grant Menlo Park CA 415-356-1123
Parmelee Mountain View CA 415-534-8822
Sipes Redwood City CA 415-245-4578
Baxter Oakland CA 415-655-0011
Neelie Denver CO 303-936-7731
Wallack Wilmington DE 302-366-7511
Hanlon Jacksonville FL 904-823-4239
Henry Brighton MA 617-232-4159
Satifer Blue Island NY 312-944-5691
Putnum Bartlesville OK 918-355-2074

标识 NULL 值
使用 IS NULL 或 IS NOT NULL 选项检查 NULL 值。NULL 值表示没有数据或未知值。
NULL 值不等同于零或空白。
以下查询返回具有空 paid_date 的所有行,如下所示。
图: 查询
SELECT order_num, customer_num, po_num, ship_date
FROM orders
WHERE paid_date IS NULL
ORDER BY customer_num;
图: 查询结果
order_num customer_num po_num ship_date

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 38 -


1004 106 8006 05/30/1998
1006 112 Q13557
1007 117 278693 06/05/1998
1012 117 278701 06/29/1998
1016 119 PC6782 07/12/1998
1017 120 DM354331 07/13/1998

构成复合条件
要连接两个或多个比较条件或 Boolean 表达式,使用逻辑运算符 AND 、OR 和 NOT。
Boolean 表达式的值求出为 true 或 false ,如果涉及到 NULL 值,那么为 unknown。
在以下查询中,运算符 AND 组合 WHERE 子句中的两个比较表达式。
图: 查询
SELECT order_num, customer_num, po_num, ship_date
FROM orders
WHERE paid_date IS NULL
AND ship_date IS NOT NULL
ORDER BY customer_num;
该查询返回具有 NULL paid_date 或 NOT NULL ship_date 的所有值。
图: 查询结果
order_num customer_num po_num ship_date

1004 106 8006 05/30/1998
1007 117 278693 06/05/1998
1012 117 278701 06/29/1998
1017 120 DM354331 07/13/1998

使用精确文本比较
以下示例包含一个 WHERE 子句,
它通过使用关键字 LIKE 或 MATCHES 或者等号
(=)
关系运算符来搜索精确文本比较。与较早的示例不同,这些示例说明如何查询不在当前数
据库中的表。仅当包含该表的数据库与当前数据库的 ANSI 兼容状态相同时,才能访问不
在当前数据库中的表。如果当前数据库是符合 ANSI 的数据库,那么要访问的表必须也驻
留在符合 ANSI 的数据库中。如果当前数据库不是符合 ANSI 的数据库,那么要访问的
表必须也驻留在不符合 ANSI 的数据库中。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 39 -

虽然本章前面使用的数据库是演示数据库,但是下列示例中的 FROM 子句指定了由所有
者 bubba 创建的 manatee 表,该表驻留在名为 syzygy的符合 ANSI 的数据库中。有关如何
访问不在不在当前数据库中的表的更多信息,请参阅《GBase 8s SQL 指南:语法》。
下列查询中的每个语句检索 description 列中具有单词 helmet 的所有行,如下所示。
图: 查询
SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description = 'helmet'
ORDER BY mfg_code;

SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description LIKE 'helmet'
ORDER BY mfg_code;

SELECT stock_no, mfg_code, description, unit_price
FROM syzygy:bubba.manatee
WHERE description MATCHES 'helmet'
ORDER BY mfg_code;
该结果可能如下图所示。
图: 查询结果
stock_no mfg_code description unit_price

991 ABC helmet $222.00
991 BKE helmet $269.00
991 HSK helmet $311.00
991 PRC helmet $234.00
991 SPR helmet $245.00

使用变量文本搜索
可对基于字段的子串搜索的变量文本查询使用关键字 LIKE 和 MATCHES。包含关键字
NOT 以指示相反的条件。
关键字 LIKE 是 SQL 的 ISO/ANSI 标准,而 MATCHES 是 GBase 8s 扩展。
变量文本搜索字符串可将列出的通配符与下表中的 LIKE 或 MATCHES 包括在一起。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 40 -

下表显示了您可以与关键字 LIKE 和 MATCHES 一起使用的通配符。说明了这些符号及
其含义。
关键字
符号
含义
LIKE
%
求值为零或多个字符
LIKE
_
求值为单个字符
LIKE
\
对下一字符的特殊有效位数进行转义
MATCHES
*
求值为零个或多个字符
MATCHES
?
求值为单个字符(空值除外)
MATCHES
[ ]
求值为单个字符或一定范围内的值
MATCHES
\
对下一字符的特殊有效位数进行转义
不能使用 LIKE 或 MATCHES 运算符测试 BLOB 、CLOB 、TEXT 或 BYTE 列。

使用单字符通配符
下列查询中的语句说明如何在 WHERE 子句中使用单字符通配符。而且,它们还演示了如
何查询非当前数据库中的表。
stock 表位于数据库 sloth中。
除了在当前演示数据库外部之外,
sloth 还在称为 meerkat 的独立数据库服务器上。
有关更多信息,请参阅在外部数据库中访问和修改数据和《 GBase 8s SQL 指南:语法》。

图: 查询
SELECT stock_num, manu_code, description, unit_price
FROM sloth@meerkat:stock
WHERE manu_code LIKE '_R_'
AND unit_price >= 100
ORDER BY description, unit_price;

SELECT stock_num, manu_code, description, unit_price
FROM sloth@meerkat:stock
WHERE manu_code MATCHES '?R?'
AND unit_price >= 100
ORDER BY description, unit_price;
查询中的每个语句只检索 manu_code 的中间字母是 R 的那些行。
如下所示。
比较 '_R_' (对
于 LIKE)或 '?R?' (对于 MATCHES)从左到右指定下列项:

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 41 -


任何单个字符

字母 R

任何单个字符
图: 查询结果
stock_num manu_code description unit_price

205 HRO 3 golf balls $312.00
2 HRO baseball $126.00
1 HRO baseball gloves $250.00
7 HRO basketball $600.00
102 PRC bicycle brakes $480.00
114 PRC bicycle gloves $120.00
4 HRO football $480.00
110 PRC helmet $236.00
110 HRO helmet $260.00
307 PRC infant jogger $250.00
306 PRC tandem adapter $160.00
308 PRC twin jogger $280.00
304 HRO watch $280.00
指定一定范围内的词首字符的 WHERE 子句
下列查询只选择 manu_code 以 A 到 H 开头的那些列,并返回结果显示的行。测试 '[A-H]'
指定从 A 到 H 之间(包括 A 和 H)的任何一个字母。对于 LIKE 关键字,不存在等价的
通配符。
图: 查询
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE manu_code MATCHES '[A-H]*'
ORDER BY description, manu_code;
图: 查询结果
stock_num manu_code description unit_price

205 ANZ 3 golf balls $312.00
205 HRO 3 golf balls $312.00
2 HRO baseball $126.00

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 42 -

3 HSK baseball bat $240.00
1 HRO baseball gloves $250.00
1 HSK baseball gloves $800.00
7 HRO basketball $600.00

313 ANZ swim cap $60.00
6 ANZ tennis ball $48.00
5 ANZ tennis racquet $19.80
8 ANZ volleyball $840.00
9 ANZ volleyball net $20.00
304 ANZ watch $170.00
具有可变长通配符的 WHERE 子句
下列查询中的语句在字符串的末尾使用通配符来检索 description 以字符 bicycle 开头的所
有行。
图: 查询
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description LIKE 'bicycle%'
ORDER BY description, manu_code;

SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description MATCHES 'bicycle*'
ORDER BY description, manu_code;
任一语句都返回以下行。
图: 查询结果
stock_num manu_code description unit_price

102 PRC bicycle brakes $480.00
102 SHM bicycle brakes $220.00
114 PRC bicycle gloves $120.00
107 PRC bicycle saddle $70.00
106 PRC bicycle stem $23.00
101 PRC bicycle tires $88.00
101 SHM bicycle tires $68.00

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 43 -

105 PRC bicycle wheels $53.00
105 SHM bicycle wheels $80.00
比较 'bicycle%' 或 'bicycle*' 指定字符 bicycle 后跟零个字符或任何字符序列。它与 bicycle
stem 匹配,而 stem 与通配符匹配。如果具有该描述的行存在,那么它只与字符 bicycle 匹
配。
以下查询通过添加排除 PRC 的 manu_code 的另一个比较条件来缩小搜索范围。
图: 查询
SELECT stock_num, manu_code, description, unit_price
FROM stock
WHERE description LIKE 'bicycle%'
AND manu_code NOT LIKE 'PRC'
ORDER BY description, manu_code;
该语句只检索到下列行。
图: 查询结果
stock_num manu_code description unit_price

102 SHM bicycle brakes $220.00
101 SHM bicycle tires $68.00
105 SHM bicycle wheels $80.00
当从大型表中进行选择并在比较字符串中使用词首通配符时(如 '%cycle'),查询通常需
要较长时间来执行。由于不能使用索引,所以搜索每一行。

MATCHES 子句和非缺省语言环境
缺省情况下,对数据库数据,GBase 8s 数据库服务器使用美国英语语言环境,称为语言环
境。缺省的语言环境使用 ISO 8859-1 代码集。该美国英语语言环境指定 MATCHES 将使
用代码集顺序。
如果数据库使用非缺省语言环境,
那么指定范围的 MATCHES 子句将该语言环境的整理顺
序用于字符数据类型(包括 CHAR 、NCHAR 、VARCHAR 、NVARCHAR 和
LVARCHAR)

MATCHES 范围的此功能是一般规则
(只有 NCHAR 和 NVARCHAR 列
可使用特定于语言环境的整理)的例外情况。然而,如果语言环境不能指定任何特殊整理
顺序,那么 MATCHES 使用代码集顺序。
在 GBase 8s 中,可以使用 SET COLLATION 语句为会话指定不同于 DB_LOCALE 设置的
数据库语言环境。有关 SET COLLATION 的描述,请参阅《GBase 8s SQL 指南:语法》。

保护特殊字符

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 44 -

下列查询使用 ESCAPE 与 LIKE 或 MATCHES 配合使用,
以便您可以保护特殊字符,
使
它们不会被误认为是通配符。
图: 查询
SELECT * FROM cust_calls
WHERE res_descr LIKE '%!%%' ESCAPE '!';
ESCAPE 关键字指定包含下一个字符的转义字符(在本示例中为 !)以便将它解释为数据
而不是通配符。在该示例中,转义字符导致将中间的百分号(%)当作数据。通过使用
ESCAPE 关键字,
您可以使用 LIKE 通配符百分号
(%)
在 res_descr 列中搜索百分号
(%)
的出现次数。查询检索下列显示的行。
图: 查询结果
customer_num 116
call_dtime 1997-12-21 11:24
user_id mannyn
call_code I
call_descr Second complaint from this customer!
Received two cases righthanded outfielder
glove (1 HRO) instead of one case lefties.
res_dtime 1997-12-27 08:19
res_descr Memo to shipping (Ava Brown) to send case
of lefthanded gloves, pick up wrong case;
memo to billing requesting 5% discount to
placate customer due to second offense
and lateness of resolution because of
holiday.

在 WHERE 子句中使用下标
您可以在 SELECT 语句的 WHERE 子句中使用下标,以指定选择某列中一定范围内额字
符或数字,如下所示。
SELECT catalog_num, stock_num, manu_code, cat_advert,
cat_descr
FROM catalog
WHERE cat_advert[1,4] = 'High';
下标 [1,4] 导致该查询检索 cat_advert 列的前四个字母为 High 的所有行。如下所示。
图: 查询结果
catalog_num 10004

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 45 -

stock_num 2
manu_code HRO
cat_advert Highest Quality Ball Available, from Hand-Sti
tching to the Robinson Signature
cat_descr
Jackie Robinson signature ball. Highest professional quality,
used by National League.

catalog_num 10005
stock_num 3
manu_code HSK
cat_advert High-Technology Design Expands the Sweet Spot
cat_descr
Pro-style wood. Available in sizes: 31, 32, 33, 34, 35.

catalog_num 10045
stock_num 204
manu_code KAR
cat_advert High-Quality Beginning Set of Irons. Appropriate
for High School Competitions
cat_descr
Ideally balanced for optimum control. Nylon covered shaft.

catalog_num 10068
stock_num 310
manu_code ANZ
cat_advert High-Quality Kickboard
cat_descr
White. Standard size.

Total Memory Size
:
21258856
Used Memory Size
:
18159736
Session IO statistics:
1 dn_6003_6004-postgres-dbazt:
Physical Reads
:
285
Read Time
:
5320
2 dn_6005_6006-postgres-dbazt:
Physical Reads
:
281
Read Time
:
5811
3 dn_6001_6002-postgres-dbazt:
Physical Reads
:
271
Read Time
:
4662

node (172.168.83.14)
Recover database begin