《数据库系统原理》PPT电子课件教案- 第三章 关系数据库标准语言SQL.ppt_第1页
《数据库系统原理》PPT电子课件教案- 第三章 关系数据库标准语言SQL.ppt_第2页
《数据库系统原理》PPT电子课件教案- 第三章 关系数据库标准语言SQL.ppt_第3页
《数据库系统原理》PPT电子课件教案- 第三章 关系数据库标准语言SQL.ppt_第4页
《数据库系统原理》PPT电子课件教案- 第三章 关系数据库标准语言SQL.ppt_第5页
免费预览已结束,剩余105页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 关系数据库标准语言sql,3.1 sql语言概述,sql(structured query language),结构化查询语言 是一种介于关系代数与关系演算之间的语言 已成为关系数据库的标准语言 支持关系系统,如:oracle、informix、sybase、ms sql、ingres、db2、vf、foxpro、access,sql86 由ansi(american national standard institute,美国国家标准局)于1986年10月公布 在1987年6月国际标准化组织osi( international standardization organization)把它采纳为国际标准。 sql89 iso于1989年4月公布,增强了完整性特征 sql92 iso于1992年公布,也称为sql2 sql3 酝酿中的新标准,增加面向对象功能,1. 数据定义 ddl语言(data definition language,数据定义语言),主要定义数据库的逻辑结构,包括定义基本表、视图和索引 2. 数据操纵 dml语言(data manipulation language,数据操纵语言)包括数据查询和更新(插入、删除和修改)两大类操作 3. 数据控制 dcl语言(data control language,数据控制语言),包括对基本表和视图的授权,完整性规则的描述和事务控制 4. 嵌入式sql的使用 规定了sql语句在宿主语言的程序中使用规则。,1. sql语言的组成:,1. 综合统一 查询、操纵、定义、控制操作功能一体化 语言风格统一,数据操作符统一性 2. 高度非过程化 用户只需提出“做什么”,而不必指明“怎么做” 隐蔽数据存取路径 3. 面向集合的操作方式 操作的对象和结果都是元组的集合(关系),2. sql语言的特点:,4. 以同一种语法结构提供两种使用方式 自含式语言,dbms中独立使用,是针对db的所有用户 嵌入式语言,嵌入到宿主语言中使用,针对应用程序员 两种类型的语法结构基本一致 5. 语言简洁,易学易用 类似于英语的自然语言 操作谓词少(核心功能只用9个动词),3. sql对关系数据库模式的支持,基本表b1,视图v1,基本表b3,基本表b4,存储文件s1,存储文件s2,基本表b2,视图v2,sql,外层/ 外模式,概念层/ 概念模式,内层/ 存储模式,基本表(base table): 数据库中实际独立存在的表(关系),存储在实际的文件中 不是由其它表导出的 存储文件 存储基本表的数据 视图(view) 是一个虚拟表 从基本表或其他视图中导出的表 没有实际的存储位置 数据库中只存放视图的定义而不存放视图对应的数据,数据仍然存放在导出视图的基本表中,3.2 数据定义,数据定义功能包括定义基本表、视图和索引 sql的数据定义语句,1. 定义基本表 create table 语句格式: create table ( 列级完整性约束条件 , 列级完整性约束条件 , );,例1 建立学生表student,由学号、姓名、性别、年龄、系别5个属性组成,要求学号属性不能取空值,并且值唯一。 create table student (sno char(8) not null unique, sname char(20) , ssex char(1) sage int, sdept char(15) ) 说明: sno不允许取空值,取值唯一,2. 修改基本表 alter table 语句格式 alter table add 完整性约束 drop modify 修改内容 增加新列和新的完整性约束条件(add子句) 删除指定的完整性约束条件(drop子句) 修改原有的列定义 ( modify子句),例2 向student表中增加“入学时间”列,其数据类型为日期型。 alter table student add scome date; 例3 将student表中年龄的数据类型改为半字长整数。 alter table student modify sage smallint; 例4 删除student表中学号必须取唯一值的约束 alter table student drop unique(sno);,3. 删除基本表 drop table 语句格式 drop table 例5 删除student表 drop table student 说明: 删除基本表定义时,表中的数据、在此表上建立的索引将同时被删除; 此表上的视图不被删除,但已无法使用。,4. 建立索引 create index 语句格式 create unique clusterindex on (, ) ; unique 表示此索引的每一个索引值只对应唯一的数据记录 cluster 表示要建立的索引是聚簇索引 聚簇索引 指索引项的顺序与表中记录的物理顺序一致的索引组织 索引的作用 1. 提供多个存取路径;2. 提高存取速度; 3. 保证行的唯一性。 说明 1. 一个表可以有任意多个索引 2. 索引会影响系统的开销(空间、速度) 3. 索引由系统自动使用和维护 4. 先录数据后建索引 5. 要对where子句用到的列名建立索引 6. 对索引列尽量定义为not null 7. 使用唯一索引保证列值的唯一性,例6 为学生-课程数据库中student,course,sc三个表建立索引。其中student表按学号升序建立唯一索引, course表按课程号升序建立唯一索引,sc表按学号升序课程号降序建立唯一索引。 create unique index stusno on student(sno) ; create unique index coucno on course(cno); create unique index scno on sc(sno asc,cno desc),5. 删除索引 语句格式 drop index 例7 删除student表的stusno索引 drop index stusno,3.3 查询,select语句 对已有的基本表(关系)和视图(虚表)进行数据查询,它不改变数据本身。 查询主要有: 单表查询 连接查询 嵌套查询 集合查询,select语句一般格式:,select all|distinct , from , where group by having order by asc|desc,学生-课程数据库 student(sno,sname,ssex,sage,sdept) 其中sno为主码 crouse(cno,cname,cpno,ccredit) 其中cno为主码 sc(sno,cno,grade) 其中(sno,cno)为主码,3.3.1 单表查询,1. 选择表中的若干列(投影查询) select 1)查询指定的列 1. 查询全体学生的学号与姓名 select sno,sname from student 2. 查询学生姓名、学号和性别 select sname,sno,ssex from student,2)查询全部列 1. 查询全体学生的详细记录 select * from student 等价于 select sno,sname,ssex,sage,sdept from student,2. 按人为次序显示全体学生的详细记录 select sno,sdept,sname,sage,ssex from student,3)查询经过计算的值 1. 查询全体学生的姓名及其出生年份 select sname,2003-sage from student 2. 查询全体学生的姓名、出生年份、所有系,要求以小写字母显示系名 select sname,year of birth:,2003- sage ,islower(sdept) from studen,4)列标题使用别名 1.查询全体学生的姓名、出生年份,并使用别名 select sname name,2003-sage birthday from student,2. 选择表中的若干行(选取查询)where 1)消除重复的行:distinct 1. 查询所有选修过课的学生的学号 select sno from sc 等价于: select all sno from sc 结果中保留了重复的行 select distinct sno from sc 结果中消除了重复的行,2)查询满足条件的元组 通过where子句实现 常用的查询条件,(1)比较大小:比较运算符 1. 查询计算机系全体学生的名单 select sname from student where sdept=cs 2. 查询年龄小于20岁学生 select * from student where sage=20 3. 查询考试成绩不及格学生的学号 select distinct sno from sc where grade60,(2)确定范围(not)between and 1.查询成绩在60至75之间的学生 select * from sc where grade between 60 and 75 或:select * from sc where grade=60 and grade=75 2. 查询成绩不在60至75之间的学生 select * from sc where grade not between 60 and 75,(3)确定集合(not)in 1. 查询选修了课程c1或c2或c3的学号 select distinct sno from sc where cno in (c1,c2,c3) 或:select distinct sno from sc where cno=c1 or cno=c2 or cno=c3 2. 查询既不是计算机系,也不是数学系的学生 select * from student where sdept not in (cs,ma),(4)字符匹配(模糊查询)(not)like 语法格式: not like escape 含义:查询指定的属性列值与相匹配的元组。 统配符 :%(百分号):代表任意长度的字符串 _(下划线):代表任意单个字符 escape短语,对统配符进行转义 1. 查询计算机系(cs)的学生 select * from student where sdept like cs 或: select * from student where sdept = cs (当匹配串中不含有统配符时,可用比较运算符取代),2. 查询姓赵的学生姓名、学号和性别 select sname,sno,ssex from student where sname like 赵% 3. 查询第二个字符为o的课程 select * from course where cname like _o% 4. 查询以db_开头,且倒数第2个字符为i的课程 select * from course where cname like db_%i_ escape,(5)涉及空值的查询:is (not)null 1. 查询缺少成绩的学生学号和相应课程号 select sno,cno from sc where grade is null 2. 查询有成绩的学生学号和相应课程号 select sno,cno from sc where grade is not null,(6)多重条件查询:and/or 1. 查询课程号为c2且成绩高于85分以上的学生 select * from sc where cno=c2 and grade85 2. 查询选修c1或c2且不低于70分的学生 select * from sc where (cno=c1 or cno=c2) and grade=70 在where子句中and和or同时存在时,and优先级高于or,用括号可以改变优先级,3. 对查询结果排序 order by 指定按照一个或多个属性列的升序(asc)或降序(desc)重新排列查询结果。 1.查询选修了c1的学生,成绩按降序排列 select * from sc where cno=c1 order by grade desc 降序排列,成绩为空的元组最先显示 升序排列,成绩为空的元组最后显示 2. 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列 select * from student order by sdept, sage desc,4. 集函数(库函数)查询 格式:集函数 (distinct|all ) 集函数 count *: 统计元组个数,用distinct消除重复行 count : 统计列值计个数,用distinct消除重复行 sum: 按列计算值的总和,对数值有效 avg: 按列计算平均值,对数值有效 max: 求一列值中最大值 min: 求一列值中最小值 1. 求计算机系(cs)学生的平均年龄 select avg(sage) from student where sdept=cs 2. 求95003学生的总分和平均分 select sum(grade), avg(grade) from sc where sno=95003,3. 求计算机系的学生总数 select count(*) from student where sdept=cs 统计行的个数 或: select count(sno) from student where sdept=cs 统计列值的个数 4. 查询共有几个系 select count (sdept) from student 重复的行统计在内 select count (distinct sdept) from student 消除重复的行 5. 求课程号c1的最高分和最低分以及高低分之间的差距 select max(grade),min(grade),max(grade)-min(grade) from sc where cno=c1,5. 对查询结果分组 group by 分组子句group by 分组条件having,去掉不符合条件的若干行 对查询结果的各行按一列或多列取值相等的原则进行分组,目的是细化集函数的作用对象 若未对查询结果分组,集函数作用于整个查询结果,即整个查询结果只有一个函数值 若对查询结果分组,集函数作用于每一个组,即每一组都有一个函数值,1. 查询各个课程号与相应的选课人数。 select cno, count(sno) from sc group by cno 2. 查询选修了3门以上课程的学号和门数。 select sno,count(sno) from sc group by sno having count(sno)3,3. 查询选修了3门以上课程学生的平均成绩,不统计不及格的课程。 select sno, avg(grade) from sc where grade=60 group by sno having count(*)3 where子句与having短语的根本区别在于作用对象不同。where子句作用于基本表或视图,从中选择满足条件的元组,having短语作用于组,从中选择满足条件的元组。,3.3.2 连接查询,查询同时涉及两个以上的表。 连接查询分为: 等值连接查询 非等值连接查询 自身连接查询 外连接查询 复合条件连接查询,1. 等值连接 连接条件(连接谓词):连接两个表的条件 格式:. . 当比较运算符为=时,称等值连接;使用其它运算符为非等值连接 连接谓词中的列名,称连接字段,连接字段的类型必须是可比的,但连接字段名可以不同,例1 查询每个学生及其选修课程的情况(p83) select student .*, sc.* from student, sc where student.sno=sc.sno 连接条件将两个表中的同一学生的元组连接起来 等值连接 select student .sno, sname, ssex, sage, sdept, cno, grade from student, sc where student.sno=sc.sno 在等值连接中去掉重复的列 自然连接,select student .sno, sname, ssex, sage, sdept, cno, grade from student, sc where student.sno=sc.sno(*) 外连接 *为外连接符 作用:相当于在表中增加了一个万能的全部为空值的行,它可以将那些不能与另一个表连接的元组进行连接 select student .*, sc.* from student, sc 笛卡儿积连接,2. 自身连接 例2 查询每一门课的间接先修课(先修课的先修课) select firse.cno, second.cpno from crouse firse, crouse second where firse.cpno=second.cno,firse(course),second(course),3. 复合条件连接 where子句中有多个条件的连接操作 例3 查询选修2号课程且成绩在90分以上的所有学生。 select student.sno, sname from student, sc where student.sno=sc.sno and sc.cno=2 and sc.grade=90 例4 查询每个学生选修的课程及其成绩。 select student.sno,sname,cname,grade from student, sc, course where student.sno=sc.sno and sc.cno=course.cno,3.3.3 嵌套查询,查询块: sql语言中,一个select-from-where语句 嵌套查询(子查询) 将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询。 上层查询块称主查询(外层查询、父查询) 下层查询块称子查询(内层查询) sql语言允许多层嵌套查询 嵌套查询的求解方法是由里向外处理 子查询的select语句中不能使用order by子句, order by子句只对最终查询结果排序。,1. 带有in谓词的子查询 指父查询与子查询之间用in进行连接,判断某个属性列值是否在子查询的结果中。 例1 查询与“刘晨”在同一个系的学生 select sno,sname,sdept from student where sdept in (select sdept from student where sname=刘晨) select s1.sno,s1.sname,s1.sdept from student s1,student s2 where s1.sdept=s2.sdept and s2.sname=刘晨 用表的自身连接查询来实现,例2 查询选修了课程名为“信息系统”学生学号和姓名。 select sno,sname from student where sno in (select sno from sc where cno in (select cno from course where cname=信息系统) 用子查询实现,例2 查询选修了课程名为“信息系统”学生学号和姓名。 select sno,sname from student where student.sno=sc.sno and sc.cno=course.cno and course. cname=信息系统 用连接查询实现,2. 带有比较运算符的子查询 指父查询与子查询之间用比较运算符进行连接。 当用户确切知道内层查询返回的是单值时,可以用比较运算符 子查询一定要跟在比较符后面 例1 查询与“刘晨”在同一个系的学生 select sno,sname,sdept from student where sdept= (select sdept from student where sname=刘晨),例2. 查询选修了课程名为“信息系统”学生学号和姓名 select sno,sname from student where sno in (select sno from sc where cno = (select cno from course where cname=信息系统),3. 带有any或all谓词的子查询 指父查询与子查询之间用any或all谓词进行连接 但使用any或all谓词时必须与比较运算符同时使用(比较运算符 + any或all) any: 查询结果中的某个(任一个)值 all:查询结果中的所有值,例1. 查询其他系中比信息系(is)任一学生年龄小的学生姓名和年龄 select sname,sage from student where sage is 带有any谓词的子查询 select sname,sage from student where sageis 带有集函数max的子查询,例2. 查询其他系中比信息系(is)所有学生年龄小的学生姓名和年龄 select sname,sage from student where sage is 带有all谓词的子查询 select sname,sage from student where sage is 带有集函数min的子查询,例3 查询选修了课程号c2的学生姓名 1) select sname from student where sno=any (select sno from sc where cno=c2) 带有any谓词的子查询 2) select sname from student where sno in (select sno from sc where cno=c2) 带有in谓词的子查询 3) select sname from student,sc where student.sno=sc.sno and sc.cno=c2 连接查询,any,all谓词与集函数及in谓词的等价转换关系,用集函数实现子查询比直接用any或all查询效率高,3.4 数据更新,包括插入、修改、删除数据三条语句。 1. 插入数据 insert 插入单个元组和插入子查询结果 1)插入单个元组 语句格式:insert into (, ) values ( , ( ) 功能:将新元组插入指定表中。 说明: 若into子句没有指明任何列名,则新插入的记录必须在每个属性列上均有值 在into子句中有没有出现的属性列,新记录在这些列上去空值;但若在定义表时,说明了某属性列not null,则此属性列不得取空值。 列名顺序不一定与表结构一致 列名与values值一一对应,例1. 插入学生记录:学号(012508),姓名(刘敏),性别(女),年龄(18),所在系(计算机) 。 insert into student values (012508,刘敏,女,18,计算机) 插入单个元组(一个记录) 例2. 插入一条选课记录(学号:012515, 课程号:2)。 insert into sc (sno,cno) values (012515,2) 插入单个元组的部分数据值,2)插入子查询结果(多个记录) 语句格式: insert into (, ) 子查询 功能: 批量插入,一次将子查询的结果全部插入到指定表中 例3. 将计算机系学生的学号加入选课表中 insert into sc(sno) select sno from student where sdept=计算机,2. 修改(更新)数据 update 语句格式: update set = , = where 功能:修改指定表中满足where子句条件的元组 说明: set子句用于指定修改方法 省略where子句则修改所有元组 表达式可为具体值、计算结果、子查询 update语句一次只能 操作一个表 当同一数据存放在不同表中时,修改此数据时,几个表都需要修改 注意保证数据的一致性,1)修改某一个元组的某些列值 例1 将学号为s1的学生的年龄改为20岁。 update student set sage=20 where sno=s1 2)修改多个元组的值 例2 将所有学生的年龄增加1岁。 update student set sage=sage+1 3)带子查询的修改语句 例3 将计算机系(cs)全体学生成绩置零。 update sc set grade=0 where cs= (select sdept from student where student.sno=sc.sno) 注:子查询只能跟在比较符之后,4)修改操作与数据库的一致性 update语句一次只能操作一个表 例4 学号为98008的学生因病休学一年,复学后转入99级学习,学号为99206。 update student set sno=99206 where sno=98008 update sc set sno=99206 where sno=98008 注:为保证数据库中数据一致性,必须保证这两条语句要么都做,要么都不做,3. 删除数据 delete 语句格式: delete from where 功能:从指定表中删除满足where子句条件的所有元组 说明 省略where子句,则删除表中全部元组 只删除表中的数据,不删除表的定义 注意保证数据的一致性 一次只能操作一个表,1)删除一个元组的值(一个记录) 例1 删除学号为98191的学生记录 delete from student where sno=98191 注意保证数据库中数据的一致性 2)删除多个元组的值(多个记录) 例2 删除所有学生的选课记录 delete from sc 没有where子句,将删除表中的所有元组 表为空表,但表的定义还存在 3)带子查询的删除语句 例3 删除计算机系所有学生的选课记录 delete from sc where 计算机= (select sdept from student where student.sno=sc.sno),3.5 视图,是一个虚表 是从一个或几个基本表(或视图)导出的表 数据库中只存放视图的定义,不存放视图对应的数据 视图提供给用户以多种角度观察数据库中数据 通过视图这样的窗口,看到数据库中用户感兴趣的数据 视图的操作:定义、查询、更新、删除,1. 定义视图 create view 语句格式: create view (,) as whth check option 说明: 视图由子查询的查询结果来定义 子查询。可以是任意复杂的select语句;但一般不允许排序或使用distinct短语 若指定whth check option子句,在对视图进行更新操作时,对子查询中的条件表达式进行检查。 省略列名,则视图中列名为子查询中目标列中的所有属性列。 指定列名:(1)有表达式或集函数时需指定列名;(2)有公共列名时需要指定列名;(3)启用新列名时需指定列名。 组成视图的列名要么全部省略,要么全部指定。,例1 建立信息系(is)学生的视图。 create view is_student as select sno,sname,sage from student where sdept=is 省略视图列名,取select指定的属性列名 视图建立在单表上 例2 建立信息系(is)学生的视图,要求在进行更新操作时仍须保证该视图只有信息系学生。 create view is_student as select sno,sname,sage from student where sdept=is with check option 对视图更新时,自动加上子查询条件表达式。,例3 创建信息系(is)选修1号课程学生的视图 create view is_s1 (sno,sname,grade) as select student.sno,sname,grade from student,sc where sdept=is and student.sno=sc.sno and sc.cno=1 有同名列存在,视图名后面必须指定各属性列名 视图可以建立在多个基本表上 例4 创建信息系选修1号课程且成绩在90分以上学生视图 create view is_s2 as select sno,sname,grade from is_s1 where grade90 视图可以建立在已定义好视图上,例5 定义一个反映学生出生年份的视图 create view bt_s(sno,sname,sbirth) as select sno,sname,2003-sage from student 列值通过表达式或集函数得到,视图名后必须指定列名 带表达式的视图(带虚拟列的视图)。 例6 将学生表中所有女生记录定义为一个视图 create view f_student(stdnum,name,sex,age,dept) as select * from student where ssex=女 由子查询select *建立的视图,当基本表结构修改时,视图可能无法使用 在修改基本表结构之后,删除由基本表导出的视图,然后重建(同名)视图,2. 删除视图 drop view 语句格式: drop view 说明: 删除视图,则视图定义从数据字典中撤消 基本表的数据不受影响, 在其上定义的视图失效 例7 删除视图is_s1 drop view is_s1 由is_s1导出的视图仍在数据字典中,但已经无法使用,3. 查询视图 dbms执行对视图的查询时,首先进行有效性检查,检查查询涉及的表、视图的是否在数据库中存在,若存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,转换成对基本表的查询,然后再执行这个经过修正的查询。 视图的消解:将对视图的查询转换为对基本表的查询过程。 行列子集视图一般可以正常转换为对基本表的查询,例8 在信息系学生的视图中找出年龄小于20岁的学生。 select sno,sage from is_student where sage20 is_student视图定义中子查询: select sno,sname,sage from student where sdept=is 实际操作:(修正后查询) select sno,sage from student where sdept=is and sage20,例9 查询信息系选修了1号课程的学生 select sno,sname from is_student, sc where is_student.sno=sc.sno and sc.cno=1 视图与基本表的连接查询 行列子集视图:某视图是从单个基本表中导出的,并且只是去掉了基本表的某些行和某些列,但保留了码,4. 更新视图 是指通过视图来插入(insert)、删除(delete)、修改(update)数据,语句格式同基本表数据更新 视图是虚表,对视图的更新最终要转换为对基本表的更新 为防止用户对不属于视图范围内的基本表中数据进行更新操作,可在定义视图时加上with check option子句 行列子集视图一般可以更新 例10 将is系学生视图is_student中学号为98001的学生姓名改为刘晨 update is_student set sname= 刘晨 where sno=98001 实际转换后的更新语句(对基本表中数据修改): update student set sname= 刘晨 where sno=98001 and sdept=is,例11向is系学生视图is_student中插入一个新记录:学号(98008),姓名(刘利),年龄(20)。 insert into is_student values(98008,刘利,20) 实际转换后的插入语句(插入数据到基本表中): insert into student (sno,sname,sage,sdept) values(98008,刘利,20,is) 例12 删除is系学生视图is_student中学号为98008的记录。 delete from is_student where sno=98008 实际转换后的删除语句(对基本表中数据删除): delete from student where sno=98008 and sdept=is,5. 视图的用途(优点) (1)能够简化用户的操作 能够为复杂的查询构造视图 能够隐藏数据的复杂性 从而有效地简化查询操作 (2)使用户能以多种角度看待同一数据 使不同目的的用户共享同一个数据库 减少冗余 (3)对数据库重构提供了一定的逻辑独立性 通过构造视图,能够在用户和应用程序与实际的基本表之间提供更好的数据独立性 (4)能够对机密数据提供安全保护 能够将对数据库的访问限制在一定的范围内 有利于数据的保密,3.6 数据控制,数据控制也称数据保护。包括: 安全性:是指保护数据库,以防非法使用造成数据泄露和破坏。 完整性控制:是指数据的正确性和相容性。主要目的是防止语义上不正确的数据进入数据库。 并发控制:当多个用户并发地操作数据库时,对他们加以控制、协调,保证并发操作正确执行,并保持数据库的一致性 数据恢复:是指当发生各种了类型的故障,使数据库处于不一致状态时,将数据库恢复到一致状态的功能。 sql语言数据控制功能: 存取控制:对用户权限的控制 管理数据库用户 控制用户权限的使用 控制权限的传递 用户的不同操作权限由dba和建表者(属主owner)来决定,1. 授权 grant 语句格式: grant , on to , |public with gran option 说明: 将指定操作对象的指定操作权限授予给指定的用户。 public 指数据库中的所有用户 指定with grant option子句,则获得某种权限的用户可以传播其权限 不同类型的操作对象有不同的操作权限,例1 把查询student表的权限授给liming。 grant select on table student to liming 一次向一个用户授权 例2 把对student表和course表的全部权限授予用户u2和u3。 grant all privileges on table student, course to u2,u3 一次向多个用户授权;一次传播多个同类对象的权限 例3 把对表sc的查询权限授予所有用户。 grant select on table sc to public 对所有用户 例4 把查询student表和修改学生学号的权限授给u4。 grant select,update(sno) on table student to u4 一次完成对基本表和属性列这些不同对象的授权,例5 把对表sc的insert权限授予u5,并允许他再将此权限授予其他用户。 grant insert on table sc to u5 with grant option 例6 u5传播其权限给u6 grant insert on table sc to u6 不带with子句,u6 不允许传播其权限,只能自己享用 例7 dba把在数据库sm中建立表的权限授予u8。 grant createtab on database sm to u8 dba拥有在数据库中建立表的权限,一般用户没有。 dba 可以把建立表的权限授予普通用户(u8),u8拥有此权限,可以在数据库sm中建立基本表,并对所建立的表拥有一切操作权限。,2. 收回权限 revoke 授予的权限可以有dba或其他授权者收回权限。 语句格式: revoke , on from , |public 例8. 把用户u4修改学生学号的权限收回。 revoke update(sno) on table student from u4,例9. 收回所有用户对sc表的查询权限。 revoke select on table sc from public 例10. 把用户u5对sc表的insert权限收回。 revoke insert on table sc from u5 dbms执行此语句,在收回u5对sc表的insert权限的同时,自动收回他所传播的此权限,并且收回权限的操作会级联下去。 系统只收回直接或间接从u5处获得的权限。 dba拥有对数据库中所有对象的所有权限,可向用户授权及收回用户权限 用户自己建立的表拥有全部的操作权限,并可把某些权限授予其他用户。,3.7 嵌入式sql,sql语言是面向集合的描述性语言。 sql语言是非过程性语言,本身无过程性结构 终端交互式方式下使用 嵌入到某种高级语言中使用 高级语言是过程性语言,本身有过程性结构 主语言(宿主语言):嵌入sql的高级语言 sql语句用来直接与数据库打交道,主语言语句用来控制程序流程及对sql语句的执行结果做进一步加工处理,3.7.1 嵌入式sql的一般形式,对宿主型数据库语言sql,dbms采用两种方法处理: 预编译的方法:(目前用的最多方法) 首先由dbms的预处理程序对源程序进行扫描,识别出sql语句,把它转换成主语言调用语句,使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。 修改、扩充主语言使之能够处理sql语句 区分sql语句与主语句: 对所有sql语句加前缀:exec sql sql语句的结束标志随主语言不同而不同。,嵌入sql语句根据其作用不同分: 可执行语句 数据定义 数据控制 数据操纵 说明性语句 sql的可执行语句可嵌入到高级语言可执行语句出现的地方 sql的说明性语句可嵌入到高级语言说明性语句出现的地方,3.7.2 嵌入式sql语句与主语言之间的通信,sql语句负责操纵数据库,是一种面向集合的语句 高级语言语句负责控制程序流程及对sql语句的执行结果做进一步加工处理,是一种过程性语句 数据库工作单元与源程序工作单元之间通讯: 1. 向主语言传递sql语句执行状态信息,使主语言能够据此控制程序流程。主要用sql通讯区实现。 2. 主语言向sql语句提供参数。主要用主变量实现 3. 将sql语句查询数据库的结果交主语言进行进一步处理。主要用主变量和游标实现。,1. sql通讯区(sqlca, sql communication area) sql语句执行后状态信息,被送到sql通讯区sqlca,应用程序从中取出这些状态信息,来决定程序走向。 在应用程序中定义sqlca用:exec sql include sqlca语句 在sqlca中有一个变量sqlcode:存放每次执行sql语句后返回代码。 应用程序每执行完一条sql 语句,测试sqlcode的值,如果值等于预定义的常量success,则表示sql语句成功,否则表示遇到例外情况或出错。,2. 主变量(host variable) 主变量:在sql语句中使用的主语言程序变量。 主变量分为 输入主变量。输入主变量由应用程序对其赋值,sql语句引用;利用输入主变量,可向数据库中插入的数据,修改数据,指定执行的操作,指定where子句或having子句中的条件。 输出主变量。输出主变量由sql语句对其赋值或设置状态信息,返回给应用程序。利用输出主变量,可以得到sql语句的结果数据和状态。 一个主变量可能既是输入主变量又是输出主变量,指示变量:是一个整型变量,用来“指示”所指主变量的值或条件。 一个主变量可以附带一个任选的指示变量 ,指示变量要紧跟在所指主变量之后。 输入主变量可以利用指示变量赋空值 输出主变量可以利用指示变量检测出是否空值,值是否被截断 所有主变量和指示变量必须在sql语句中说明后使用,使用时在其前面加冒号(:)作为标志,例 某个学生新选修了某门课程,将有关记录插入sc表 假设学生的学号已赋给主变量stdno,课程号已赋给主变量couno。 gradeid=-1; exec sql insert into sc(sno, cno, grade) values(:stdno, :couno, :gr:gradeid); 由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用指示变量指示相应的主变量为空值。,3. 游标(cursor) 游标是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果。 每个游标区都有一个名字。 用户可以用sql语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。 游标作用:协调sql语言的集合处理方式和主语言的单记录处理方式 游标是一个指针,是与某一查询结果相联系的符号名,3.7.3 不用游标的sql语句,不用游标的sql语句有: 1. 说明性语句 2. 数据定义语句 3. 数据控制语句 4. 查询结果为单记录的select语句 5. 非current形式的update语句 6. 非current形式的delete语句 7. insert语句,不用游标 不需返回结果数据 不用主变量,1. 说明性语句 主要有: exec sql include sqlca (定义sql通信区) exec sql begin declare section exec sql end declare section 后两条语句用来说明主变量,必须成对出现,两条语句中间是主变量。,2. 数据定义语句 例1 建立一个“学生”表student exec sql create table student (sno char(5) not null unique, sname char(20), ssex char(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论