本讲主要内容
? 数据查询 ( 简单查询, 集合函数, 数
值函数, 连接查询, 等值与非等值连
接查询, 嵌套查询, 集合查询 )
? 视图操作
? 数据库控制操作( 事务管理, 事务处
理流程, 事务处理 命令, 安全保护,
授权命令 )
第七章
数
据
库 (
第
四
讲
)
数据查询是数据库操作的核心。 SQL语言提供了 SELECT语句进行数据
的查询,该语句的一般格式是,
SELECT [ALL∣DISTINCT]< 目标列表达式 >[,<目标列表达式 >]?
FROM<表 (或视图 )>[,<表 (或视图 )>]?
[WHERE<条件表达式 >]
[GROUP BY <列名 1> [HAVING<内部函数表达式 >]]
ORDER BY<列名 2>[ASC∣DESC] ;
SELECT语句包括 6个子句。 SELECT和 FROM子句是必须的,其它子句是
任选的。每个子句的功能如下,
SELECT子句表示列出所有要检索的数据项。
FROM子句表示列出包含所有要查询数据的表。
WHERE子句是搜索条件描述。
GROUP BY 子句指定汇总查询,即不是对每行产生一个查询结果,而
是将相似的行进行分组,再对每组产生一个汇总结果。
HAVING子句告诉 SQL只产生由 GROUP BY得到的某些组的结果。
ORDER BY子句表示将查询结果按一定的顺序排列。
数据查询 (第 7章第 4讲)
简单查询 (第 7章第 4讲)
查询 是根据用户的需要以一种可读的方式从数据库中提取数据。
简单查询 是指仅涉及数据库中的一个表的查询。
SELECT语句中与简单查询有关的关键字是 SELECT,FROM,WHERE
和 ORDER BY子句。
① FROM子句 SELECT子句与 FROM子句联合起来,从数据库中以一种
有组织的可读的格式提取数据。简单的 SELECT语句的语法如下,
SELECT[ * | ALL | DISTINCT 列名 1,列名 2] FROM表名 1;
在查询中的 SELECT关键字之后的一串列项,是查询输出要显示的
部分。 FROM关键字之后的表名,是要查询的数据来源表。 星号 (*)用于
指示表中的所有列都作为查询输出。 ALL的选项用于显示包括重复数
在内的列的所有值。与 ALL选项相反,DISTINCT选项用于消除重复的行。
如果没有在他们两者之间特别指定的话,缺省是 ALL选项。
如,SELECT BH,MC,DH FROM STB;这条语句是将表 STB中所有
记录的 BH,MC,DH列值全部显示出来,不管有无重复。
② WHERE子句 WH RE子句在简单的 SELECT语句中的语法如下,
SELECT [ * | ALL | DISTINCT 列名 l,列名 2]
FROM 表名 1 [,表名 2]
WHERE 条件 1 |表达式 1 [AND | OR条件 2 |表达式 2];
使用 WHERE子句中条件来区分数据,在 WHERE子句中可以有多个条
件,他们之间用 AND或 OR操作符加以连接。
例如,SELECT BH,DZ,MC,DH FROM STB WHERE DH= 2233445
OR FZR=‘ 王卫 ’ ;就是查找 STB中 FZR=‘ 王卫 ’ 或 DH= 2233445的记录。
③ O DER BY子句 通过使用 O DER BY子句可以使数据进行 排序 后输
出,ORDER BY缺省的排序设置是升序。 ORD R BY的语法如下,
[ * | ALL| DISTINCT 列名 1,列名 2]
FROM表名 1 [,表名 2]
WHERE条件 1 |表达式 1 [AND | OR条件 2 |表达式 2]
ORDER BY列名 1 |数字 1 [ASC | DESC] [,列名 2 |数字 2 [ASC |
DESC]];
其中:选项 ASC是缺省选项,表示按升序排列,相反,DESC表示按
降序排列。 ORDER BY的列项中可以写列的名称,也可以只写该列在
SELECT子句中的序号。
集合函数 (第 7章第 4讲)
SQL具有两类主要的函数,集合函数 和 数值函数 。
① 集合函数 集合函数是用来 累加、合计、平均和取极值 的函数。
1) COUNT函数 函数用于统计查询结果集中的 行数 。
COUNT函数的语法格式是,COUNT(*)| (DISTINCT | ALL列名 )
2) SUM函数 SUM函数用于计算一组数据行中某 列值的总和 。
SUM函数的语法格式是,SUM ([DISTINCT]列名 )
3) AVG函数 AVG函数用于计算一组数据的 平均值 。其语法、含义及
限制都与 SUM函数类似。
4) MAX函数 MAX函数用于计算 一组数据的某列的最大值 。其语法格
式是,MAX ([DISTINCT]列名 )
5) MIN函数 MIN函数用于计算 一组数据的某列的最小值 。其语法格
式是,MIN ([DISTINCT]列名 )
数值函数 (第 7章第 4讲)
数值函数有三种不同类型,字符串函数, 算术函数 和 杂项函数。
1) 字符串函数 字符串函数以字符串 (或位串 )作为参数,并得到另外
一个字符串 (或位串 ),有六个字符串函数。
? SUBSTRING函数 其含义是对, 源串, 从, 开始位置, 开始取出长度为
,长度, 的子串,其中源串既可为字符串也可为位串。子串的类型与
源串的类型相同。 SUBSTRING的语法格式是,
SUBSTRING(源串 FROM开始位置 [FOR长度 ])
这里如果 FOR分句省略,则对, 源串, 从, 开始位置, 开始到源
串的结尾作为子串。如果, 开始位置, 超过了源串的长度,则返回空
串。
? UPPER函数 其含义是把字符串转换成大写字符串。
? LOWER函数其 含义是把字符串转换成小写字符串。
? TRIM函数 其含义是从一个字符串中去掉头和尾部的空格。
? TRANSLATE和 CONVERT函数 其含义是把一个字符串从一种字符集转换成
另外一种字符集。
2) 算术函数 在各种实施方案之间是比较标准的。这些函数允许你根据算
术运算规则操纵数据库中的数据。 算术函数的功能如表所示 。
函数名 功能
ABS 绝对值
ROUND 四舍五入
SQRT 开方
SIGN 符号
POWER 幂
CELL 整数上限
FLOOR 整数下限
EXP 指数
SIN,COS,TAN 三角函数
3)杂项函数
? ASCII函数 用于返回代表字符串最左边的字符的 ASCII码。此函数的语
法格式是,
ASCII(CHARACTER)
例如,ASCII(‘ A’ )=65
? DECODE函数 并不是 ANSI标准中的函数,但它具有强大的功能。其功能
是搜索某一字符串来查找指定的值或字符串。如果此字符串被找到,
在查询的结果中显示此替换字符串,此函数的语法格式是,
DECODE(COLUMN-NAME,‘ SEARCH l’, ‘ RETURN l’,
[‘ SEARCH2’, ‘ RE- TURN2’, ‘ DEFAULTVALUE’ ])
连接查询 (第 7章第 4讲)
涉及两个以上的表的查询称之为连接查询 。连接查询
实际上是关系数据库中最主要的查询,主要包括 等值连接
查询, 非等值连接查询, 自连接查询, 外连接查询 和 复合
条件连接查询 。
① 等值与非等值连接查询
② 自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己
进行连接,这种连接称为表的自身连接。
③ 外连接
外连接的表示方法是在连接谓词的某一边加上符号 *,它可以和
另一边的表中所有不满足连接条件的元组进行连接。
在上面的自身连接操作中,只有满足连接条件的元组才能作为结
果输出。
④ 复合连接
复合连接是指 WHERE子句有多个连接条件。
等值与非等值连接查询 (第 7章第 4讲)
当用户的一个查询请求涉及到数据库的多个表时,必须按照一定的条件
把这些表连接在一起,以便能够共同提供用户需要的信息。 用来连接两个表
的条件称为连接条件或连接谓词,其一般格式为,
[<表名 1>.] <列名 1> <比较运算符 > [<表名 2>.] <列名 2>
其中,比较运算符主要有 =,>,<,>=,<=,!=。此外,连接谓词还可以
使用下面形式,
[<表名 1>.] <列名 1> BETWEEN [<表名 2>.] <列名 2〉 AND[<表名 2 >,]
<列名 3>
当连接运算符为, =” 时,称为 等值连接 。 使用其它运算符称为 非等值连接 。
连接运算中有两种特殊情况,一种称为 卡氏积连接,另一种称为 自然连接 。
卡氏积 是不带连接谓词的连接。两个表的卡氏积即是两表中元组的交叉乘积
也即其中一表中的每一元组都要与另一表中的每一元组作拼接,因此结果表
往往很大,也没有什么实际意义,一般很少用到。
如果按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的
属性列,但保留了所有不重复的属性列,则称之为 自然连接 。
嵌套查询 (第 7章第 4讲)
? 在 SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块 。将一个
查询块嵌套在另一个查询块的 WHERE子句或 HAVING短语的条件中的查询
称为 嵌套查询 或 子查询 。
? 上层的查询块 又称为外层查询或父查询或主查询,下层查询块 又称为
内层查询或子查询。 SQL语言允许多层嵌套查询 。需要特别指出的是,
子查询的 SELECT语句中不能使用 ORDER BY 子句,ORDER BY子句永远只
能对最终查询结果排序。
? 嵌套查询的求解方法是 由里向外处理 。即每个子查询在其上一级查询
处理之前求解,子查询的结果用于建立其父查询的查找条件。
① 带有 IN谓词的子查询
② 带有比较运算符的子查询
③ 带有 ANY或 ALL谓词的子查询
④ 带有 EXISTS谓词的子查询
嵌套查询 (第 7章第 4讲)
① 带有 IN谓词的子查询
带有 IN谓词的子查询是指父查询与子查询之间用
IN进行连接,判断某个属性列值是否在子查询的结果
中。由于在嵌套查询中,子查询的结果往往是一个集
合,所以谓词 IN是嵌套查询中最经常使用的谓词。
② 带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之
间用比较运算符进行连接。当用户能确切知道内层查
询返回的是单值时,可以用 >,<,=,>=,<=,! =或
<>等比较运算符。
嵌套查询 (第 7章第 4讲)
③ 带有 ANY或 ALL谓词的子查询
子查询返回单值时可以用比较运算符,而使用 ANY或 ALL谓词时则必
须同时使用比较运算符。其语义为,
>ANY 大于子查询结果中的某个值
<ANY 小于子查询结果中的某个值
>=ANY 大于等于子查询结果中的某个值
<=ANY 小于等于子查询结果中的某个值
=ANY 等于子查询结果中的某个值
!=ANY或 <>ANY 不等于子查询结果中的某个值
>ALL 大于子查询结果中的所有值
〈 ALL 小于子查询结果中的所有值
>=ALL 大于等于子查询结果中的所有值
<=ALL 小于等于子查询结果中的所有值
=ALL 等于子查询结果中的所有值 (通常没有实际意义 )
!=ALL或 <>ALL 不等于子查询结果中的所有值
嵌套查询 (第 7章第 4讲)
④ 带有 EXISTS谓词的子查询
EXISTS代表存在量词。 带有 EXISTS谓词的子查询不返回任何实际数据,
它只产生 逻辑真值 "true” 或 逻辑假值 "false” 。
使用存在量词 EXISTS后,若内层查询结果非空,则外层的 WHERE子句返
回真值,否则返回假值。由 EXISTS引出的子查询,其目标列表达式通常都
用 *,因为带 EXISTS的子查询只返回真值或假值,给出列名也无实际意义。
这类查询与前面的不相关于查询有一个明显区别,即子查询的查询条
件依赖于外层父查询的某个属性值,我们称这类查询为 相关子查询
(correlated subquery)。求解相关子查询不能像求解不相关子查询那样,
一次将子查询求解出来,然后求解父查询。相关子查询的内层查询由于与
外层查询有关,因此必须反复求值。
与 EXISTS谓词 相对应的 NOT EXISTS谓词 。使用存在量词 NOT EXISTS后,
若内层查询结果为空,则外层的 WHERE子句返回真值,否则返回假值。
一些带 EXISTS或 NOT EXISTS谓词的子查询不能被其它形式的子查询等
价替换,但所有带 IN谓词、比较运算符,ANY和 ALL谓词的子查询都能用带
EXISTS谓词的子查询等价替换。
集合查询 (第 7章第 4讲)
每一个 SELECT语句都能获得一个或一组元组。若要
把多个 SELECT语句的结果合并为一个结果,可用集合操
作来完成。集合操作主要包括 并操作 UNION,交操作 IN-
TERSECT和 差操作 MINUS。
使用 UNION将多个查询结果合并起来,形成一个完整
的查询结果时,系统会自动去掉重复的元组。需要注意
的是,参加 UNION操作的各数据项数目必须相同;对应项
的数据类型也必须相同。
标准 SQL中没有直接提供集合交操作和集合差操作,
但可以用其它方法来实现。具体实现方法依查询不同而
不同。
视图操作 (第 7章第 4讲)
视图是存储在数据库中预先定义好的查询,具有表的外观,可以
像表一样对其进行存取,但不占数据库的物理存储空间,它是一张 虚
拟表 。 创建视图,实际是 定义该视图的 SELECT语句 。可以 用视图来封
装一个复杂的查询 。使用 CREATE VIEW语句可以从一张表、几张表或其
它的视图中创建一个视图。语法格式如下,
CREAT VIEW 视图名 [(列 1,列 2,.,,)]AS
SELECT * | 列名 1 [,列名 2]
FROM 表名 1,视图名 1 [,表名 2,视图名 2]
WHERE 子句
视图是一张虚拟的表,可以在其上进行 UPDATE,DELETE,INSERT
命令操作视图中的数据。
使用 DROP VIEW命令可以将视图从数据库中删除。
当进行视图操作时,SQL有一些限制。
视图操作 (第 7章第 4讲)
? 当使用 SELECT语句 构造视图时,SQL有两条限制:①不能使用 UNION操
作符;②不能使用 ORDER BY子句,但可用 GROUPBY子句替代。
? 视图是一张虚拟的表,可以在其上进行 UPDATE,DELETE,INSERT命令
操作视图中的数据,但有许多限制要遵循 。这些规则为,DELETE语句
不能用于多表构成的视图。除非视图基表中所有为 NOT NULL特性的列
都被选入视图,否则不允许对视图进行插入操作。如果要通过一个连
接多表的视图来插入或更新数据,所有更新的记录必须属于同一物理
表中。如果创建视图时使用了 DISTINCT语句,则不能对视图做更新或
插入操作;不能更新一个伪列 —— 通过表达式或函数计算出来的列。
? DROP VIEW命令有两个选项,RESTRICT和 CASCADE。使用 RESTRICT选项
删除视图时,如果约束条件中有任何其它视图被引用,则不允许删除
该视图。如果使用 CASCADE选项,即使有其它视图或约束被引用,命令
照样执行成功,并且那些相关的视图和约束一并被删除。
事务管理 (第 7章第 4讲)
SQL通过限制可以改变数据的一些操作 (INSERT,UPDATE、
DELETE)来进行数据保护 。只允许这些改变发生在一个事务中。所谓
事务,就是一个工作单位。它作为 一组命令集, 或者全部成功地执行,
或者一点都不做 。而所谓工作单位,表示 一个事务有开始也有结束 。
如果在事务的执行过程中出了什么错误,则整个事务将被取消;如果
进展顺利,则整个事务 (所执行的结果 )就被存进数据库。通过将所有
影响数据库的操作都放入事务中,就可以将一个用户对另一用户的影
响 隔离 。这种隔离对于想要从数据库中获得正确的结果是非常重要的。
事务控制是对在关系型数据库管理系统中可能发生的不同事务的管理
能力 。当事务被成功地执行和完成时,操作目标表并没有立即被改变,
尽管从输出的结果显示已经改变。当事务成功地执行以后,还有事务
控制命令来最终完成事务的使用,或是保存事务对数据库所做的改变,
或是取消事务所做的改变。约束一并被删除。
事务处理流程 (第 7章第 4讲)
? 用于事务的 定义 和 控制命令 有四条,BEGIN TRANSCATION,
COMMIT,ROLLBACK,SAVEPOINT。
? 事务一般是以 BEGIN TRANSCATION开始,以 COMMIT或
ROLLBACK结束。当事务完成以后,事务的信息即保存在数
据库所在的区域中,也保存在数据库中临时 回滚 的区域里。
所有的改变都保存在这个临时的回滚区域中,直到执行事
务控制命令为止。当执行了事务控制命令时,对数据库的
改变要么保存,要么取消,然后清空临时回滚区域。如图
所示。
事务处理命令 (第 7章第 4讲)
用于事务的定义和控制命令有四条,BEGIN TRANSCATION, COMMIT、
ROLLBACK,SAVEPOINT。
? COMMIT命令 用于 保存数据库中由事务引起的改变 。它保存自上一条
COMMIT命令或 ROLLBACK命令以来的所有事务。 COMMIT命令的语法格式是,
COMMIT;
? ROLLBACK命令 用于 撤消那些还没有保存到数据库中的事务的事务控制命
令 。它撤消自上一条 COMMIT命令或 ROLLBACK命令以来的所有事务。
ROLLBACK命令的语法格式是,ROLLBACK;
? SAVEPOINT命令 就是创建保存点 。保存点是在事务中,能够进行事务回滚
的点,而不需要回滚整个事务。 SAVEPOINT命令的语法格式是,
SAVEPOINT 保存点;
? 回滚 到一个保存点的语法格式是,ROLLBACK TO保存点;
注意,ROLLBACK本身是回滚到上一个 COMMIT或 ROLLBACK后,但现在这里
若已指定它回滚到某保存点的话,则不影响此保存点以前的事务的状态。
安全保护 (第 7章第 4讲)
? 除了系统软硬件原因产生的数据不一致和两用户无意间的相
互干扰外,数据库系统还必须考虑一个更大的不安全因素,
那就是 用户的越权行为 。设计数据库系统时应将不同类型的
用户根据他们不同的种类分配 访问特许权 。
? 任何没有明确同意的访问权限,系统都加以拒绝。用户在访
问他有权访问的数据之前,还必须通过系统的 身份验证程序 。
SQL92提供六种保护措施,查询、增加、修改、删除、引用
和应用。
? 具体的控制命令如下,SELECT命令 控制着谁可以查询表、列、
视图和元组等数据库对象; INSERT命令 控制着谁可以在表中
插入新行; UPDATE命令 授权谁可以修改表 (或其中某列 )的数
据; DELETE命令 限定谁可以删除表中的行。
授权命令 (第 7章第 4讲)
? 允许访问使用的命令是 GRANT命令, GRANT命令的语法格式是,
GRANT <权限 >[,<权限 >=? ]
[ON <对象类型 > <对象名 > =]
TO <用户 > [,<用户 >=? ]
[WITH GRANT OPTION];
? 取消访问使用的命令是 REVORK命令, REVORK命令的语法格式
是,
REVORK <权限 >[,<权限 >=? ]
[ON <对象类型 > <对象名 > =
FROM <用户 > [,<用户 >=? ];
GRANT命令和 REVORK命令都可同时作用于多个用户。
? 数据查询 ( 简单查询, 集合函数, 数
值函数, 连接查询, 等值与非等值连
接查询, 嵌套查询, 集合查询 )
? 视图操作
? 数据库控制操作( 事务管理, 事务处
理流程, 事务处理 命令, 安全保护,
授权命令 )
第七章
数
据
库 (
第
四
讲
)
数据查询是数据库操作的核心。 SQL语言提供了 SELECT语句进行数据
的查询,该语句的一般格式是,
SELECT [ALL∣DISTINCT]< 目标列表达式 >[,<目标列表达式 >]?
FROM<表 (或视图 )>[,<表 (或视图 )>]?
[WHERE<条件表达式 >]
[GROUP BY <列名 1> [HAVING<内部函数表达式 >]]
ORDER BY<列名 2>[ASC∣DESC] ;
SELECT语句包括 6个子句。 SELECT和 FROM子句是必须的,其它子句是
任选的。每个子句的功能如下,
SELECT子句表示列出所有要检索的数据项。
FROM子句表示列出包含所有要查询数据的表。
WHERE子句是搜索条件描述。
GROUP BY 子句指定汇总查询,即不是对每行产生一个查询结果,而
是将相似的行进行分组,再对每组产生一个汇总结果。
HAVING子句告诉 SQL只产生由 GROUP BY得到的某些组的结果。
ORDER BY子句表示将查询结果按一定的顺序排列。
数据查询 (第 7章第 4讲)
简单查询 (第 7章第 4讲)
查询 是根据用户的需要以一种可读的方式从数据库中提取数据。
简单查询 是指仅涉及数据库中的一个表的查询。
SELECT语句中与简单查询有关的关键字是 SELECT,FROM,WHERE
和 ORDER BY子句。
① FROM子句 SELECT子句与 FROM子句联合起来,从数据库中以一种
有组织的可读的格式提取数据。简单的 SELECT语句的语法如下,
SELECT[ * | ALL | DISTINCT 列名 1,列名 2] FROM表名 1;
在查询中的 SELECT关键字之后的一串列项,是查询输出要显示的
部分。 FROM关键字之后的表名,是要查询的数据来源表。 星号 (*)用于
指示表中的所有列都作为查询输出。 ALL的选项用于显示包括重复数
在内的列的所有值。与 ALL选项相反,DISTINCT选项用于消除重复的行。
如果没有在他们两者之间特别指定的话,缺省是 ALL选项。
如,SELECT BH,MC,DH FROM STB;这条语句是将表 STB中所有
记录的 BH,MC,DH列值全部显示出来,不管有无重复。
② WHERE子句 WH RE子句在简单的 SELECT语句中的语法如下,
SELECT [ * | ALL | DISTINCT 列名 l,列名 2]
FROM 表名 1 [,表名 2]
WHERE 条件 1 |表达式 1 [AND | OR条件 2 |表达式 2];
使用 WHERE子句中条件来区分数据,在 WHERE子句中可以有多个条
件,他们之间用 AND或 OR操作符加以连接。
例如,SELECT BH,DZ,MC,DH FROM STB WHERE DH= 2233445
OR FZR=‘ 王卫 ’ ;就是查找 STB中 FZR=‘ 王卫 ’ 或 DH= 2233445的记录。
③ O DER BY子句 通过使用 O DER BY子句可以使数据进行 排序 后输
出,ORDER BY缺省的排序设置是升序。 ORD R BY的语法如下,
[ * | ALL| DISTINCT 列名 1,列名 2]
FROM表名 1 [,表名 2]
WHERE条件 1 |表达式 1 [AND | OR条件 2 |表达式 2]
ORDER BY列名 1 |数字 1 [ASC | DESC] [,列名 2 |数字 2 [ASC |
DESC]];
其中:选项 ASC是缺省选项,表示按升序排列,相反,DESC表示按
降序排列。 ORDER BY的列项中可以写列的名称,也可以只写该列在
SELECT子句中的序号。
集合函数 (第 7章第 4讲)
SQL具有两类主要的函数,集合函数 和 数值函数 。
① 集合函数 集合函数是用来 累加、合计、平均和取极值 的函数。
1) COUNT函数 函数用于统计查询结果集中的 行数 。
COUNT函数的语法格式是,COUNT(*)| (DISTINCT | ALL列名 )
2) SUM函数 SUM函数用于计算一组数据行中某 列值的总和 。
SUM函数的语法格式是,SUM ([DISTINCT]列名 )
3) AVG函数 AVG函数用于计算一组数据的 平均值 。其语法、含义及
限制都与 SUM函数类似。
4) MAX函数 MAX函数用于计算 一组数据的某列的最大值 。其语法格
式是,MAX ([DISTINCT]列名 )
5) MIN函数 MIN函数用于计算 一组数据的某列的最小值 。其语法格
式是,MIN ([DISTINCT]列名 )
数值函数 (第 7章第 4讲)
数值函数有三种不同类型,字符串函数, 算术函数 和 杂项函数。
1) 字符串函数 字符串函数以字符串 (或位串 )作为参数,并得到另外
一个字符串 (或位串 ),有六个字符串函数。
? SUBSTRING函数 其含义是对, 源串, 从, 开始位置, 开始取出长度为
,长度, 的子串,其中源串既可为字符串也可为位串。子串的类型与
源串的类型相同。 SUBSTRING的语法格式是,
SUBSTRING(源串 FROM开始位置 [FOR长度 ])
这里如果 FOR分句省略,则对, 源串, 从, 开始位置, 开始到源
串的结尾作为子串。如果, 开始位置, 超过了源串的长度,则返回空
串。
? UPPER函数 其含义是把字符串转换成大写字符串。
? LOWER函数其 含义是把字符串转换成小写字符串。
? TRIM函数 其含义是从一个字符串中去掉头和尾部的空格。
? TRANSLATE和 CONVERT函数 其含义是把一个字符串从一种字符集转换成
另外一种字符集。
2) 算术函数 在各种实施方案之间是比较标准的。这些函数允许你根据算
术运算规则操纵数据库中的数据。 算术函数的功能如表所示 。
函数名 功能
ABS 绝对值
ROUND 四舍五入
SQRT 开方
SIGN 符号
POWER 幂
CELL 整数上限
FLOOR 整数下限
EXP 指数
SIN,COS,TAN 三角函数
3)杂项函数
? ASCII函数 用于返回代表字符串最左边的字符的 ASCII码。此函数的语
法格式是,
ASCII(CHARACTER)
例如,ASCII(‘ A’ )=65
? DECODE函数 并不是 ANSI标准中的函数,但它具有强大的功能。其功能
是搜索某一字符串来查找指定的值或字符串。如果此字符串被找到,
在查询的结果中显示此替换字符串,此函数的语法格式是,
DECODE(COLUMN-NAME,‘ SEARCH l’, ‘ RETURN l’,
[‘ SEARCH2’, ‘ RE- TURN2’, ‘ DEFAULTVALUE’ ])
连接查询 (第 7章第 4讲)
涉及两个以上的表的查询称之为连接查询 。连接查询
实际上是关系数据库中最主要的查询,主要包括 等值连接
查询, 非等值连接查询, 自连接查询, 外连接查询 和 复合
条件连接查询 。
① 等值与非等值连接查询
② 自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己
进行连接,这种连接称为表的自身连接。
③ 外连接
外连接的表示方法是在连接谓词的某一边加上符号 *,它可以和
另一边的表中所有不满足连接条件的元组进行连接。
在上面的自身连接操作中,只有满足连接条件的元组才能作为结
果输出。
④ 复合连接
复合连接是指 WHERE子句有多个连接条件。
等值与非等值连接查询 (第 7章第 4讲)
当用户的一个查询请求涉及到数据库的多个表时,必须按照一定的条件
把这些表连接在一起,以便能够共同提供用户需要的信息。 用来连接两个表
的条件称为连接条件或连接谓词,其一般格式为,
[<表名 1>.] <列名 1> <比较运算符 > [<表名 2>.] <列名 2>
其中,比较运算符主要有 =,>,<,>=,<=,!=。此外,连接谓词还可以
使用下面形式,
[<表名 1>.] <列名 1> BETWEEN [<表名 2>.] <列名 2〉 AND[<表名 2 >,]
<列名 3>
当连接运算符为, =” 时,称为 等值连接 。 使用其它运算符称为 非等值连接 。
连接运算中有两种特殊情况,一种称为 卡氏积连接,另一种称为 自然连接 。
卡氏积 是不带连接谓词的连接。两个表的卡氏积即是两表中元组的交叉乘积
也即其中一表中的每一元组都要与另一表中的每一元组作拼接,因此结果表
往往很大,也没有什么实际意义,一般很少用到。
如果按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的
属性列,但保留了所有不重复的属性列,则称之为 自然连接 。
嵌套查询 (第 7章第 4讲)
? 在 SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块 。将一个
查询块嵌套在另一个查询块的 WHERE子句或 HAVING短语的条件中的查询
称为 嵌套查询 或 子查询 。
? 上层的查询块 又称为外层查询或父查询或主查询,下层查询块 又称为
内层查询或子查询。 SQL语言允许多层嵌套查询 。需要特别指出的是,
子查询的 SELECT语句中不能使用 ORDER BY 子句,ORDER BY子句永远只
能对最终查询结果排序。
? 嵌套查询的求解方法是 由里向外处理 。即每个子查询在其上一级查询
处理之前求解,子查询的结果用于建立其父查询的查找条件。
① 带有 IN谓词的子查询
② 带有比较运算符的子查询
③ 带有 ANY或 ALL谓词的子查询
④ 带有 EXISTS谓词的子查询
嵌套查询 (第 7章第 4讲)
① 带有 IN谓词的子查询
带有 IN谓词的子查询是指父查询与子查询之间用
IN进行连接,判断某个属性列值是否在子查询的结果
中。由于在嵌套查询中,子查询的结果往往是一个集
合,所以谓词 IN是嵌套查询中最经常使用的谓词。
② 带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之
间用比较运算符进行连接。当用户能确切知道内层查
询返回的是单值时,可以用 >,<,=,>=,<=,! =或
<>等比较运算符。
嵌套查询 (第 7章第 4讲)
③ 带有 ANY或 ALL谓词的子查询
子查询返回单值时可以用比较运算符,而使用 ANY或 ALL谓词时则必
须同时使用比较运算符。其语义为,
>ANY 大于子查询结果中的某个值
<ANY 小于子查询结果中的某个值
>=ANY 大于等于子查询结果中的某个值
<=ANY 小于等于子查询结果中的某个值
=ANY 等于子查询结果中的某个值
!=ANY或 <>ANY 不等于子查询结果中的某个值
>ALL 大于子查询结果中的所有值
〈 ALL 小于子查询结果中的所有值
>=ALL 大于等于子查询结果中的所有值
<=ALL 小于等于子查询结果中的所有值
=ALL 等于子查询结果中的所有值 (通常没有实际意义 )
!=ALL或 <>ALL 不等于子查询结果中的所有值
嵌套查询 (第 7章第 4讲)
④ 带有 EXISTS谓词的子查询
EXISTS代表存在量词。 带有 EXISTS谓词的子查询不返回任何实际数据,
它只产生 逻辑真值 "true” 或 逻辑假值 "false” 。
使用存在量词 EXISTS后,若内层查询结果非空,则外层的 WHERE子句返
回真值,否则返回假值。由 EXISTS引出的子查询,其目标列表达式通常都
用 *,因为带 EXISTS的子查询只返回真值或假值,给出列名也无实际意义。
这类查询与前面的不相关于查询有一个明显区别,即子查询的查询条
件依赖于外层父查询的某个属性值,我们称这类查询为 相关子查询
(correlated subquery)。求解相关子查询不能像求解不相关子查询那样,
一次将子查询求解出来,然后求解父查询。相关子查询的内层查询由于与
外层查询有关,因此必须反复求值。
与 EXISTS谓词 相对应的 NOT EXISTS谓词 。使用存在量词 NOT EXISTS后,
若内层查询结果为空,则外层的 WHERE子句返回真值,否则返回假值。
一些带 EXISTS或 NOT EXISTS谓词的子查询不能被其它形式的子查询等
价替换,但所有带 IN谓词、比较运算符,ANY和 ALL谓词的子查询都能用带
EXISTS谓词的子查询等价替换。
集合查询 (第 7章第 4讲)
每一个 SELECT语句都能获得一个或一组元组。若要
把多个 SELECT语句的结果合并为一个结果,可用集合操
作来完成。集合操作主要包括 并操作 UNION,交操作 IN-
TERSECT和 差操作 MINUS。
使用 UNION将多个查询结果合并起来,形成一个完整
的查询结果时,系统会自动去掉重复的元组。需要注意
的是,参加 UNION操作的各数据项数目必须相同;对应项
的数据类型也必须相同。
标准 SQL中没有直接提供集合交操作和集合差操作,
但可以用其它方法来实现。具体实现方法依查询不同而
不同。
视图操作 (第 7章第 4讲)
视图是存储在数据库中预先定义好的查询,具有表的外观,可以
像表一样对其进行存取,但不占数据库的物理存储空间,它是一张 虚
拟表 。 创建视图,实际是 定义该视图的 SELECT语句 。可以 用视图来封
装一个复杂的查询 。使用 CREATE VIEW语句可以从一张表、几张表或其
它的视图中创建一个视图。语法格式如下,
CREAT VIEW 视图名 [(列 1,列 2,.,,)]AS
SELECT * | 列名 1 [,列名 2]
FROM 表名 1,视图名 1 [,表名 2,视图名 2]
WHERE 子句
视图是一张虚拟的表,可以在其上进行 UPDATE,DELETE,INSERT
命令操作视图中的数据。
使用 DROP VIEW命令可以将视图从数据库中删除。
当进行视图操作时,SQL有一些限制。
视图操作 (第 7章第 4讲)
? 当使用 SELECT语句 构造视图时,SQL有两条限制:①不能使用 UNION操
作符;②不能使用 ORDER BY子句,但可用 GROUPBY子句替代。
? 视图是一张虚拟的表,可以在其上进行 UPDATE,DELETE,INSERT命令
操作视图中的数据,但有许多限制要遵循 。这些规则为,DELETE语句
不能用于多表构成的视图。除非视图基表中所有为 NOT NULL特性的列
都被选入视图,否则不允许对视图进行插入操作。如果要通过一个连
接多表的视图来插入或更新数据,所有更新的记录必须属于同一物理
表中。如果创建视图时使用了 DISTINCT语句,则不能对视图做更新或
插入操作;不能更新一个伪列 —— 通过表达式或函数计算出来的列。
? DROP VIEW命令有两个选项,RESTRICT和 CASCADE。使用 RESTRICT选项
删除视图时,如果约束条件中有任何其它视图被引用,则不允许删除
该视图。如果使用 CASCADE选项,即使有其它视图或约束被引用,命令
照样执行成功,并且那些相关的视图和约束一并被删除。
事务管理 (第 7章第 4讲)
SQL通过限制可以改变数据的一些操作 (INSERT,UPDATE、
DELETE)来进行数据保护 。只允许这些改变发生在一个事务中。所谓
事务,就是一个工作单位。它作为 一组命令集, 或者全部成功地执行,
或者一点都不做 。而所谓工作单位,表示 一个事务有开始也有结束 。
如果在事务的执行过程中出了什么错误,则整个事务将被取消;如果
进展顺利,则整个事务 (所执行的结果 )就被存进数据库。通过将所有
影响数据库的操作都放入事务中,就可以将一个用户对另一用户的影
响 隔离 。这种隔离对于想要从数据库中获得正确的结果是非常重要的。
事务控制是对在关系型数据库管理系统中可能发生的不同事务的管理
能力 。当事务被成功地执行和完成时,操作目标表并没有立即被改变,
尽管从输出的结果显示已经改变。当事务成功地执行以后,还有事务
控制命令来最终完成事务的使用,或是保存事务对数据库所做的改变,
或是取消事务所做的改变。约束一并被删除。
事务处理流程 (第 7章第 4讲)
? 用于事务的 定义 和 控制命令 有四条,BEGIN TRANSCATION,
COMMIT,ROLLBACK,SAVEPOINT。
? 事务一般是以 BEGIN TRANSCATION开始,以 COMMIT或
ROLLBACK结束。当事务完成以后,事务的信息即保存在数
据库所在的区域中,也保存在数据库中临时 回滚 的区域里。
所有的改变都保存在这个临时的回滚区域中,直到执行事
务控制命令为止。当执行了事务控制命令时,对数据库的
改变要么保存,要么取消,然后清空临时回滚区域。如图
所示。
事务处理命令 (第 7章第 4讲)
用于事务的定义和控制命令有四条,BEGIN TRANSCATION, COMMIT、
ROLLBACK,SAVEPOINT。
? COMMIT命令 用于 保存数据库中由事务引起的改变 。它保存自上一条
COMMIT命令或 ROLLBACK命令以来的所有事务。 COMMIT命令的语法格式是,
COMMIT;
? ROLLBACK命令 用于 撤消那些还没有保存到数据库中的事务的事务控制命
令 。它撤消自上一条 COMMIT命令或 ROLLBACK命令以来的所有事务。
ROLLBACK命令的语法格式是,ROLLBACK;
? SAVEPOINT命令 就是创建保存点 。保存点是在事务中,能够进行事务回滚
的点,而不需要回滚整个事务。 SAVEPOINT命令的语法格式是,
SAVEPOINT 保存点;
? 回滚 到一个保存点的语法格式是,ROLLBACK TO保存点;
注意,ROLLBACK本身是回滚到上一个 COMMIT或 ROLLBACK后,但现在这里
若已指定它回滚到某保存点的话,则不影响此保存点以前的事务的状态。
安全保护 (第 7章第 4讲)
? 除了系统软硬件原因产生的数据不一致和两用户无意间的相
互干扰外,数据库系统还必须考虑一个更大的不安全因素,
那就是 用户的越权行为 。设计数据库系统时应将不同类型的
用户根据他们不同的种类分配 访问特许权 。
? 任何没有明确同意的访问权限,系统都加以拒绝。用户在访
问他有权访问的数据之前,还必须通过系统的 身份验证程序 。
SQL92提供六种保护措施,查询、增加、修改、删除、引用
和应用。
? 具体的控制命令如下,SELECT命令 控制着谁可以查询表、列、
视图和元组等数据库对象; INSERT命令 控制着谁可以在表中
插入新行; UPDATE命令 授权谁可以修改表 (或其中某列 )的数
据; DELETE命令 限定谁可以删除表中的行。
授权命令 (第 7章第 4讲)
? 允许访问使用的命令是 GRANT命令, GRANT命令的语法格式是,
GRANT <权限 >[,<权限 >=? ]
[ON <对象类型 > <对象名 > =]
TO <用户 > [,<用户 >=? ]
[WITH GRANT OPTION];
? 取消访问使用的命令是 REVORK命令, REVORK命令的语法格式
是,
REVORK <权限 >[,<权限 >=? ]
[ON <对象类型 > <对象名 > =
FROM <用户 > [,<用户 >=? ];
GRANT命令和 REVORK命令都可同时作用于多个用户。