当执行未显式声明表之间的连接条件的多表查询时,就创建了笛卡尔积。笛卡尔积由表的 行的每种可能的组合构成。此结果通常很大且不实用。 以下查询从两个表中进行选择并生成笛卡尔积。 图: 查询 SELECT * FROM customer, state; state 表只有 52 行,customer 表只有 28 行,然而查询的影响是将一个表的行数乘以另一 个表的行数并检索不实用的 1,456 行,如下所示。 图: 查询结果 customer_num 101 fname Ludwig lname Pauli company All Sports Supplies address1 213 Erstwild Court address2 city Sunnyvale state CA zipcode 94086 phone 408-789-8075 code AK sname Alaska
customer_num 101 fname Ludwig lname Pauli company All Sports Supplies address1 213 Erstwild Court address2 city Sunnyvale
GBase 8s SQL 指南:教程 南大通用数据技术股份有限公司 - 59 - state CA zipcode 94086 phone 408-789-8075 code HI sname Hawaii
customer_num 101 fname Ludwig lname Pauli company All Sports Supplies address1 213 Erstwild Court address2 city Sunnyvale state CA zipcode 94086 phone 408-789-8075 code CA sname California ⋮ 另外,显示在连续行中的某些数据是矛盾的。例如:虽然 customer 表中的 city 和 state 指示 在 California 的地址,但是 state 表的 code 和sname 可能是另一个州的。
元素 描述 限制 语法 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 指南:语法 南大通用数据技术股份有限公司 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 关键字对查询结果不起作用,尽 管不测试重复可提升查询性能。
元素 描述 限制 语法 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。