● 谓词就是返回值为真值的函数。
● 可以将子查询作为IN和EXISTS的参数。
本节将会和大家一起学习 SQL 的抽出条件中不可或缺的工具——谓词(predicate)。例如, =、 <、 >、 <> 等比较运算符,其正式的名称就是比较谓词。
谓词的返回值全都是真值(TRUE/FALSE/UNKNOWN)。 这也是谓词和函数的最大区别。
● LIKE
● BETWEEN
● IS NULL、 IS NOT NULL
● IN
● EXISTS
LIKE谓词——字符串的部分一致查询
部分一致大体可以分为前方一致、中间一致和后方一致三种类型。
--MySQL --DDL:创建表 CREATE TABLE SampleLike ( strcol VARCHAR(6) NOT NULL, PRIMARY KEY (strcol)); --DML:插入数据 START TRANSACTION; INSERT INTO SampleLike (strcol) VALUES ('abcddd'); INSERT INTO SampleLike (strcol) VALUES ('dddabc'); INSERT INTO SampleLike (strcol) VALUES ('abdddc'); INSERT INTO SampleLike (strcol) VALUES ('abcdd'); INSERT INTO SampleLike (strcol) VALUES ('ddabc'); INSERT INTO SampleLike (strcol) VALUES ('abddc'); COMMIT;List6_21_MySQL
--Oracle, DB2 --DDL:创建表 CREATE TABLE SampleLike ( strcol VARCHAR(6) NOT NULL, PRIMARY KEY (strcol)); --DML:插入数据 INSERT INTO SampleLike (strcol) VALUES ('abcddd'); INSERT INTO SampleLike (strcol) VALUES ('dddabc'); INSERT INTO SampleLike (strcol) VALUES ('abdddc'); INSERT INTO SampleLike (strcol) VALUES ('abcdd'); INSERT INTO SampleLike (strcol) VALUES ('ddabc'); INSERT INTO SampleLike (strcol) VALUES ('abddc'); COMMIT;List6_21_Oracle_DB2
BETWEEN谓词——范围查询
IS NULL、 IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
但需要注意的是,在使用IN 和 NOT IN 时是无法选取出NULL 数据的。
NULL 终究还是需要使用IS NULL 和IS NOT NULL 来进行判断。
使用子查询作为IN谓词的参数
■ IN和子查询
IN 谓词(NOT IN 谓词)具有其他谓词所没有的用法,那就是可以
使用子查询作为其参数。我们已经在 5-2 节中学习过了,子查询就是 SQL
内部生成的表,因此也可以说“能够将表作为 IN 的参数”。同理,我们
还可以说“能够将视图作为 IN 的参数”。
CREATE TABLE ShopProduct (shop_id CHAR(4) NOT NULL, shop_name VARCHAR(200) NOT NULL, product_id CHAR(4) NOT NULL, quantity INTEGER NOT NULL, PRIMARY KEY (shop_id, product_id));
--MySQL START TRANSACTION; INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0001', 30); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0002', 50); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0003', 15); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0002', 30); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0003', 120); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0004', 20); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0006', 10); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0007', 40); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0003', 20); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0004', 50); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0006', 90); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0007', 70); INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000D', '福冈', '0001', 100); COMMIT;代码清单6-35 向ShopProduct表中插入数据
■ NOT IN和子查询
IN 的否定形式 NOT IN 同样可以使用子查询作为参数,其语法也和IN 完全一样。
EXIST谓词
本节最后将要给大家介绍的是 EXIST 谓词。将它放到最后进行学习
的原因有以下 3 点。
① EXIST 的使用方法与之前的都不相同
② 语法理解起来比较困难
③ 实际上即使不使用 EXIST,基本上也都可以使用 IN(或者 NOT IN)来代替
但是一旦能够熟练使用 EXIST 谓词,就能体会到它极大的便利性。
■ EXIST谓词的使用方法
EXISTS 只需要在右侧书写 1 个参数,该参数通常都会是一个关联子查询。
大家可以把在 EXIST 的子查询中书写 SELECT * 当作 SQL 的一种习惯。
●使用NOT EXIST替换NOT IN
NOT EXISTS 与 EXISTS 相反,当“不存在”满足子查询中指定条件的记录时返回真(TRUE)。