第 4章 SQL语言
? SQL语言(结构化查询语言)是当前关系数据
库的标准操作语言。
? 大部分的 RDBMS都支持 SQL。
? SQL有 86,89,92,99版本。
? 本章主要讲述 SQL92语言的用法。
? 要求能熟练使用 SQL语句在不同的 RDBMS中完
成数据库的基本操作。
第 4章 SQL语言
? 4.1 SQL概述
? 4.2 数据定义
? 4.3 数据查询
? 4.4 数据更新
? 4.5 视图
? 4.6 数据控制
? 4.7 嵌入式 SQL
? 4.8小结
? 4.9 练习
4.1 SQL概述
? SQL经历了一个逐步发展过程。
? SQL具有不同于其他语言的特点。
? SQL对关系数据库模式提供支持。
? SQL语言语句简单,只用几条语句就能完成
数据库的基本操作。
? 本节主要介绍 SQL的基本知识,要求对 SQL
有一个全局性的基本了解。
4.1 SQL概述
? 4.1.1 SQL的发展过程
? 4.1.2 SQL的特点
? 4.1.3 SQL对关系数据库模式的支持
? 4.1.4 SQL语言的基本知识
4.1.1 SQL的发展过程
? 1974年由 Boyce 和 Chamberlin提出;
? 1975-1979年 IBM的 San Jose Research
Labortatory研制的 RDBMS原型系统S ystem R中
初次实现;
? 1986年 ANSI公布第一个 SQL标准;
? 1987,1989,1992…,不断扩充;
? 目前有三个标准,SQL86,SQL92,SQL99。
4.1.2 SQL的特点
? 1,综合统一。
? 2,高度非过程化。
? 3,面向集合操作。
? 4,以同一种语法结构提供两种使用方式
(自含式和嵌入式)。
? 5,简洁易学易用。
4.1.3 SQL对 RDBS模式的支持
SQL
视图 2视图 1
基本表 1 基本表 2 基本表 3 基本表 4
外模式
模式
内模式
存储文件 1 存储文件 2
4.1.4 SQL语言的基本知识
? SQL语句的动词只有九条。
数据定义 DDL CREATE,DROP,ALTER
数据查询 DQL SELECT
数据操纵 DML INSERT,UPDATE,DELETE
数据控制 DCL GRANT,REVOTE
4.2 数据定义
? SQL的数据定义语句( DDL)
? 可定义表结构,索引、视图等,也可进行修改
和删除。
? 定义表结构时要注意完整性约束。
? 定义 索引时要注意查询的要求和速度。
? 定义 视图时要注意用户和应用开发的需要。
4.2 数据定义
? 4.2.1 DDL概述
? 4.2.2 基本表的定义、删除和修改
? 4.2.3 索引操作 (建立和删除 )
4.2.1 DDL概述
? SQL的数据定义语句( DDL)包括以下语句:
创建 删除 修改
表 CTEATE TABLE DROP TABLE ALTER TABLE
视图 CTEATE VIEW DROP VIEW
索引 CTEATE INDEX DROP INDEX
? 注意:视图和索引无修改语句!
4.2.2 基本表操作一:定义
? 语句格式:
CREATE TABLE <表名 >( <列名 > <数据类型 > [列完
整性约束条件 ]
[<列名 > <数据类型 > [列完整性约束条件 ]… ])
[,<表级完整性约束条件 ];
? 例1:建立学生表 student1。
CREATE TABLE student1
(sno char(5) not null unique,
sname char(20),
ssex char(2) );
? 语句格式:
ALTER TABLE <表名 >
[ADD <新列名 > <数据类型 > [列完整性约
束条件 ]]
[DROP <完整性约束名 >]
[MODIFY <列名 > <数据类型 >];
? 例2:修改 course表结构增加一个 jc 属性
alter table course add jc char(20) not null;
? 例3:删除 course表的 jc 属性
alter table course drop jc;
4.2.2 基本表操作二:修改
4.2.2 基本表操作三:删除
? 语句格式:
DROP TABLE <表名 >;
? 删除表结构时,表中的数据也一并删除。
删除表要慎重!
? 例4:删除课程表。
drop table course;
4.2.3 索引:索引作用
? 建立索引可有效提高查询的速度。如果把一个基本库表比作
一本书,索引就好像书的目录,通过查询目录,可找到相关
章节的页号,从而可迅速地找到那一节内容。不同的是,基
本表可建立不止一个索引,它可按不同的属性或表达式建立
多个索引。
4.2.3 索引之二:建立
? 语句格式,
CREATE [UNIQUE] [CLUSTER] INDEX <索引名 >
ON <表名 > ( <列名 >[<次序 >] [,<列名 >[<次序
>]]… );
? 说明:
( 1) ASC升序,DESC降序,缺省为 ASC。
( 2) CLUSTER为聚族索引(指索引项的顺序与表中记录
的物理顺序一致的索引组织)。一个表只有一个。
( 3) UNIQUE表示唯一索引。
? 例5:按课程表的课程名建立索引。
create unique index course_name
on course(cname);
4.2.3 索引之三:删除
? 删除索引语句格式:
DROP INDEX <索引名 >;
? 例:
DROP INDEX course_name ;
4.3 数据查询语句
? 数据查询是 DBS最常用的一项操作。
? DBS必须提供强大而完善的数据查询功能。
? 对于关系数据库,查询有时可能需要从多
个表中取得数据。
? SQL只用 SELECT就能完成各种查询。
? SELECT用法很灵活。
4.3 数据查询
? 4.3.1 SELECT一般格式
? 4.3.2 SELECT查询方式
? 4.3.3 单表查询
? 4.3.4 多表查询
? 4.3.5 连接查询
4.3.1 SELECT一般格式
SELECT [ALL | DISTINCT] <目标列表达式 > [别名 ] [,
<目标列表达式 > [别名 ] ]…
FROM <表名或视图名 >[,<表名或视图名 >]…
[WHERE <条件表达式 >]
[GROUP BY <列名 1> [HAVING <条件表达式 > ]]
[ORDER BY <列名 2 >[ASC | DESC]];
4.3.1 SELECT一般格式说明
1,目标列表达式可以有以下格式:
( 1) *
( 2) <表名 >.*
( 3) COUNT([ALL | DISTINCT] * )
( 4) [<表名 >.]<属性列名表达式 > [别名 ] [,[<表名
>.]<属性列名表达式 > [别名 ]]…
2,WHERE条件表达式非常灵活
3,GROUP BY 表示按列名 1的值分组,每个组产生结果表
中一记录。 HAVING <条件表达式 > 表示符合条件的
组才输出。
4,[ORDER BY <列名 2 >[ASC | DESC]]:表示排序。
4.3.1 SQL语言简易格式
SELECT <列名 >,投影
FROM <表名 >,连接
WHERE <条件 >,选取
GROUP BY <列名 >,分组
HAVING <条件 >,去组
ORDER BY <列名 >,排序
4.3.1 SQL结果的转向
? SELECT … FROM … WHERE …
? 缺省:输出到临时窗口
? TO SCREEN:输出到屏幕
? TO <FileName>:输出到 TXT文件
? INTO TABLE <TableName>:输出到表
4.3.2 SELECT查询方式
? 1.单表查询
( 1)选择若干列:指定列;全部列;经过计算的列
( 2)选择若干行:消除重复的行;满足条件的行(比较大
小,确定范围,确定集合,字符匹配,空值,多条件);
( 3)对查询结果排序。( 4)使用集函数。( 5)分组
? 2,连接查询(等值与非等值连接;自身连接;外连接;
复合条件连接)
? 3,嵌套查询(用 IN子查询;用 =;用 ANY和 ALL;用
EXISTS)
4.3.3 查询:成绩管理数据库
? 在学生成绩管理数据库中,包括基本的三个关系:
student,course,sc 。
? ( 1) student( sno,sname,ssex,sage,sdept),表
示学号,姓名,性别,年龄,示所在系。主码为 sno。
? ( 2) Course (cno,cname,cpno,ccredit),表示课程
号,课程名,先行课程号,学分。主码为 cno。
? ( 3) SC (sno,cno,grade),表示学号,课程号,成绩。
主码为 (sno,cno)。
4.3.4 单表查询
? 例6,查询全体学生详细记录
select *
from student;
? 例7,查询信息系所有男生的学号、姓名、出生年份
Select sno,sname,2002-sage
from student
where ssex=‘男’ and sdept=‘IS’;
? 例8,查询选修过课的学生的学号
Select distinct sno
from sc;
4.3.4 查询满足条件的元组
查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!<,!>,NOT+上
述符号
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE ( %, _ )
空值 IS NULL,IS NOT NULL
多重条件 AND,OR
4.3.4 查询满足条件的元组例子
? 例9, 查询年龄在 25-30之间的学生姓名及性别。
Select sname,ssex from student
where sage between 25 and 30;
? 例10, 查询姓“欧阳”的学生 。
Select * from student
where sname like ‘欧阳 %’;
? 例11, 查询信息系 IS,数学系 MA和计算机系 CS的学生。
Select * from student
where sdept in (‘IS’,’ MA’,’ CS’);
4.3.4 使用集函数查询
? 集函数包括:
COUNT( [DISTINCT | ALL] *)统计元组个数
COUNT( [DISTINCT | ALL] <列名 >)统计一列中值的个数
SUM( [DISTINCT | ALL] <列名 >)计算一列值的总和
AVG( [DISTINCT | ALL] <列名 >)计算一列的平均值
MAX( [DISTINCT | ALL] <列名 >)计算一列的最大值
MAX( [DISTINCT | ALL] <列名 >)计算一列的最小值
? 例12, 统计学生总人数。
select count(*) from student;
? 例13, 查询选修了课程的学生人数。
select count(distinct sno) from sc;
4.3.5 分组查询
? 例14, 查询各个课程号与相应的选课人数据。
SELECT Cno COUNT(Sno)
FROM sc
GROUP BY Cno;
? 例 15, 查询选修了 4门课以上的学生的学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>4
4.3.6 连接查询
? 连接查询包括:等值与非等值连接;自身连接;外连接;
复合条件连接
? 例 16, 查询每一门课的间接先修课
Select first.cno,second.pcno
From course first,course second
Where first.pcno=second.cno;
? 例 17, 查询每个学生及其选课信息 (右外连接 )
Select student.sno,sname,ssex,sage,sdept,cno,
garde
From student,sc
Where student.sno=sc.sno(*);
4.3.7 嵌套查询
? 可以完成很复杂的查询功能。
? 子查询的结果作为父查询的条件件。
? 包括(用 IN子查询;用 =;用 ANY和 ALL;用
EXISTS)。
? 不同方法实现同一种查询效率相差很大,即需要进行
查询优化。
? >any 表示大于子查询中的某个值 ;
? >all 表示大于子查询中的所有值
4.3.6 嵌套查询 --EXISTS
? 带有 EXISTS的子查询不返回实际数据,只产生逻辑值,子
查询非空,返回 T,否则,返回 F。
? 例 18,查询选修了全部课程的学生姓名(即没有一门课程
他不选修)
Select sname from student
where not exists
(select * from course
where not exists
(select * from sc
where sno=student.sno and sno=course.cno));
4.3.7 嵌套查询 --EXISTS
? 例 19, 查询至少选修了学生, 2001002?选修的全部课程
的学号。
? 该查询转换为:不存在这样的课程 Y,学生 2001002选了 Y,
但学生 X没有选 Y。
Select distinct sno from sc scx
where not exists
(select * from sc scy
where scy.sno=?2001002? and not exists
(select * from sc scz
where scz.sno=scx.sno and scz.cno=scy.cno));
4.3.7 集合查询 —并交差
? 并 UNION、交 INTERSECT、差 MINUS。交差运算标
准 SQL未提供,通过其它方法实现。
? 例20, 查询数学系学生及年龄等于 20岁的学生。
Select * from student where sdept=?math?
Union
Select * from student where sage=20
? 例2 1,查询数学系学生与年龄等于 20岁学生的交集。
Select * from student
where sdept=?math? and sage=20
? 例22, 查询数学系学生与年龄等于 20岁学生的差集。
Select * from student
where sdept=?math? and sage<>20
4.3.8 SELECT练习一
对 STUDENT,COURSE,SC三个表,用 SQL完成以下操作。
1.创建关系 stu1(sno,sname,ssex,sage,sdept)。
2.对 STUDENT按姓名建立索引。
3.查询信息系所有年龄不大于 21岁的女生。
4.查询 1982年出生的男生的姓名。
5.查询信息系、金融系所有姓, 王, 的同学的姓名和年龄。
6.查询姓, 王, 的男同学的人数。
7.查询 2号课程的最低分。
8.查询总分最高的学生的学号。
9.查询每个同学的平均分。
10.查询每个同学所选修的课程门数。
4.3.8 SELECT练习二
? 对 STUDENT,COURSE,SC三个表完成以下操作:
1,查询, 计算机网络, 分数大于 90分的同学的姓名。
2,查询每门课程的课程名及选修人数。
3,查询选修了全部课程的学生姓名。
4,查询总学分已超过 40学分的学生学号、姓名、总学分。
5,查询至少选修了学生, 020001“选修的全部课程的姓名。
6,查询其他系中比 ’ CS?系任一学生年龄都小的学生名单。
7,查询每一个同学的学号、姓名、选修的课程名及分数。
8,查询信息系学生及年龄小于 20岁的学生。
9,查询信息系学生与年龄小于 20岁学生的交集。
10,查询信息系学生与年龄小于 20岁学生的差集。
4.4 数据更新
? 数据更新是对关系中的数据进行插入、修改、
删除。
? 在进行更新时,应注意维护数据库中数据的
一致性。
? SQL提供三条语句来完成,即 INSERT、
DELETE,UPDATE。
4.4 数据更新
? 4.4.1 插入记录
? 4.4.2 修改数据
? 4.4.3 删除记录
4.4.1 插入:插入单个元组
? 语句格式:
? INSERT INTO <表名 > [( <属性 1>[,<属性 2>… ) ]
VALUES (<常量 1> [,<常量 2>]… );
? 说明,(1)如某属性列在 INTO子句中没有,则新记录中
在该属性列上取空值。(2)为 NOT NULL的属性列不能
为空。(3)如 INTO子句中没有指明任何属性列,则新
记录须在每个属性列上均有值。
? 例23,向 S表插入(, 99035”,,陈红,,, 女,,
,CS”,20)
INSERT INTO S
VALUES(, 99035”,,陈红,,, 女,,, CS”,20)
4.4.1 插入:插入子查询结果
? 格式:
? INSERT INTO <表名 > [( <属性 1>[,<属性
2>… ) ]
子查询;
? 例24:先建一个与 S同结构的关系 S2,然后
将 S的所有男生数据插入 S2中
INSERT INTO S2
SELECT * FROM S
WHERE ssex=?男 ’ ;
4.4.2 修改数据
? 语句格式:
UPDATE <表名 >
SET <列名 >=<表达式 >[,<列名 >=<表达式 > ]…
[WHERE <条件 >];
? 例25:将信息系全体学生成绩置 0。
UPDATE SC
SET Grade=0
WHERE ?IS?=
(SELECT Sdept FROM Student
WHERE Student.Sno=Sc.Sno);
4.4.3 删除数据
? 语句格式:
DLEETE FROM <表名 >
[WHERE <条件 >];
? 例26,删除, 李红, 的学生记录。
DELETE FROM Student
WHERE Sname=?李红 ’ ;
? 例27,删除信息系全体学生的选课记录。
DELETE FROM SC
WHERE ?IS?=
(SELECT Sdept FROM Student
WHERE Student.Sno=Sc.Sno);
4.5 视图
? 什么是视图?
? 视图是从不同角度观察库中数据所得的一个
数据集合。如 student表中所有的男生,所
有数学系学生。
? 视图是数据库一种重要的数据保护机制,可
增强数据的独立性。
? 开发数据库应用系统时应进行规划设计,确
定需要建立哪些视图。
4.5 视图
? 4.5.1 视图基本知识
? 4.5.2视图的功能
? 4.5.3 建立视图
? 4.5.4 查询视图
? 4.5.5 删除视图
? 4.5.6 更新视图
? 4.5.7 视图的类型
4.5.1 视图基本知识
?视图与基本表的区别:
?( 1)视图是多用户从不同角度观察库中数据的重
要机制。
?( 2)视图是从一个或几个基本表(或视图)导出
的表,是个虚表,本身不保存数据,数据仍保存在
基本表中。
?( 3)在视图上可再定义新视图。视图一经定义,
就可和基本表一样被查询和删除,但对视图的增、
删、改操作有限制。
4.5.2 视图的功能
? 视图的功能包括:
? ( 1)能够简化用户的操作;
? ( 2)视图能使用户从多种角度看待同一数
据;
? ( 3)对重构数据库提供了一定程度的逻辑
独立性;
? ( 4)能对机密数据提供安全保护。
4.5.3 建立视图
? CREATE VIEW <视图名 > [( <列名 >[,<列名 >… ) ]
AS <子查询 >
[WITH CHECK OPTION];
? 说明:
1,子查询一般不允许含有 ORDER BY 和 DISTINCT短语。
2,with check option 表示对视图进行 update,insert、
delete操作时要保证所操作的行满足视图定义的谓词条件。
3,在以下情况必须在视图中的确定列名:
A,其中某个列不是单纯的属性名而是集函数或表达式;
B,多表连接时选出了几个同名列作为视图的字段;
C,需要在视图中为某个列启用更合适的名字。
? 例28, 创建数学系学生的视图。
CREATE VIEW MATH_S
AS
SELECT * FROM S WHERE SDEPT=‘MATH’;
? 例 29, 建立选修了“数据库原理”的学生视图(从多表
中取数)
CREATE VIEW DB_S(SNO,SNAME,GRADE)
AS
SELECT S,SNO,SNAME,GRADE FROM S,C,SC
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND
CNAME=‘数据库原理’;
4.5.3 建立视图示例
4.5.4 删除视图
? 格式, DROP VIEW <视图名 >;
? 说明,1,删除基本表后,基本表的视图失效。
2,视图被删后,该视图的导出视图也将失效。
? 例30:将学生的学号及平均成绩创建一个视图。
CREATE VIEW S_G(sno,gavg)
AS
SELECT sno,AVG(grade) FROM SC
GROUP BY sno;
? 例31:删除视图 S_G。
DROP VIEW S_G;
4.5.5 查询视图
? 对视图的查询最终将转变为对基本表的查询。
? 例32:查询数学系选修了 3号课程的学生。
SELECT sno,sname FROM math_student,sc
WHERE math_student.sno=sc.sno AND sc.cno=?3?
? 例33:查询平均成绩大于 95分的学生学号。
SELECT sno,AVG(grade) FROM SC
GROUP BY sno
HAVING AVG(grade)>95;
? 例34,这个查询不能用视图:
SELECT * FROM S_G WHERE gavg>95
4.5.6 更新视图
? 更新包括插入( INSERT)、删除( DELETE)、修
改( UPDATE)。 对视图的更新最终要转化为对
基本表的更新。但不是所有的视图都能转化为对
基本表的更新,有些视图是不能更新的。
? 例35:数学系学号为 ‘ 200133?的学生改名为
‘ 张强 ’ 。
UPDATE math_student
SET sname= ?张强 ’
WHERE sno=?200133?
4.5.6 更新视图例子
? 例36:向数学系学生视图插入一新生记录
( ‘ 200158?,‘ 李强 ’, ‘ 男 ’, 22,‘ 数学系 ’ )。
INSERT INTO math_student
VALUES ( ‘ 200158?,‘ 李强 ’, ‘ 男 ’, 22)
? 例37:删除数学系学号为 ‘ 200168?的学生。
DELETE FROM math_student
WHERE sno= ?200168?
? 例38:将学号为 ‘ 200138?的学生的平均成绩改为 85
分。
(对该视图的更新不能实现!!)
4.5.7 视图的类型
4.6 数据控制
? SQL提供了数据控制功能,能在一定程度上
保证数据的安全性、完整性、并提供了一定的
并发控制和恢复能力。
? 1,完整性:定义库结构
? 2,安全性:存取控制,规定不同用户对于不同
数据对象允许执行的操作,并控制各用户它有
权存取的数据。
? 3,并发控制和恢复,SQL支持事务、提交、回
滚等概念。
4.6 数据控制
4.6.1 权限
4.6.2 授权
4.6.3 收权
4.6.1 权限
? 不同类型的操作对象的操作权限。
对象 对象类型 操作权限
属性列 TABLE Select,insert,update,delete,
all privieges
视图 TABLE Select,insert,update,delete,
all privieges
基本表 TABLE Select,insert,update,delete,
alter,index,all privieges
数据库 DATABASE Createtab
4.6.2 授权
? 语句格式:
GRANT <权限 >[,<权限 >]…
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]… [WITH GRANT OPTION];
? 说明:
( 1)不同类型的操作对象的操作权限。
( 2)接受权限的用户可以是一个或多个,也可是 PUBLIC。
( 3) WITH GRANT OPTION,用户可将权限授予别的用户。
4.6.2 授权例题
? 例39, 把查询 student表和修改学生学号的权限授给
用户 user2
GRANT UPDATE(sno),SELECT
ON student
TO user2;
? 例40, 把对 SC表的删除权限授给 user5,并允许他
此权限授予给别的用户。
GRANT DELETE
ON sc
TO user5
WITH GRANT OPTION;
4.6.3 收回权限
? 语句格式:
REVOKE <权限 >[,<权限 >] …
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]… ;
? 例41,把 user2对学生学号的修改权限收回。
REVOKE UPDATE( sno)
ON TABLE student
FROM user2;
? 例42,收回所有用户对SC表的查询权限。
REVOKE SELECT ON sc
FROM PUBLIC;
4.6.4 SQL练习
对 STUDENT,COURSE,SC三个表完成以下操作:
1,向 student中增一新同学
(“020089”,,王飞,,, 男,, 19,,IS”)
2,删除一, 李军, 同学的所有信息。
3,为信息系所有男生建一视图 S_ISM。
4,利用视图查询信息系, 王强, 同学。
5,授给 user2用户更新 SC关系的权限。
6,从 user2用户收回更新 SC关系的权限。
4.7 嵌入式 SQL
? SQL是非过程性语言,无过程性结构,大多数语句
独立执行,不能根据不同的条件执行不同的任务,
所以单纯用 SQL语句很难完成实际的应用,往往需
要将 SQL语言同其它高级语言结合起来使用。
? SQL有两种用法:自含式 SQL(交互式)和嵌入式
SQL 。
? 自含式 SQL就是在 DBMS环境中使用 SQL来对关系进
行交互式操作,本节主要讲述嵌入式 SQL 的用法。
4.7 嵌入式 SQL
? 4.7.1 嵌入式 SQL一般用法
? 4.7.2 高级语言与 SQL语句通信
? 4.7.3 不用游标的 SQL语句
? 4.7.4 游标的用法
? 4.7.5使用游标的 SQL语句
? 4.7.6 静态 SQL和动态 SQL
4.7.1 嵌入式 SQL一般用法
? 1,一般形式为,EXEC SQL <SQL语句 >;
C语言中:例 EXEC SQL DROP TABLE student;
COBLE语言中,EXEC SQL DROP TABLE student
END-EXEC;
? 2,处理方式:
( 1)预编译;
( 2)修改扩充宿主语言使之能处理 SQL语句。
4.7.2 高级语言与 SQL语句通信
? ( 1)通过使主变量或指示变量,可以向 SQL语句输入或
输出值。一般变量前加,,, 号。
? ( 2) SQL语句每次执行后通过 SQL通信区返回状态信息,
SQLCODE。
? ( 3) 游标
SQL面向集合,主语言面向记录,一组主变量一次只能存
放一条记录,为此,嵌入式 SQL常使用游标来协调两种不
同的处理方式。
游标是系统为用户开设的一个数据缓冲区,存放 SQL执行
的结果。每个游标区有一个名字,用户可利用 SQL语句从
游标中一条条取记录,并赋给主变量,交由主语言作进一
步处理。
4.7.3 不用游标的 SQL语句之一
1,说明性语句
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION
2,数据定义语句
EXEC SQL CREATE TABLE student1
(sno char(5) NOT NULL UNIQUE,
sname char(20));
3,数据控制语句
EXEC SQL GRANT INSERT ON TABLE student TO U1;
4,查询结果为单记录的 SELECT语句
EXEC SQL SELECT …,.INTO <主变量 >[<指示变量 >][,
<主变量 >[<指示变量 >]..
4.7.3 不用游标的 SQL语句之二
5,非 CURRENT形式的 UPDATE语句
EXEC SQL UPDATE SC SET Grade=:newgrade
WHERE sno=:givensno;
6,非 CURRENT形式的 DELECT语句
EXEC SQL DELETE FROM SC WHERE sno=
(SELECT sno FROM student
WHERE sname=:stdname);
7,INSERT语句
Gardeid=-1
EXEC SQL INSERT INTO SC(sno,cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
4.7.4 使用游标的步骤
1,说明游标
EXEC SQL DECLARE <游标名 > CURSOR FOR
<SELECT 语句 >;
2,打开游标
EXEC SQL OPEN <游标名 >;
3,推进游标指针并取当前记录
EXEC SQL FETCH <游标名 > INTO <主变量 >[<指示
变量 >][,<主变量 >[<指示变量 >]
4,关闭游标
EXEC SQL <游标名 >;
4.7.5 使用游标的 SQL语句
? 1,查询结果为多条记录的 SELECT语句
? 2,CURRENT形式的 UPDATE语句和 DELECT语
句( p122)
4.7.6 静态 SQL和动态 SQL
? 静态 SQL,语句中主变量的个数和数据类型在预编译时
是确定的,只有主变量的值是程序运行过程中动态输入
的。编程灵活性不足。
? 动态 SQL,允许程序在运行过程中临时, 组装, SQL语
句。如果在编译时下列信息不确定则要用动态 SQL语句:
SQL语句正文、主变量个数、主变量的数据类型,SQL
语句中引用的数据库对象(列、索引、基本表、视图
等)。
? SQL提供了相应语句实现动态 SQL,EXECUTE
IMMEDATE,PREPARE,EXECUTE,DESCRIBE等。
4.8 小结
? 本章节主要讲述了 SQL的用法。
? SQL86可操纵的元素主要的表、索引、视图等
? 数据定义是建立表、索引、视图。
? SQL查询用 SELECT,这是重点和难点。
? 数据更新包括插入、修改、删除。
? 视图是一种很好的机制,可保护数据安全
? 权限是对数据库操作时要考虑的因素,如何授权和收
回权限,在数据库管理中很重要。
? 在高级语言中使用 SQL很方便,但要注意一些问题。
4.9 练习 1
? 4,1设有三个数据表,写出下列操作的 SQL语句。
R(BH,XM,XB,DWH)表示:编号、姓名、性别、单位号
S(DWH,DWM)表示:单位号、单位名
T(BH,XM,XB,DWH)表示:编号、姓名、性别、单位号
? (1)实现 R∪ T。
? (2)实现 σDWH=‘100’(R) 。
? (3)实现 ΠXM,XB(R) 。
? (4)实现 ΠXM,DWH(σXB=‘女’ (R)) 。
? (5)实现 R*S 。
? (6)实现 ΠXM,XB,DWM(σXB=‘男’ (R*S)) 。
4.9 练习 2
? 4,2设有如下关系表 R(NO,NAME,SEX,AGE,CLASS)主
关键字是 NO,其中 NO为学号,NAME为姓名,SEX为性
别,AGE为年龄,CLASS为班号。
? 写出实现下列功能的 SQL语句:
(1) 插入一个记录 (25,?李明 ’,?男 ’,21,?95031?)。
(2) 插入 ’ 95031?班学号为 30、姓名为 ’ 郑和 ’ 的学生
记录。
(3) 将学号为 10的学生姓名改龙 ’ 王华 ’ 。
(4) 将所在 ’ 95101?班号改为 ’ 95091?。
(5) 删除学号为 20的学生记录。
(6) 删除姓 ’ 王 ’ 的学生记录。
4.9 练习 3
? 4,3设有如下三个基本表,表结构如下:
BORROWER(借书证号,姓名,系名,班级)
LOANS(借书证号,图书登记号,借书日期)
BOOKS(索书号,书名,作者,图书登记号,出版社,
价格)
? 试用 SQL语言进行查询:
(1) 检索借了 5本书以上的学生的借书证号、姓名、系名
和借书数量。
(2) 检索借书和欧阳同学所借图书中任意一本相同的学生
的姓名、系名、书名和借书日期。
(3) 建立信息系学生借书的视图 SB,该视图的属性列由
借书证号、姓名、班级、图书登记号、书名、出版社
和借书日期组成。
? SQL语言(结构化查询语言)是当前关系数据
库的标准操作语言。
? 大部分的 RDBMS都支持 SQL。
? SQL有 86,89,92,99版本。
? 本章主要讲述 SQL92语言的用法。
? 要求能熟练使用 SQL语句在不同的 RDBMS中完
成数据库的基本操作。
第 4章 SQL语言
? 4.1 SQL概述
? 4.2 数据定义
? 4.3 数据查询
? 4.4 数据更新
? 4.5 视图
? 4.6 数据控制
? 4.7 嵌入式 SQL
? 4.8小结
? 4.9 练习
4.1 SQL概述
? SQL经历了一个逐步发展过程。
? SQL具有不同于其他语言的特点。
? SQL对关系数据库模式提供支持。
? SQL语言语句简单,只用几条语句就能完成
数据库的基本操作。
? 本节主要介绍 SQL的基本知识,要求对 SQL
有一个全局性的基本了解。
4.1 SQL概述
? 4.1.1 SQL的发展过程
? 4.1.2 SQL的特点
? 4.1.3 SQL对关系数据库模式的支持
? 4.1.4 SQL语言的基本知识
4.1.1 SQL的发展过程
? 1974年由 Boyce 和 Chamberlin提出;
? 1975-1979年 IBM的 San Jose Research
Labortatory研制的 RDBMS原型系统S ystem R中
初次实现;
? 1986年 ANSI公布第一个 SQL标准;
? 1987,1989,1992…,不断扩充;
? 目前有三个标准,SQL86,SQL92,SQL99。
4.1.2 SQL的特点
? 1,综合统一。
? 2,高度非过程化。
? 3,面向集合操作。
? 4,以同一种语法结构提供两种使用方式
(自含式和嵌入式)。
? 5,简洁易学易用。
4.1.3 SQL对 RDBS模式的支持
SQL
视图 2视图 1
基本表 1 基本表 2 基本表 3 基本表 4
外模式
模式
内模式
存储文件 1 存储文件 2
4.1.4 SQL语言的基本知识
? SQL语句的动词只有九条。
数据定义 DDL CREATE,DROP,ALTER
数据查询 DQL SELECT
数据操纵 DML INSERT,UPDATE,DELETE
数据控制 DCL GRANT,REVOTE
4.2 数据定义
? SQL的数据定义语句( DDL)
? 可定义表结构,索引、视图等,也可进行修改
和删除。
? 定义表结构时要注意完整性约束。
? 定义 索引时要注意查询的要求和速度。
? 定义 视图时要注意用户和应用开发的需要。
4.2 数据定义
? 4.2.1 DDL概述
? 4.2.2 基本表的定义、删除和修改
? 4.2.3 索引操作 (建立和删除 )
4.2.1 DDL概述
? SQL的数据定义语句( DDL)包括以下语句:
创建 删除 修改
表 CTEATE TABLE DROP TABLE ALTER TABLE
视图 CTEATE VIEW DROP VIEW
索引 CTEATE INDEX DROP INDEX
? 注意:视图和索引无修改语句!
4.2.2 基本表操作一:定义
? 语句格式:
CREATE TABLE <表名 >( <列名 > <数据类型 > [列完
整性约束条件 ]
[<列名 > <数据类型 > [列完整性约束条件 ]… ])
[,<表级完整性约束条件 ];
? 例1:建立学生表 student1。
CREATE TABLE student1
(sno char(5) not null unique,
sname char(20),
ssex char(2) );
? 语句格式:
ALTER TABLE <表名 >
[ADD <新列名 > <数据类型 > [列完整性约
束条件 ]]
[DROP <完整性约束名 >]
[MODIFY <列名 > <数据类型 >];
? 例2:修改 course表结构增加一个 jc 属性
alter table course add jc char(20) not null;
? 例3:删除 course表的 jc 属性
alter table course drop jc;
4.2.2 基本表操作二:修改
4.2.2 基本表操作三:删除
? 语句格式:
DROP TABLE <表名 >;
? 删除表结构时,表中的数据也一并删除。
删除表要慎重!
? 例4:删除课程表。
drop table course;
4.2.3 索引:索引作用
? 建立索引可有效提高查询的速度。如果把一个基本库表比作
一本书,索引就好像书的目录,通过查询目录,可找到相关
章节的页号,从而可迅速地找到那一节内容。不同的是,基
本表可建立不止一个索引,它可按不同的属性或表达式建立
多个索引。
4.2.3 索引之二:建立
? 语句格式,
CREATE [UNIQUE] [CLUSTER] INDEX <索引名 >
ON <表名 > ( <列名 >[<次序 >] [,<列名 >[<次序
>]]… );
? 说明:
( 1) ASC升序,DESC降序,缺省为 ASC。
( 2) CLUSTER为聚族索引(指索引项的顺序与表中记录
的物理顺序一致的索引组织)。一个表只有一个。
( 3) UNIQUE表示唯一索引。
? 例5:按课程表的课程名建立索引。
create unique index course_name
on course(cname);
4.2.3 索引之三:删除
? 删除索引语句格式:
DROP INDEX <索引名 >;
? 例:
DROP INDEX course_name ;
4.3 数据查询语句
? 数据查询是 DBS最常用的一项操作。
? DBS必须提供强大而完善的数据查询功能。
? 对于关系数据库,查询有时可能需要从多
个表中取得数据。
? SQL只用 SELECT就能完成各种查询。
? SELECT用法很灵活。
4.3 数据查询
? 4.3.1 SELECT一般格式
? 4.3.2 SELECT查询方式
? 4.3.3 单表查询
? 4.3.4 多表查询
? 4.3.5 连接查询
4.3.1 SELECT一般格式
SELECT [ALL | DISTINCT] <目标列表达式 > [别名 ] [,
<目标列表达式 > [别名 ] ]…
FROM <表名或视图名 >[,<表名或视图名 >]…
[WHERE <条件表达式 >]
[GROUP BY <列名 1> [HAVING <条件表达式 > ]]
[ORDER BY <列名 2 >[ASC | DESC]];
4.3.1 SELECT一般格式说明
1,目标列表达式可以有以下格式:
( 1) *
( 2) <表名 >.*
( 3) COUNT([ALL | DISTINCT] * )
( 4) [<表名 >.]<属性列名表达式 > [别名 ] [,[<表名
>.]<属性列名表达式 > [别名 ]]…
2,WHERE条件表达式非常灵活
3,GROUP BY 表示按列名 1的值分组,每个组产生结果表
中一记录。 HAVING <条件表达式 > 表示符合条件的
组才输出。
4,[ORDER BY <列名 2 >[ASC | DESC]]:表示排序。
4.3.1 SQL语言简易格式
SELECT <列名 >,投影
FROM <表名 >,连接
WHERE <条件 >,选取
GROUP BY <列名 >,分组
HAVING <条件 >,去组
ORDER BY <列名 >,排序
4.3.1 SQL结果的转向
? SELECT … FROM … WHERE …
? 缺省:输出到临时窗口
? TO SCREEN:输出到屏幕
? TO <FileName>:输出到 TXT文件
? INTO TABLE <TableName>:输出到表
4.3.2 SELECT查询方式
? 1.单表查询
( 1)选择若干列:指定列;全部列;经过计算的列
( 2)选择若干行:消除重复的行;满足条件的行(比较大
小,确定范围,确定集合,字符匹配,空值,多条件);
( 3)对查询结果排序。( 4)使用集函数。( 5)分组
? 2,连接查询(等值与非等值连接;自身连接;外连接;
复合条件连接)
? 3,嵌套查询(用 IN子查询;用 =;用 ANY和 ALL;用
EXISTS)
4.3.3 查询:成绩管理数据库
? 在学生成绩管理数据库中,包括基本的三个关系:
student,course,sc 。
? ( 1) student( sno,sname,ssex,sage,sdept),表
示学号,姓名,性别,年龄,示所在系。主码为 sno。
? ( 2) Course (cno,cname,cpno,ccredit),表示课程
号,课程名,先行课程号,学分。主码为 cno。
? ( 3) SC (sno,cno,grade),表示学号,课程号,成绩。
主码为 (sno,cno)。
4.3.4 单表查询
? 例6,查询全体学生详细记录
select *
from student;
? 例7,查询信息系所有男生的学号、姓名、出生年份
Select sno,sname,2002-sage
from student
where ssex=‘男’ and sdept=‘IS’;
? 例8,查询选修过课的学生的学号
Select distinct sno
from sc;
4.3.4 查询满足条件的元组
查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!<,!>,NOT+上
述符号
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE ( %, _ )
空值 IS NULL,IS NOT NULL
多重条件 AND,OR
4.3.4 查询满足条件的元组例子
? 例9, 查询年龄在 25-30之间的学生姓名及性别。
Select sname,ssex from student
where sage between 25 and 30;
? 例10, 查询姓“欧阳”的学生 。
Select * from student
where sname like ‘欧阳 %’;
? 例11, 查询信息系 IS,数学系 MA和计算机系 CS的学生。
Select * from student
where sdept in (‘IS’,’ MA’,’ CS’);
4.3.4 使用集函数查询
? 集函数包括:
COUNT( [DISTINCT | ALL] *)统计元组个数
COUNT( [DISTINCT | ALL] <列名 >)统计一列中值的个数
SUM( [DISTINCT | ALL] <列名 >)计算一列值的总和
AVG( [DISTINCT | ALL] <列名 >)计算一列的平均值
MAX( [DISTINCT | ALL] <列名 >)计算一列的最大值
MAX( [DISTINCT | ALL] <列名 >)计算一列的最小值
? 例12, 统计学生总人数。
select count(*) from student;
? 例13, 查询选修了课程的学生人数。
select count(distinct sno) from sc;
4.3.5 分组查询
? 例14, 查询各个课程号与相应的选课人数据。
SELECT Cno COUNT(Sno)
FROM sc
GROUP BY Cno;
? 例 15, 查询选修了 4门课以上的学生的学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>4
4.3.6 连接查询
? 连接查询包括:等值与非等值连接;自身连接;外连接;
复合条件连接
? 例 16, 查询每一门课的间接先修课
Select first.cno,second.pcno
From course first,course second
Where first.pcno=second.cno;
? 例 17, 查询每个学生及其选课信息 (右外连接 )
Select student.sno,sname,ssex,sage,sdept,cno,
garde
From student,sc
Where student.sno=sc.sno(*);
4.3.7 嵌套查询
? 可以完成很复杂的查询功能。
? 子查询的结果作为父查询的条件件。
? 包括(用 IN子查询;用 =;用 ANY和 ALL;用
EXISTS)。
? 不同方法实现同一种查询效率相差很大,即需要进行
查询优化。
? >any 表示大于子查询中的某个值 ;
? >all 表示大于子查询中的所有值
4.3.6 嵌套查询 --EXISTS
? 带有 EXISTS的子查询不返回实际数据,只产生逻辑值,子
查询非空,返回 T,否则,返回 F。
? 例 18,查询选修了全部课程的学生姓名(即没有一门课程
他不选修)
Select sname from student
where not exists
(select * from course
where not exists
(select * from sc
where sno=student.sno and sno=course.cno));
4.3.7 嵌套查询 --EXISTS
? 例 19, 查询至少选修了学生, 2001002?选修的全部课程
的学号。
? 该查询转换为:不存在这样的课程 Y,学生 2001002选了 Y,
但学生 X没有选 Y。
Select distinct sno from sc scx
where not exists
(select * from sc scy
where scy.sno=?2001002? and not exists
(select * from sc scz
where scz.sno=scx.sno and scz.cno=scy.cno));
4.3.7 集合查询 —并交差
? 并 UNION、交 INTERSECT、差 MINUS。交差运算标
准 SQL未提供,通过其它方法实现。
? 例20, 查询数学系学生及年龄等于 20岁的学生。
Select * from student where sdept=?math?
Union
Select * from student where sage=20
? 例2 1,查询数学系学生与年龄等于 20岁学生的交集。
Select * from student
where sdept=?math? and sage=20
? 例22, 查询数学系学生与年龄等于 20岁学生的差集。
Select * from student
where sdept=?math? and sage<>20
4.3.8 SELECT练习一
对 STUDENT,COURSE,SC三个表,用 SQL完成以下操作。
1.创建关系 stu1(sno,sname,ssex,sage,sdept)。
2.对 STUDENT按姓名建立索引。
3.查询信息系所有年龄不大于 21岁的女生。
4.查询 1982年出生的男生的姓名。
5.查询信息系、金融系所有姓, 王, 的同学的姓名和年龄。
6.查询姓, 王, 的男同学的人数。
7.查询 2号课程的最低分。
8.查询总分最高的学生的学号。
9.查询每个同学的平均分。
10.查询每个同学所选修的课程门数。
4.3.8 SELECT练习二
? 对 STUDENT,COURSE,SC三个表完成以下操作:
1,查询, 计算机网络, 分数大于 90分的同学的姓名。
2,查询每门课程的课程名及选修人数。
3,查询选修了全部课程的学生姓名。
4,查询总学分已超过 40学分的学生学号、姓名、总学分。
5,查询至少选修了学生, 020001“选修的全部课程的姓名。
6,查询其他系中比 ’ CS?系任一学生年龄都小的学生名单。
7,查询每一个同学的学号、姓名、选修的课程名及分数。
8,查询信息系学生及年龄小于 20岁的学生。
9,查询信息系学生与年龄小于 20岁学生的交集。
10,查询信息系学生与年龄小于 20岁学生的差集。
4.4 数据更新
? 数据更新是对关系中的数据进行插入、修改、
删除。
? 在进行更新时,应注意维护数据库中数据的
一致性。
? SQL提供三条语句来完成,即 INSERT、
DELETE,UPDATE。
4.4 数据更新
? 4.4.1 插入记录
? 4.4.2 修改数据
? 4.4.3 删除记录
4.4.1 插入:插入单个元组
? 语句格式:
? INSERT INTO <表名 > [( <属性 1>[,<属性 2>… ) ]
VALUES (<常量 1> [,<常量 2>]… );
? 说明,(1)如某属性列在 INTO子句中没有,则新记录中
在该属性列上取空值。(2)为 NOT NULL的属性列不能
为空。(3)如 INTO子句中没有指明任何属性列,则新
记录须在每个属性列上均有值。
? 例23,向 S表插入(, 99035”,,陈红,,, 女,,
,CS”,20)
INSERT INTO S
VALUES(, 99035”,,陈红,,, 女,,, CS”,20)
4.4.1 插入:插入子查询结果
? 格式:
? INSERT INTO <表名 > [( <属性 1>[,<属性
2>… ) ]
子查询;
? 例24:先建一个与 S同结构的关系 S2,然后
将 S的所有男生数据插入 S2中
INSERT INTO S2
SELECT * FROM S
WHERE ssex=?男 ’ ;
4.4.2 修改数据
? 语句格式:
UPDATE <表名 >
SET <列名 >=<表达式 >[,<列名 >=<表达式 > ]…
[WHERE <条件 >];
? 例25:将信息系全体学生成绩置 0。
UPDATE SC
SET Grade=0
WHERE ?IS?=
(SELECT Sdept FROM Student
WHERE Student.Sno=Sc.Sno);
4.4.3 删除数据
? 语句格式:
DLEETE FROM <表名 >
[WHERE <条件 >];
? 例26,删除, 李红, 的学生记录。
DELETE FROM Student
WHERE Sname=?李红 ’ ;
? 例27,删除信息系全体学生的选课记录。
DELETE FROM SC
WHERE ?IS?=
(SELECT Sdept FROM Student
WHERE Student.Sno=Sc.Sno);
4.5 视图
? 什么是视图?
? 视图是从不同角度观察库中数据所得的一个
数据集合。如 student表中所有的男生,所
有数学系学生。
? 视图是数据库一种重要的数据保护机制,可
增强数据的独立性。
? 开发数据库应用系统时应进行规划设计,确
定需要建立哪些视图。
4.5 视图
? 4.5.1 视图基本知识
? 4.5.2视图的功能
? 4.5.3 建立视图
? 4.5.4 查询视图
? 4.5.5 删除视图
? 4.5.6 更新视图
? 4.5.7 视图的类型
4.5.1 视图基本知识
?视图与基本表的区别:
?( 1)视图是多用户从不同角度观察库中数据的重
要机制。
?( 2)视图是从一个或几个基本表(或视图)导出
的表,是个虚表,本身不保存数据,数据仍保存在
基本表中。
?( 3)在视图上可再定义新视图。视图一经定义,
就可和基本表一样被查询和删除,但对视图的增、
删、改操作有限制。
4.5.2 视图的功能
? 视图的功能包括:
? ( 1)能够简化用户的操作;
? ( 2)视图能使用户从多种角度看待同一数
据;
? ( 3)对重构数据库提供了一定程度的逻辑
独立性;
? ( 4)能对机密数据提供安全保护。
4.5.3 建立视图
? CREATE VIEW <视图名 > [( <列名 >[,<列名 >… ) ]
AS <子查询 >
[WITH CHECK OPTION];
? 说明:
1,子查询一般不允许含有 ORDER BY 和 DISTINCT短语。
2,with check option 表示对视图进行 update,insert、
delete操作时要保证所操作的行满足视图定义的谓词条件。
3,在以下情况必须在视图中的确定列名:
A,其中某个列不是单纯的属性名而是集函数或表达式;
B,多表连接时选出了几个同名列作为视图的字段;
C,需要在视图中为某个列启用更合适的名字。
? 例28, 创建数学系学生的视图。
CREATE VIEW MATH_S
AS
SELECT * FROM S WHERE SDEPT=‘MATH’;
? 例 29, 建立选修了“数据库原理”的学生视图(从多表
中取数)
CREATE VIEW DB_S(SNO,SNAME,GRADE)
AS
SELECT S,SNO,SNAME,GRADE FROM S,C,SC
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND
CNAME=‘数据库原理’;
4.5.3 建立视图示例
4.5.4 删除视图
? 格式, DROP VIEW <视图名 >;
? 说明,1,删除基本表后,基本表的视图失效。
2,视图被删后,该视图的导出视图也将失效。
? 例30:将学生的学号及平均成绩创建一个视图。
CREATE VIEW S_G(sno,gavg)
AS
SELECT sno,AVG(grade) FROM SC
GROUP BY sno;
? 例31:删除视图 S_G。
DROP VIEW S_G;
4.5.5 查询视图
? 对视图的查询最终将转变为对基本表的查询。
? 例32:查询数学系选修了 3号课程的学生。
SELECT sno,sname FROM math_student,sc
WHERE math_student.sno=sc.sno AND sc.cno=?3?
? 例33:查询平均成绩大于 95分的学生学号。
SELECT sno,AVG(grade) FROM SC
GROUP BY sno
HAVING AVG(grade)>95;
? 例34,这个查询不能用视图:
SELECT * FROM S_G WHERE gavg>95
4.5.6 更新视图
? 更新包括插入( INSERT)、删除( DELETE)、修
改( UPDATE)。 对视图的更新最终要转化为对
基本表的更新。但不是所有的视图都能转化为对
基本表的更新,有些视图是不能更新的。
? 例35:数学系学号为 ‘ 200133?的学生改名为
‘ 张强 ’ 。
UPDATE math_student
SET sname= ?张强 ’
WHERE sno=?200133?
4.5.6 更新视图例子
? 例36:向数学系学生视图插入一新生记录
( ‘ 200158?,‘ 李强 ’, ‘ 男 ’, 22,‘ 数学系 ’ )。
INSERT INTO math_student
VALUES ( ‘ 200158?,‘ 李强 ’, ‘ 男 ’, 22)
? 例37:删除数学系学号为 ‘ 200168?的学生。
DELETE FROM math_student
WHERE sno= ?200168?
? 例38:将学号为 ‘ 200138?的学生的平均成绩改为 85
分。
(对该视图的更新不能实现!!)
4.5.7 视图的类型
4.6 数据控制
? SQL提供了数据控制功能,能在一定程度上
保证数据的安全性、完整性、并提供了一定的
并发控制和恢复能力。
? 1,完整性:定义库结构
? 2,安全性:存取控制,规定不同用户对于不同
数据对象允许执行的操作,并控制各用户它有
权存取的数据。
? 3,并发控制和恢复,SQL支持事务、提交、回
滚等概念。
4.6 数据控制
4.6.1 权限
4.6.2 授权
4.6.3 收权
4.6.1 权限
? 不同类型的操作对象的操作权限。
对象 对象类型 操作权限
属性列 TABLE Select,insert,update,delete,
all privieges
视图 TABLE Select,insert,update,delete,
all privieges
基本表 TABLE Select,insert,update,delete,
alter,index,all privieges
数据库 DATABASE Createtab
4.6.2 授权
? 语句格式:
GRANT <权限 >[,<权限 >]…
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]… [WITH GRANT OPTION];
? 说明:
( 1)不同类型的操作对象的操作权限。
( 2)接受权限的用户可以是一个或多个,也可是 PUBLIC。
( 3) WITH GRANT OPTION,用户可将权限授予别的用户。
4.6.2 授权例题
? 例39, 把查询 student表和修改学生学号的权限授给
用户 user2
GRANT UPDATE(sno),SELECT
ON student
TO user2;
? 例40, 把对 SC表的删除权限授给 user5,并允许他
此权限授予给别的用户。
GRANT DELETE
ON sc
TO user5
WITH GRANT OPTION;
4.6.3 收回权限
? 语句格式:
REVOKE <权限 >[,<权限 >] …
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]… ;
? 例41,把 user2对学生学号的修改权限收回。
REVOKE UPDATE( sno)
ON TABLE student
FROM user2;
? 例42,收回所有用户对SC表的查询权限。
REVOKE SELECT ON sc
FROM PUBLIC;
4.6.4 SQL练习
对 STUDENT,COURSE,SC三个表完成以下操作:
1,向 student中增一新同学
(“020089”,,王飞,,, 男,, 19,,IS”)
2,删除一, 李军, 同学的所有信息。
3,为信息系所有男生建一视图 S_ISM。
4,利用视图查询信息系, 王强, 同学。
5,授给 user2用户更新 SC关系的权限。
6,从 user2用户收回更新 SC关系的权限。
4.7 嵌入式 SQL
? SQL是非过程性语言,无过程性结构,大多数语句
独立执行,不能根据不同的条件执行不同的任务,
所以单纯用 SQL语句很难完成实际的应用,往往需
要将 SQL语言同其它高级语言结合起来使用。
? SQL有两种用法:自含式 SQL(交互式)和嵌入式
SQL 。
? 自含式 SQL就是在 DBMS环境中使用 SQL来对关系进
行交互式操作,本节主要讲述嵌入式 SQL 的用法。
4.7 嵌入式 SQL
? 4.7.1 嵌入式 SQL一般用法
? 4.7.2 高级语言与 SQL语句通信
? 4.7.3 不用游标的 SQL语句
? 4.7.4 游标的用法
? 4.7.5使用游标的 SQL语句
? 4.7.6 静态 SQL和动态 SQL
4.7.1 嵌入式 SQL一般用法
? 1,一般形式为,EXEC SQL <SQL语句 >;
C语言中:例 EXEC SQL DROP TABLE student;
COBLE语言中,EXEC SQL DROP TABLE student
END-EXEC;
? 2,处理方式:
( 1)预编译;
( 2)修改扩充宿主语言使之能处理 SQL语句。
4.7.2 高级语言与 SQL语句通信
? ( 1)通过使主变量或指示变量,可以向 SQL语句输入或
输出值。一般变量前加,,, 号。
? ( 2) SQL语句每次执行后通过 SQL通信区返回状态信息,
SQLCODE。
? ( 3) 游标
SQL面向集合,主语言面向记录,一组主变量一次只能存
放一条记录,为此,嵌入式 SQL常使用游标来协调两种不
同的处理方式。
游标是系统为用户开设的一个数据缓冲区,存放 SQL执行
的结果。每个游标区有一个名字,用户可利用 SQL语句从
游标中一条条取记录,并赋给主变量,交由主语言作进一
步处理。
4.7.3 不用游标的 SQL语句之一
1,说明性语句
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION
2,数据定义语句
EXEC SQL CREATE TABLE student1
(sno char(5) NOT NULL UNIQUE,
sname char(20));
3,数据控制语句
EXEC SQL GRANT INSERT ON TABLE student TO U1;
4,查询结果为单记录的 SELECT语句
EXEC SQL SELECT …,.INTO <主变量 >[<指示变量 >][,
<主变量 >[<指示变量 >]..
4.7.3 不用游标的 SQL语句之二
5,非 CURRENT形式的 UPDATE语句
EXEC SQL UPDATE SC SET Grade=:newgrade
WHERE sno=:givensno;
6,非 CURRENT形式的 DELECT语句
EXEC SQL DELETE FROM SC WHERE sno=
(SELECT sno FROM student
WHERE sname=:stdname);
7,INSERT语句
Gardeid=-1
EXEC SQL INSERT INTO SC(sno,cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
4.7.4 使用游标的步骤
1,说明游标
EXEC SQL DECLARE <游标名 > CURSOR FOR
<SELECT 语句 >;
2,打开游标
EXEC SQL OPEN <游标名 >;
3,推进游标指针并取当前记录
EXEC SQL FETCH <游标名 > INTO <主变量 >[<指示
变量 >][,<主变量 >[<指示变量 >]
4,关闭游标
EXEC SQL <游标名 >;
4.7.5 使用游标的 SQL语句
? 1,查询结果为多条记录的 SELECT语句
? 2,CURRENT形式的 UPDATE语句和 DELECT语
句( p122)
4.7.6 静态 SQL和动态 SQL
? 静态 SQL,语句中主变量的个数和数据类型在预编译时
是确定的,只有主变量的值是程序运行过程中动态输入
的。编程灵活性不足。
? 动态 SQL,允许程序在运行过程中临时, 组装, SQL语
句。如果在编译时下列信息不确定则要用动态 SQL语句:
SQL语句正文、主变量个数、主变量的数据类型,SQL
语句中引用的数据库对象(列、索引、基本表、视图
等)。
? SQL提供了相应语句实现动态 SQL,EXECUTE
IMMEDATE,PREPARE,EXECUTE,DESCRIBE等。
4.8 小结
? 本章节主要讲述了 SQL的用法。
? SQL86可操纵的元素主要的表、索引、视图等
? 数据定义是建立表、索引、视图。
? SQL查询用 SELECT,这是重点和难点。
? 数据更新包括插入、修改、删除。
? 视图是一种很好的机制,可保护数据安全
? 权限是对数据库操作时要考虑的因素,如何授权和收
回权限,在数据库管理中很重要。
? 在高级语言中使用 SQL很方便,但要注意一些问题。
4.9 练习 1
? 4,1设有三个数据表,写出下列操作的 SQL语句。
R(BH,XM,XB,DWH)表示:编号、姓名、性别、单位号
S(DWH,DWM)表示:单位号、单位名
T(BH,XM,XB,DWH)表示:编号、姓名、性别、单位号
? (1)实现 R∪ T。
? (2)实现 σDWH=‘100’(R) 。
? (3)实现 ΠXM,XB(R) 。
? (4)实现 ΠXM,DWH(σXB=‘女’ (R)) 。
? (5)实现 R*S 。
? (6)实现 ΠXM,XB,DWM(σXB=‘男’ (R*S)) 。
4.9 练习 2
? 4,2设有如下关系表 R(NO,NAME,SEX,AGE,CLASS)主
关键字是 NO,其中 NO为学号,NAME为姓名,SEX为性
别,AGE为年龄,CLASS为班号。
? 写出实现下列功能的 SQL语句:
(1) 插入一个记录 (25,?李明 ’,?男 ’,21,?95031?)。
(2) 插入 ’ 95031?班学号为 30、姓名为 ’ 郑和 ’ 的学生
记录。
(3) 将学号为 10的学生姓名改龙 ’ 王华 ’ 。
(4) 将所在 ’ 95101?班号改为 ’ 95091?。
(5) 删除学号为 20的学生记录。
(6) 删除姓 ’ 王 ’ 的学生记录。
4.9 练习 3
? 4,3设有如下三个基本表,表结构如下:
BORROWER(借书证号,姓名,系名,班级)
LOANS(借书证号,图书登记号,借书日期)
BOOKS(索书号,书名,作者,图书登记号,出版社,
价格)
? 试用 SQL语言进行查询:
(1) 检索借了 5本书以上的学生的借书证号、姓名、系名
和借书数量。
(2) 检索借书和欧阳同学所借图书中任意一本相同的学生
的姓名、系名、书名和借书日期。
(3) 建立信息系学生借书的视图 SB,该视图的属性列由
借书证号、姓名、班级、图书登记号、书名、出版社
和借书日期组成。