欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    关系数据库语言.ppt

    • 资源ID:5928593       资源大小:225KB        全文页数:61页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    关系数据库语言.ppt

    1,第3章 关系数据库语言SQL,2,本章概述,SQL是关系数据库的标准语言,对关系模型的发展和商用DBMS的研制起着重要的作用。SQL语言是介乎于关系代数和元组演算之间的一种语言。本章详细介绍SQL的核心部分内容:数据定义、数据查询、数据更新。,3,关系数据库语言SQL,3.1 SQL的体系结构 3.2 SQL的数据定义 3.3 SQL的数据查询3.4 数据更新 3.5 视图的定义和对视图的操作,4,3.1 SQL的体系结构,3.1.1 SQL的产生与发展 3.1.2 SQL数据库的体系结构 3.1.3 SQL的组成,5,3.1.1 SQL的产生与发展,SQL是20世纪70年代在IBM公司的研究所开发的,其大部分标准首先在SYSTEM R中实现。现在简称为SQL(Structured Query Language),即“结构化查询语言”。SQL已经成为一个标准。SQL的标准化工作一直在进行。SQL86,SQL89,SQL92,SQL99。注意许多具体的DBMS实现的SQL与标准有一定区别。,6,3.1.2 SQL数据库的体系结构,用户1,用户2,用户3,用户4,视图1,视图2,基本表1,基本表2,基本表3,基本表4,存储文件1,存储文件2,存储文件3,存储文件4,图3.1 SQL数据库的体系结构,SQL用户,View,Base table,Stored file,7,3.1.3 SQL的组成,核心SQL主要有四个部分:(1)数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索引等结构。(2)数据操纵语言,即SQL DML。数据操纵分成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。(3)嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。(4)数据控制语言,即SQL DCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。,8,3.2 SQL的数据定义,3.2.1 SQL模式的创建和撤销 3.2.2 基本数据类型 3.2.3 基本表的创建、修改和撤销 3.2.4 索引的创建和撤销,9,3.2.1 SQL模式的创建和撤销,SQL模式的创建可用CREATE SCHEMA语句定义,其基本句法如下:CREATE SCHEMA模式名AUTHORIZATION用户名 SQL模式的撤消可用DROP SCHEMA语句定义,其基本句法如下:DROP SCHEMA模式名CASCADERESTRICT 其方式有两种:CASCADE(级联式)方式。RESTRICT(约束式)方式。,执行DROP语句时,把SQL模式及其下属的基本表、视图、索引等所有元素全部撤消。,执行DROP语句时,只有当SQL模式中没有任何下属元素时,才能撤消SQL模式,否则拒绝执行DROP语句。,SCHEMADATABASE,10,3.2.2 基本数据类型,SQL提供的主要数据类型(也称为“域类型”)有:(1)数值型 INTEGER(INT),SMALLINT,REAL,DOUBLE PRECISION,FLOAT(n),NUMBERIC(p,d)(2)字符串型 CHAR(n),VARCHAR(n)(3)位串型 BIT(n),BIT VARYING(n)(4)时间型 DATE,TIME自定义类型 CREATE DOMAIN PERSON_NAME CHAR(8);,11,3.2.3 基本表的创建、修改和撤销,基本表的创建 例3.1 基本表S,C,SC的创建。,CREATE TABLE S(S#CHAR(4)NOT NULL,SNAME CHAR(8)NOT NULL,AGESMALLINT,SEX CHAR(1),PRIMARY KEY(S#);,CREATE TABLE C(C#CHAR(4)NOT NULL,CNAME CHAR(10)NOT NULL,TEACHER CHAR(8),PRIMARY KEY(C#);,CREATE TABLE SC(S#CHAR(4),C#CHAR(4),GRADE SMALLINT,PRIMARY KEY(S#,C#),FOREIGN KEY(S#)REFERENCES S(S#),FOREIGN KEY(C#)REFERENCES C(C#),CHECK(GRADE BETWEEN 0 AND 100);,12,基本表的创建、修改和撤销(2),基本表结构的修改(1)增加新的列用“ALTER ADD”语句,其句法如下:ALTER TABLE ADD(2)删除原有的列用“ALTER DROP”语句,句法如下:ALTER TABLE DROP CASCADERESTRICT 此处CASCADE方式表示:在基本表中删除某列时,所有引用到该列的视图和约束也要一起自动地被删除。而RESTRICT方式表示在没有视图或约束引用该属性时,才能在基本表中删除该列,否则拒绝删除操作。(3)修改原有列的类型、宽度用“ALTER MODIFY”语句,句法如下:ALTER TABLE MODIFY,13,基本表的创建、修改和撤销(3),例3.2 在基本表S中增加一个地址(ADDRESS)列,可用下列语句:ALTER TABLE S ADD ADDRESS VARCHAR(30);应注意,新增加的列不能定义为“NOT NULL”。基本表在增加一 列后,原有元组在新增加的列上的值都被定义为空值(NULL)。例3.3 在基本表S中删除年龄(AGE)列,并且把引用该列的所有视图和约束也一起删除,可用下列语句:ALTER TABLE S DROP AGE CASCADE;例3.4 在基本表S中S#的长度修改为6,可用下列语句:ALTER TABLE S MODIFY S#CHAR(6);,14,基本表的创建、修改和撤销(4),基本表的撤销 撤销语句的句法如下:DROP TABLE CASCADERESTRICT 此处的CASCADE、RESTRICT的语义同前面句法中的语义一样。例3.5需要撤消基本表S。但只有在没有视图或约束引用基本表S中的列时才能撤消,否则拒绝撤消。DROP TABLE S RESTRICT;,15,3.2.4 索引的创建和撤销,索引的创建创建索引可用“CREATE INDEX”语句实现。句法如下:CREATE UNIQUE INDEX ON()例3.6(1)CREATE INDEX S#_INDEX ON S(S#);(2)CREATE UNIQUE INDEX SC_INDEX ON SC(S#ASC,C#DESC);索引的撤销当索引不需要时,可以用“DROP INDEX”语句撤销,其句法如下:DROP INDEX,16,3.3 SQL的数据查询,SELECT查询语句 SELECT语句完整的句法 SELECT语句中的限定 基本表的联接操作 SQL3中的递归查询,17,3.3.1 SELECT查询语句(1),SELECTFROMWHERE句型在关系代数中最常用的式子是下列表达式:A1,An(F(R1Rm)这里R1、Rm为关系,F是公式,A1、An为属性。针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:SELECT A1,AnFROM R1,RmWHERE F 这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。,F中使用的运算符1.算术比较运算符:,=,=,或!=2.逻辑运算符:AND,OR,NOT3.集合成员资格运算符:IN,NOT IN4.谓词:EXISTS(存在量词),ALL,SOME,UNIQUE5.聚合函数:AVG,MIN,MAX,SUM,COUNT6.嵌套:F(SELECT语句)SELECT查询结果运算符UNION(并)、INTERSECT(交)、EXCEPT(差),18,3.3.1 SELECT查询语句(2),SELECT句型使用实例例3.8 教学数据中有三个基本表(关系):S(S#,SNAME,AGE,SEX)SC(S#,C#,SCORE)C(C#,CNAME,T#)下面用SELECT查询语句表达每个查询。(1)检索学习课程号为C2的学生学号与成绩。(2)检索学习课程号为C2的学生学号与姓名。(3)检索选修课程名为MATHS的学生学号与姓名。(4)检索选修课程号为C2或C4的学生学号。(5)检索至少选修课程号为C2和C4的学生学号。(6)检索不学习C2课程的学生姓名与年龄。(7)检索学习全部课程的学生姓名。(8)检索所学课程包含学生S3所学课程的学生学号。,SELECT S#,GRADEFROM SCWHERE C#=C2;,(2)检索学习课程号为C2的学生学号与姓名。连接查询SELECT S.S#,SNAMEFROM S,SCWHERE C#=C2 AND S.S#=SC.S#;嵌套查询 相关子查询SELECT S#,SNAME SELECT S#,SNAMEFROM S FROM SWHERE S#IN(SELECT S#WHERE C2 IN(SELECT C#FROM SC FROM SC WHERE C#=C2);WHERE S.S#=SC.S#);存在量词的嵌套查询SELECT S#,SNAMEFROM SWHERE EXISTS(SELECT*FROM SC WHERE C#=C2 AND S.S#=SC.S#);,(3)检索选修课程名为MATHS的学生学号与姓名。连接查询SELECT S.S#,SNAMEFROM S,SC,CWHERE CNAME=MATHS AND S.S#=SC.S#AND SC.C#=C.C#;嵌套查询SELECT S#,SNAMEFROM SWHERE S#IN(SELECT S#FROM SC WHERE C#IN(SELECT C#FROM C WHERE CNAME=MATHS);,SELECT S#FROM SCWHERE C#=C2 OR C#=C4;,SELECT X.S#FROM SC AS X,SC AS YWHERE X.C#=C2 AND Y.C#=C4 AND X.S#=Y.S#;,SELECT SNAME,AGEFROM SWHERE S#NOT IN(SELECT S#FROM SC WHERE C#=C2);或者SELECT SNAME,AGEFROM SWHERE NOT EXISTS(SELECT*FROM SC WHERE C#=C2 AND S.S#=SC.S#);,语义:在表S中查找学生,要求这个学生选修了全部课程。换言之,在表S中找学生,在C中不存在一门课程,这个学生没有选修。SELECT SNAMEFROM SWHERE NOT EXISTS(SELECT*FROM C WHERE NOT EXISTS(SELECT*FROM SC WHERE S.S#=SC.S#AND C.C#=SC.C#);,语义:在表SC中找学生,不存在S3选修的一门课程,这个学生没有选修。SELECT DISTINCT S#FROM SC AS XWHERE NOT EXISTS(SELECT*FROM SC AS Y WHERE Y.S#=S3 AND NOT EXISTS(SELECT*FROM SC AS Z WHERE X.S#=Z.S#AND Y.C#=Z.C#);,19,3.3.1 SELECT查询语句(3),SELECT语句的图示形式 例3.9 对于例3.8中的第二个查询语句的图示形式如下所述。,20,3.3.1 SELECT查询语句(4),聚合函数 COUNT(*)计算元组的个数COUNT(列名)对一列中的值计算个数SUM(列名)求某一列值的总和(此列的值必须是数值型)AVG(列名)求某一列值的平均值(此列的值必须是数值型)MAX(列名)求某一列值的最大值MIN(列名)求某一列值的最小值例3.10 求男同学的总人数和平均年龄。统计选修了课程的学生人数。SELECT COUNT(*),AVG(AGE)SELECT COUNT(DISTINCT S#)FROM S FROM SC;WHERE SEX=M;,21,3.3.2 SELECT语句完整的句法(1),SELECT语句完整的句法如下:SELECT 目标表的列名或列表达式序列 FROM 基本表名和(或)视图序列 WHERE 行条件表达式 GROUP BY 列名序列 HAVING 组条件表达式 ORDER BY 列名ASC|DESC,,22,3.3.2 SELECT语句完整的句法(2),整个语句的执行过程如下:(1)读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。(2)选取满足WHERE子句中给出的条件表达式的元组。(3)按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。(4)按SELECT子句中给出的列名或列表达式求值输出。(5)ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。,23,3.3.2 SELECT语句完整的句法(3),例3.11 对教学数据库的基本表S、SC、C中数据进行查询和计算。统计每一年龄选修课程的学生人数 SELECT AGE,COUNT(DISTINCT S.S#)FROM S,SC WHERE S.S#=SC.S#GROUP BY AGE;由于要统计每一个年龄的学生人数,因此要把满足WHERE子句中条件的查询结果按年龄分组,在每一组中的学生年龄相同。此时的SELECT子句应对每一组分开进行操作,在每一组中,年龄只有一个值,统计的人数是这一组中的学生人数。,24,3.3.2 SELECT语句完整的句法(4),求基本表S中男同学的每一年龄组(超过50人)有多少人?要求查询结果按人数升序排列,人数相同按年龄降序排列。SELECT AGE,COUNT(S#)FROM SWHERE SEX=MGROUP BY AGE HAVING COUNT(*)50ORDER BY 2,AGE DESC;,25,3.3.3 SELECT语句中的限定(1),SELECT子句中的规定 SELECT子句描述查询输出的表格结构,即输出值的列名或表达式。其形式如下:SELECT ALL|DISTINCT|*条件表达式中的算术比较操作 条件表达式中可出现算术比较运算符(,!),也可以用“BETWEEN AND”比较运算符限定一个值的范围。列和基本表的改名操作,例3.12 在表SC中检索男同学选修的课程号。SELECT DISTINCT C#FROM S,SC WHERE S.S#=SC.S#AND SEX=M;检索每个学生的出生年份。SELECT S#,SNAME,2008-AGEFROM S;,例3.13检索1820岁的学生姓名。SELECT SNAMEFROM SWHERE AGE=18 AND AGE=20;或 SELECT SNAMEFROM SWHERE AGE BETWEEN 18 AND 20;,例3.14 在表S中检索每个学生的出生年份,输出的列名为STUDENT_NAME和BIRTH_YEAR。SELECT SNAME AS STUDENT_NAME,2008-AGE AS BIRTH_YEARFROM S;,26,3.3.3 SELECT语句中的限定(2),字符串的匹配操作条件表达式中字符串匹配操作符是“LIKE”。在表达式中可使用两个通配符:百分号(%):与零个或多个字符组成的字符串匹配。下划线(_):与单个字符匹配。集合的并、交、差操作 当两个子查询结果的结构完全一致时,可以让这两个子查询执行并、交、差操作。并、交、差的运算符为UNION、INTERSECT和EXCEPT。空值的比较操作SQL中允许列值为空,空值用保留字NULL表示。,例3.15 检索以字母D打头的学生姓名。SELECT SNAMEFROM SWHERE SNAME LIKE D%;检索以字母T打头,以M结束的三个字母组成的学生姓名。SELECT SNAMEFROM SWHERE SNAME LIKE T_M;,(SELECT 查询语句1)UNION ALL(SELECT 查询语句2)ALL未消除重复元组(SELECT 查询语句1)INTERSECT ALL(SELECT 查询语句2)(SELECT 查询语句1)EXCEPT ALL(SELECT 查询语句2),例3.16 检索年龄为空值的学生姓名。SELECT SNAMEFROM S WHERE AGE IS NULL;,27,3.3.3 SELECT语句中的限定(3),集合的比较操作SQL提供SELECT语句的嵌套子查询机制。子查询是嵌套在另一个查询中的SELECT语句。(1)集合成员资格的比较 元组 NOT IN(集合)(2)集合成员的算术比较 元组SOMEALL(集合)(3)空关系的测试 NOT EXISTS(集合)(4)重复元组的测试 NOT UNIQUE(集合)导出表的使用 SQL2允许在FROM子句中使用子查询。如果在FROM子句中使用了子查询,那么要给子查询的结果起个表名和相应的列名。,例3.17 检索至少不学C2和C4两门课程的学生学号。SELECT S#FROM SWHERE S#NOT IN(SELECT S#FROM SC WHERE C#IN(C2,C4);,(2)集合成员的算术比较 元组SOMEALL(集合)例3.18 检索学习C2课程的学号与姓名。SELECT S#,SNAMEFROM SWHERE S#=SOME(SELECT S#FROM SC WHERE C#=C2);检索至少有一门成绩超过学生S4一门成绩的学生学号。SELECT DISTINCT S#FROM SCWHERE GRADESOME(SELECT GRADE FROM SC WHERE S#=S4);检索不学C2课程的学生姓名和年龄。SELECT SNAME,AGEFROM S 注意:WHERE S#ALL(SELECT S#IN与“=SOME”等价 FROM SC NOT IN与“ALL”等价 WHERE C#=C2);检索平均成绩最高的学生学号。select max(avg(grade)SELECT S#from scFROM SC group by s#;此种写法错误,GROUP BY S#聚合函数不能进行复合运算。HAVING AVG(GRADE)=ALL(SELECT AVG(GRADE)FROM SC GROUP BY S#);,例3.8 检索学习课程号为C2的学生学号与姓名。SELECT S#,SNAMEFROM SWHERE EXISTS(SELECT*FROM SC WHERE C#=C2 AND S.S#=SC.S#);,例3.19 检索只开设了一门课程的教师姓名。SELECT TEACHERFROM C AS XWHERE UNIQUE(SELECT TEACHER FROM C AS Y WHERE X.TEACHER=Y.TEACHER);,例3.20 检索平均成绩超过80分的学生学号和平均成绩。SELECT S#,AVG(GRADE)FROM SC GROUP BY S#HAVING AVG(GRADE)80;导出表形式:SELECT S#,AVG_GRADEFROM(SELECT S#,AVG(GRADE)FROM SC GROUP BY S#)AS RESULT(S#,AVG_GRADE)WHERE AVG_GRADE80;,28,3.3.4 基本表的联接操作,3.10 连接类型和连接条件,29,3.3.4 基本表的联接操作(例),例3.21 设有关系R和S(图3.11的(a)和(b)。图3.11的(c),(d),(e)分别表示下面三个联接操作的结果:E1:R NATURAL LEFT OUTER JOIN SE2:R LEFT OUTER JOIN S ON R.B=S.B AND R.C=S.CE3:R LEFT OUTER JOIN S USING(B),(a)关系R,(b)关系S,(c)关系E1,(d)关系E2,(e)关系E3,图3.11 关系的联接操作,30,3.3.5 SQL3中的递归查询,例3.23,C1(BASIC),C3(COBOL),C2(FORTRAN),C5(C),C4(PASCAL),C9(PL/I),C8(VC+),C6(Ada),C7(C+),图3.13 课程之间的先修与后继的联系(箭尾指向的课程是箭头指向课程的直接先修课),31,3.4 数据更新,3.4.1 数据插入 3.4.2 数据删除 3.4.3 数据修改,32,3.4.1 数据插入,(1)单元组的插入 INSERT INTO 基本表名(列名表)VALUES(元组值)(2)多元组的插入 INSERT INTO 基本表名(列名表)VALUES(元组值),(元组值),(元组值)(3)查询结果的插入 INSERT INTO 基本表名(列名表)SELECT查询语句 这个语句可把一个SELECT语句的查询结果插到某个基本表中。(4)表的插入 INSERT INTO 基本表名1(列名表)TABLE 基本表名2 这个语句可把基本表2的值插入到基本表1中。,例3.24 往基本表SC中插入一个元组(S4,C6,90)。INSERT INTO SC(S#,C#,score)VALUES(S4,C6,90);,例3.24 往基本表SC中连续插入三个元组。INSERT INTO SC VALUES(S4,C4,85),(S3,C6,90),(S7,C2,70);,例3.24 在基本表SC中,把平均成绩大于80分的男同学的学号和平均成绩存入另一个已知的表S_GRADE(S#,AVG_GRADE)中。INSERT INTO S_GRADE(S#,AVG_GRADE)SELECT S#,AVG(GRADE)FROM SC WHERE S#IN(SELECT S#FROM S WHERE SEX=M)GROUP BY S#HAVING AVG(GRADE)80;,例3.24 某一个班级的选修课情况已在基本表SC4(S#,C#)中,把SC4的数据插入到表SC中。INSERT INTO SC(S#,C#)TABLE SC4;,33,3.4.2 数据删除,SQL的删除操作是指从基本表中删除元组,其句法如下:DELETE FROM 基本表名WHERE 条件表达式其语义是从基本表中删除满足条件表达式的元组。删除语句实际上是“SELECT*FROM 基本表名WHERE条件表达式”和DELETE操作的结合,每找到一个元组,就把它删去。应该注意,DELETE语句只能从一个基本表中删除元组。WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件。,例3.25 把课程名为MATHS 的成绩从基本表SC中删除。DELETE FROM SC WHERE C#IN(SELECT C#FROM C WHERE CNAME=MATHS);把C4课程中小于该课程平均成绩的成绩元组从基本表SC中删除。DELETE FROM SC WHERE C#=C4 AND SCORE(SELECT AVG(SCORE)FROM SC WHERE C#=C4);,34,3.4.3 数据修改,当需要修改基本表中元组的某些列值时,可以用UPDATE语句实现,其句法如下:UPDATE 基本表名SET 列名=值表达式,列名=值表达式ROW=(元组)WHERE 条件表达式 其语义是:修改基本表中满足条件表达式的那些元组中的列值,需修改的列值在SET子句中指出。,例3.26把C5课程的课程名改为DB。UPDATE C SET CNAME=DB WHERE C#=C5;把女同学的成绩提高10%。UPDATE SC SET SCORE=SCORE*1.1 WHERE S#IN(SELECT S#FROM S WHERE SEX=F);当C4课程的成绩低于该门课程平均成绩时,提高5%。UPDATE SC SET SCORE=SCORE*1.05 WHERE C#=C4 AND SCORE(SELECT AVG(SCORE)FROM SC WHERE C#=C4);在C中,把课程号为C5的元组修改为(C5,DB,LIU)。UPDATE C SET ROW=(C5,DB,LIU)WHERE C#=C5;,35,3.5 视图的定义和对视图的操作,3.5.1 视图的创建和撤销 3.5.2 对视图的更新操作 3.5.3 视图的优点,36,3.5.1 视图的创建和撤销(1),视图的定义在SQL中,外模式一级数据结构的基本单位是视图(view),视图是从若干基本表和其他视图采用SELECT语句构造出来的。在创建视图时,只是把其视图的定义存放在数据字典中,而不存储视图对应的数据。因此,称视图为虚表。,37,3.5.1 视图的创建和撤销(1),视图的创建 创建视图可用“CREATE VIEW”语句实现。其句法如下:CREATE VIEW()AS 例3.27 对于教学数据库中基本表S、SC、C,用户经常要用到S#、SNAME、CNAME和SCORE等列的数据,那么可用下列语句建立视图:CREATE VIEW STUDENT_SCORE(S#,SNAME,CNAME,SCORE)AS SELECT S.S#,SNAME,CNAME,SCORE FROM S,SC,C WHERE S.S#=SC.S#AND SC.C#=C.C#;,38,3.5.1 视图的创建和撤销(2),视图的撤销 在视图不需要时,可以用“DROP VIEW”语句把其从系统中撤销。其句法如下:DROP VIEW 视图名 例3.28 撤销STUDENT_SCORE视图,可用下列语句实现:DROP VIEW STUDENT_SCORE;,39,3.5.2 对视图的更新操作(1),定义3.1 如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。,40,3.5.2 对视图的更新操作(2),例3.29 下面讨论对视图更新的几个例子。设有一个视图定义CREATE VIEW SUDENT_SCORE AS SELECT S.S#,SNAME,CNAME,SCOREFROM S,SC,CWHERE S.S#=SC.S#AND SC.C#=C.C#;这个视图定义了学生选修的课程名和成绩,是由三个基本表联接而成的。如果用户要在视图中执行插入操作:INSERT INTO STUDENT_SCORE VALUES(S24,WANG,MATHS,80);若在基本表C中,课程名为MATHS的课程号有多个,则往基本表SC插入元组时,课程号C#就不定了。因此,对这个视图的更新是不允许的。,41,3.5.2 对视图的更新操作(3),设有一个视图定义,包含每个学生选修课程(成绩为非空)的门数和平均成绩:CREATE VIEW S_SCORE(S#,C_NUM,AVG_SCORE)AS SELECT S#,COUNT(C#),AVG(SCORE)FROM SC WHERE SCORE IS NOT NULL GROUP BY S#;视图S_SCORE虽然是从单个基本表导出,但导出时使用了分组和聚集操作,因此也是不能更新的。譬如,在未更改基本表SC中值时,要在视图S_SCORE中更改学生的平均成绩,显然是不切实际的。,42,3.5.2 对视图的更新操作(4),如果定义了一个有关男学生的视图:CREATE VIEW S_MALE AS SELECT S#,SNAME,AGEFROM SWHERE SEX=M;这个视图是从单个关系只使用选择和投影导出的,并且包含键S#,因此是可更新的。例如,执行插入操作:INSERT INTO S_MALE VALUES(S28,WU,18);系统自动会把它转变成下列语句:INSERT INTO SVALUES(S28,WU,18,M);,43,3.5.3 视图的优点,视图是用户一级的数据观点,由于有了视图,使数据库系统具有下列优点:(1)视图提供了逻辑数据独立性。(2)简化了用户观点。数据库的全部结构是复杂的,并有多种联系。(3)数据的安全保护功能。,44,3.6 嵌入式SQL,SQL语言有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL;另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、ADA、PASCAL、COBOL或PL/I等,称为宿主语言。3.6.1 SQL的实现方式 3.6.2 嵌入式SQL的使用规定 3.6.3 嵌入式SQL的使用技术 3.6.4 动态SQL语句,45,3.6.1 嵌入式SQL的实现方式,宿主语言十嵌入式SQL 宿主语言十函数调用 目标程序 图3.14 源程序处理过程,预处理程序,宿主语言编译程序,SQL函数定义库,46,3.6.2 嵌入式SQL的使用规定,在程序中要区分SQL语句与宿主语言语句允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定:(1)引用时,这些变量前必须加冒号“:”作为前缀标识,以示与数据库中变量有区别。(2)这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。SQL的集合处理方式与宿主语言单记录处理方式之间的协调。(1)游标定义语句(DECLARE)。(2)游标打开语句(OPEN)。(3)游标推进语句(FETCH)。(4)游标关闭语句(CLOSE)。,EXEC SQL END_EXEC,EXE SQL BEGIN DECLARE SECTIONchar sno5,name9;char SQL_STATE6;EXE SQL END DECLARE SECTION,EXEC SQL DECLARE CURSOR FOREND_EXEC,EXEC SQL OPEN END_EXEC,EXEC SQL FETCH FROM INTO END_EXEC,EXEC SQL CLOSE END_EXEC,47,3.6.3 嵌入式SQL的使用技术,不涉及游标的SQL DML语句涉及游标的SQL DML语句卷游标的定义和推进,例3.30(1)在基本表S中,根据共享变量givensno的值检索学生的姓名、年龄和性别。EXEC SQL SELECT sname,age,sexINTO:sn,:sa,:ssFROM sWHERE s#=:givensno;,48,涉及游标的SQL DML语句,(1)SELECT语句的使用方式当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用,一定要用游标机制把多个元组一次一个地传送给宿主语言程序处理。(2)对游标指向元组的修改或删除操作在游标处于活动状况时,可以修改或删除游标指向的元组。,49,例3.31,在基本表SC中检索某学生的学习成绩信息:define NO_MORE_TUPLES!(strcmp(SQLSTATE,“02000”)Void sel()EXEC SQL BEGIN DECLARE SECTION;char sno5,cno5,givensno5;int g;char SQLSTATE6;EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE scx CURSOR FORSELECT s#,c#,grade FROM sc WHERE s#=:givensno;EXEC SQL OPEN scx;while(1)EXEC SQL FETCH FROM scx INTO:sno,:cno,:g;if(NO_MORE_TUPLES)break;printf(“%s,%s,%d”,sno,cno,g);EXEC SQL CLOSE scx;,50,3.6.4 动态SQL语句(1),动态SQL预备语句 EXEC SQL PREPARE动态SQL语句名FROM共享变量或字符串 这里共享变量或字符串的值应是一个完整的SQL语句。这个语句可以在程序运行时由用户输入才组合起来。此时,这个语句并不执行。,51,3.6.4 动态SQL语句(2),动态SQL执行语句 EXEC SQL EXECUTE动态SQL语句名动态SQL语句使用时,还可以有两点改进:(1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可合并成一个语句:EXEC SQL EXECUTE IMMEDIATE共享变量或字符串(2)当预备语句中组合而成的SQL语句的条件值尚缺时,可以在执行语句中用USING短语补上:EXEC SQL EXECUTE USING,52,3.6.4 动态SQL语句(3),例3.33 下面两个C语言的程序段说明了动态SQL语句的使用技术。EXEC SQL BEGIN DECLARE SECTION;char*query;EXEC SQL END DECLARE SECTION;scanf(%s,query);/*从键盘输入一个SQL语句*/EXEC SQL PREPARE que FROM:query;EXEC SQL EXECUTE que;这个程序段表示从键盘输入一个SQL语句到字符数组中;字符指针 query指向字符串的第1个字符。如果执行语句只做一次,那么程序段最后两个语句可合并成一个语句:EXEC SQL EXECUTE IMMEDIATE:query;,53,3.6.4 动态SQL语句(4),char*query=UPDATE scSET grade=grade*1.1WHERE c#=?;EXEC SQL PREPARE dynprog FROM:query;char cno5=C4;EXEC SQL EXECUTE dynprog USING:cno;这里第一个char语句表示用户组合成一个SQL语句,但有一个值(课程号)还不能确定,因此用“?”表示。第二个语句是动态SQL预备语句。第三个语句(char语句)表示取到了课程号值。第四个语句是动态SQL执行语句,“?”值到共享变量cno中取。,54,小 结,SQL是关系数据库的标准语言,已广泛应用在商用系统中。SQL的数据定义部分包括对SQL模式、基本表、视图、索引的创建和撤销。SQL的数据操纵分成数据查询和数据更新两部分。SQL的数据查询是用SELECT语句实现,兼有关系代数和元组演算的特点。SQL的数据更新包括插入、删除和修改等三种操作,在视图中只有行列子集视图是可以更新的。,55,本章的重点篇幅,教材中P97的例3.8(SELECT语句)。,56,重要内容分析(一),SELECT语句是SQL的核心内容,对于该语句考生应掌握下列内容。1SELECT语句的来历 在关系代数中最常用的式子是下列表达式:A1,An(F(R1Rm)这里R1、Rm为关系,F是公式,A1、An为属性。针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:,57,重要内容分析(二),SELECT A1,AnFROM R1,RmWHERE F 这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。2SELECT语句中出现的基本表名,应理解为基本表中的元组变量,而列名应理解为元组分量。,58,重要内容分析(三),3SELECT语句的语义有三种情况,下面以学生表S(S#,SNAME,AGE,SEX)为例说明。第一种情况:SELECT语句中未使用分组子句,也未使用聚合操作,那么SELECT子句的语义是对查询的结果执行投影操作。例如:SELECT S#,SNAME FROM S WHERE SEX=M;,59,重要内容分析(四),第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。例如:SELECT COUNT(*),AVG(AGE)FROM S WHERE SEX=M;该语句是求男同学的人数和平均年龄。,60,重要内容分析(五),第三种情况:SEL

    注意事项

    本文(关系数据库语言.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开