SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-2 谓词
● 谓词就是返回值为真值的函数。
● 可以将子查询作为IN和EXISTS的参数。
本节将会和大家一起学习 SQL 的抽出条件中不可或缺的工具——谓词(predicate)。例如, =、 <、 >、 <> 等比较运算符,其正式的名称就是比较谓词。
谓词的返回值全都是真值(TRUE/FALSE/UNKNOWN)。 这也是谓词和函数的最大区别。
● 掌握LIKE的三种使用方法(前方一致、中间一致、后方一致)。
LIKE谓词——字符串的部分一致查询
部分一致大体可以分为前方一致、中间一致和后方一致三种类型。 
代码清单6-21 创建SampleLike表
--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



“abcddd”也是以“abc”开头的字符串,但是其中“ddd”是 3个字符,所以不满足 _ _ 所指定的 2 个字符的条件,因此该字符串并不在查询结果之中。
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', '东京', '', 30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '', 50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '', 15);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '', 30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '', 120);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '', 20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '', 10);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '', 40);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '', 20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '', 50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '', 90);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '', 70);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000D', '福冈', '', 100); COMMIT;
代码清单6-35 向ShopProduct表中插入数据


■ NOT IN和子查询
IN 的否定形式 NOT IN 同样可以使用子查询作为参数,其语法也和IN 完全一样。
EXIST谓词
本节最后将要给大家介绍的是 EXIST 谓词。将它放到最后进行学习
的原因有以下 3 点。
① EXIST 的使用方法与之前的都不相同
② 语法理解起来比较困难
③ 实际上即使不使用 EXIST,基本上也都可以使用 IN(或者 NOT IN)来代替
但是一旦能够熟练使用 EXIST 谓词,就能体会到它极大的便利性。
■ EXIST谓词的使用方法

EXISTS 只需要在右侧书写 1 个参数,该参数通常都会是一个关联子查询。通过条件“SP.product_id = P.product_id”将 Product 表和 ShopProduct表进行了联接,因此作为参数的是关联子查询。
大家可以把在 EXIST 的子查询中书写 SELECT * 当作 SQL 的一种习惯。
●使用NOT EXIST替换NOT IN 
NOT EXISTS 与 EXISTS 相反,当“不存在”满足子查询中指定条件的记录时返回真(TRUE)。
SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-2 谓词的更多相关文章
- 推荐《SQL基础教程(第2版)》中文PDF+源代码+习题答案
我认为<SQL基础教程(第2版)>非常适合数据库学习的初学者.论述的角度是读者的角度,会换位思考到读者在看到这一段时候会发出怎样的疑问,非常难得:原始数据的例题只有一道,但是可以反复从不同 ...
- 笔记-Python基础教程(第二版)第一章
第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0 ==& ...
- [SQL基础教程] 3-1 对表进行聚合查询
[SQL基础教程] 3-1 对表进行聚合查询 聚合函数 用于合计的函数称为聚合函数或者集合函数 COUNT SUM AVG MAX MIN SELECT COUNT(*) FROM table; SE ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- [SQL基础教程] 4-4 事务
[SQL基础教程] 4 数据更新 4-4 事务 事务 需要在同一处理单元中执行的一系列更新处理的集合 创建事务 事务开始语句; DML语句1; DML语句2; . . . 事务结束语句; 事务开始语句 ...
- [SQL基础教程] 4-3 数据的更新(UPDATE)
[SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...
- [SQL基础教程] 4-2 数据删除(DELETE)
[SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...
- [SQL基础教程] 4-1 数据的插入(INSERT)
[SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...
- [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY
[SQL基础教程] 3-4 对查询结果进行排序/ORDER BY ORDER BY SELECT <列名1>,<列名2>,<列名2>... FROM ORDER B ...
随机推荐
- 安装mysql server5.5 到start service未响应解决方法
打开C盘,然后修改 "组织" => "查看"(如下图) 里面的 "隐藏受保护的操作系统文件" (系统这是会弹出警告,不 ...
- 实训30 延时中断组织块0B20仿真
实训30 延时中断组织块的仿真试验 问题1 系统功能块SFC中提供了一些查询中断状态字的指令,举例说明 例如 SF34 "QRY_DINT" 用来查询 "延时中断&q ...
- 51nod 1276:岛屿的数量 很好玩的题目
1276 岛屿的数量 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 取消关注 有N个岛连在一起形成了一个大的岛屿,如果海平 ...
- 【Linux】linux内核学习
linux内核获取 官网: https://www.kernel.org/ Linux操作系统的核心是模块化,可以使用lsmod命令查看内核模块,下面展示已载入系统的模块: [root@172.16. ...
- redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist
解决方法:通过redis-cli连接到服务器后执行以下命令: config set stop-writes-on-bgsave-error no 注意:这种方法只是忽略了问题,并没有解决问题,具体问题 ...
- pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案
1 问题描述 使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度.帧高度.视频变速.降低视频码率达到限制视频大小),使用了ffmpeg. ffmpeg- ...
- 130-PHP子类通过类函数访问父类protected修饰的类成员
<?php class father{ //定义father类 //定义protected修饰的成员属性和方法 protected $money=1000000; protected funct ...
- 067-PHP使用匿名函数
<?php $func=function ($x,$y){ //匿名函数与变量绑定 return $x+$y; }; echo '5+6='.$func(5,6); //使用匿名函数 echo ...
- C# SqlBulkCopy 避免插入重复数据(不重复即插入)
之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法. 这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入, ...
- RabbitMQ消息队列帮助类
调用 //消息队列发消息 MqConfigInfo config = new MqConfigInfo(); config.MQExChange = "DrawingOutput" ...