关系数库据标准语言.ppt

上传人:小飞机 文档编号:5928540 上传时间:2023-09-05 格式:PPT 页数:72 大小:907.50KB
返回 下载 相关 举报
关系数库据标准语言.ppt_第1页
第1页 / 共72页
关系数库据标准语言.ppt_第2页
第2页 / 共72页
关系数库据标准语言.ppt_第3页
第3页 / 共72页
关系数库据标准语言.ppt_第4页
第4页 / 共72页
关系数库据标准语言.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《关系数库据标准语言.ppt》由会员分享,可在线阅读,更多相关《关系数库据标准语言.ppt(72页珍藏版)》请在三一办公上搜索。

1、数据库系统,西安电子科技大学,2,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图视图定义查询视图更新视图视图的作用3.6 数据控制3.7 嵌入式SQL,3,数据库系统的三级模式,模式(Schema,也称逻辑模式)数据库中全体数据的逻辑结构和特征(型)的描述,外模式(External Schema,也称子模式或用户模式)数据库用户使用的局部数据的逻辑结构和特征的描述,内模式(Internal Schema,也称存储模式)数据物理结构和存储方式的描述,4,数据库系统的三级模式,5,数据库系统的两级映象,模式内模式映象,外模式模式映象,6

2、,数据库系统的两级映象,三级模式是对数据的三个抽象级别二级映象在DBMS内部实现这三个抽象层次的联系和转换,7,数据的独立性(Data Independence),数据的逻辑独立性(Logical Data Independence)应用程序(外模式)与数据库的逻辑结构(模式)是相互独立的。即数据的逻辑结构发生改变,应用程序不用改变。外模式模式映象的用途保证数据的逻辑独立性外模式模式映象定义了外模式与模式之间的对应关系当模式改变时,数据库管理员只需修改有关的外模式模式映象,使外模式保持不变应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性

3、。,8,数据的独立性(Data Independence),数据的物理独立性(Physical Data Independence)应用程序(外模式)与存储在磁盘上的数据库(文件)中的存储结构(内模式)是相互独立的。即数据文件的组织方式改变不需要修改应用程序。模式内模式映象的用途保证数据的物理独立性模式内模式映象定义了数据全局逻辑结构与存储结构之间的对应关系当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式内模式映象,使模式保持不变应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的物理独立性,简称数据的物理独立性。,9,SQL与数据库模式,SQL

4、与三级模式体系结构,外模式,模式,内模式,10,3.5 视图,什么是视图(View)?视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。在数据字典中只存放视图的定义,不会出现数据冗余。基表中的数据发生变化,从视图中查询出的数据也随之改变。视图一经定义,就可以和基本表一样被查询和删除,并且可以在视图之上再定义新的视图。视图的更新(增加、删除、修改)操作会受到一定的限制。视图对应三级模式体系结构中的外模式。,11,一、视图定义,(1)建立视图语句格式:CREATE VIEW(,)AS WITH CHECK OPTION;注:CREATE VIEW 子句中的列名可以省略,但在下

5、列情况下明确指定视图的所有列名:(1)某个目标列是集函数或列表达式(2)多表连接时选出了几个同名列作为视图的字段(3)需要在视图中为某个列启用新的更合适的名字子查询中的属性列不允许定义别名,不允许含有ORDER BY子句和DISTINCT短语。WITH CHECK OPTION表示对视图进行更新操作的数据必须满足视图定义的谓词条件(子查询的条件表达式)。,12,一、视图定义,(1)建立视图,DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。例1 建立信息系学生的视图。CREATE VIEW I

6、S_Student AS SELECT Sno,Sname,SageFROM StudentWHERE Sdept=IS;若一个视图是从单个基本表导出的,并且只去掉了基本表的某些行和某些列,但保留了码,这类视图称为行列子集视图。上例所建立的视图即为行列子集视图。,13,一、视图定义,(1)建立视图,例2 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。CREATE VIEW IS_Student AS SELECT Sno,Sname,SageFROM StudentWHERE Sdept=ISWITH CHECK OPTION;针对此视图,当进行以下更新操作时,修改操作

7、:DBMS自动加上 Sdept=IS 的条件;删除操作:DBMS自动加上 Sdept=IS 的条件;插入操作:DBMS自动检查Sdept属性值是否为IS,(1)如果不是,则拒绝该插入操作(2)如果没有提供Sdept属性值,则自动定义Sdept为IS,14,一、视图定义,(1)建立视图,例5 定义一个反映学生出生年份的视图。CREATE VIEW BT_S(Sno,Sname,Sbirth)AS SELECT Sno,Sname,2000-Sage FROM Student;当子查询中有由表达式构成的派生属性列(也称为虚拟列)时,必须明确定义组成视图的各个属性列名。例6 将学生的学号及他的平均成

8、绩定义为一个视图。CREATE VIEW S_G(Sno,Gavg)AS SELECT Sno,AVG(Grade)FROM SC GROUP BY Sno;,15,一、视图定义,(1)建立视图,例7 将Student表中所有女生记录定义为一个视图。CREATE VIEW F_Student1(stdnum,name,sex,age,dept)AS SELECT*FROM Student WHERE Ssex=女;存在问题:修改基表Student的结构后(在非末尾增加一列),Student表与F_Student1视图的映象关系会被破坏,导致该视图不能正确工作。处理方法:在子查询的SELECT子

9、句中明确指出各属性列的名称,可以避免对基本表的属性列增加而破坏与视图间的映象关系,但不能解决修改列名的问题,因此上对基本表修改后采用重建视图的方法。,16,一、视图定义,(2)删除视图,语句格式:DROP VIEW;注:该语句从数据字典中删除指定的视图定义由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除删除基表时,由该基表导出的所有视图定义都必须显式删除 例8 删除视图IS_S1。DROP VIEW IS_S1;如果有在视图IS_S1之上建立的视图IS_S2,在IS_S1被删除后IS_S2已经无法使用,这时应该使用下列语句删除IS_S1:DROP VIEW IS_S2;,1

10、7,二、查询视图,从用户角度:查询视图与查询基本表相同DBMS实现视图查询的方法实体化视图(View Materialization)有效性检查:检查所查询的视图是否存在执行视图定义,将视图临时实体化,生成临时表查询视图转换为查询临时表查询完毕删除被实体化的视图(临时表)视图消解法(View Resolution)进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询执行修正后的查询,18,二、查询视图,例1 在信息系学生的视图中找出年龄小于20岁的学生。,信息系学生的视图定义(一节例1):CRE

11、ATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=IS;,查询语句:SELECT Sno,SageFROM IS_StudentWHERE Sage 20;视图实体化法:通过视图定义建立视图结构下的临时表并对临时表进行查询,在查询结束后删除临时表。视图消解法:根据视图定义将对视图的查询转换为对基本表的查询,转换后的查询语句如下:SELECT Sno,Sage FROM StudentWHERE Sdept=IS AND Sage 20;,19,二、查询视图,视图参与查询时和基本表完全一样例2 查询信息系选

12、修了c1课程的学生学号和姓名。SELECT Sno,SnameFROM IS_Student,SCWHERE IS_Student.Sno=SC.Sno AND SC.Cno=c1;注:此例的执行是将虚表和基本表联结来完成的。,20,二、查询视图,例3 在平均成绩视图S_G中查询平均成绩在90分以上的学生学号和平均成绩。,S_G视图定义:CREATE VIEW S_G(Sno,Gavg)AS SELECT Sno,AVG(Grade)FROM SC GROUP BY Sno;,对视图的查询语句:SELECT*FROM S_GWHERE Gavg=90;,使用视图消解转换的查询:SELECT S

13、no,AVG(Grade)FROM SCWHERE AVG(Grade)=90GROUP BY Sno;,正确的查询:SELECT Sno,AVG(Grade)FROM SCGROUP BY Sno HAVING AVG(Grade)=90;,注:由于对定义中含有集函数的视图不能完全正确地转换为对基本表的查询,这类查询应当直接对基本表进行。,21,三、更新视图,(1)用户角度:更新视图与更新基本表相同(2)DBMS实现视图更新的方法视图实体化法(View Materialization)视图消解法(View Resolution)(3)关于WITH CHECK OPTION指定WITH CHE

14、CK OPTION子句后,DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新。,22,三、更新视图,例1 将信息系学生视图IS_Student中学号95002的学生姓名改为“刘辰”。,信息系学生视图定义(一节例2):CREATE VIEW IS_StudentAS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=IS WITH CHECK OPTION;,对视图的更新语句:UPDATE IS_StudentSET Sname=刘辰WHERE Sno=95002;使用视图消解转换的更新:UPDATE Student

15、SET Sname=刘辰WHERE Sno=95002 AND Sdept=IS;,23,三、更新视图,例2 向信息系学生视图IS_Student中插入一个新的学生记录:(95029,赵新,20岁)。对视图的更新:INSERTINTO IS_StudentVALUES(95029,赵新,20);,使用视图消解转换的更新:INSERTINTO Student(Sno,Sname,Sage,Sdept)VALUES(95029,赵新,20,IS);,例3 删除视图IS_Student中学号为95029的记录。对视图的更新:DELETEFROM IS_StudentWHERE Sno=95029;,

16、使用视图消解转换的更新:DELETEFROM StudentWHERE Sno=95029 AND Sdept=IS;,24,三、更新视图,一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新(对两类方法均如此)。,例6 学号及平均成绩的视图定义:CREATE VIEW S_G(Sno,Gavg)AS SELECT Sno,AVG(Grade)FROM SC GROUP BY Sno;,对于如下更新语句:UPDATE S_GSET Gavg=90WHERE Sno=95001;注:无论实体化法还是消解法都无法将其转换成对基本表SC的更新。,25,三、更新视图,实

17、际系统对视图更新的限制可更新视图从理论上讲,对其更新能够唯一转换为对应基本表更新的视图是可更新的。允许更新的视图实际使用的RDBMS系统对允许更新的视图有不同的规定,使用中以参考手册为依据;对于行列子集视图,各RDBMS都允许更新。,26,四、视图的作用,(1)视图能够简化用户的操作当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作。如基于多张表连接形成的视图,基于复杂嵌套查询的视图和含导出属性的视图。(2)视图使用户能以多种角度看待同一数据不同的用户和应用程序会以不同的角度看待同一数据。如学生信息中的生源所在地,在招生管理中表达该学生是从哪个地方录取的,而在户籍管理中则表达该学生的

18、户口是从哪个地方迁入的。这两种应用所使用的是数据库中存储的同一数据。因此,视图可以避免数据存储的冗余性,适应数据库共享的需要。,27,四、视图的作用,(3)视图对重构数据库提供了一定程度的逻辑独立性例:运行中的学籍管理数据库,其学生关系如下:Student(Sno,Sname,Ssex,Sage,Sdept)因性能需要重构如下:SX(Sno,Sname,Sage)SY(Sno,Ssex,Sdept)这时原关系Student已经不存在,应用程序也就无法使用。解决方法:可以通过建立以下视图实现 CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)AS SEL

19、ECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;即修改外模式模式映象!,28,四、视图的作用,(4)视图能够对机密数据提供安全保护,建立面向不同用户的视图,并将对该视图的操作权限赋予不同的用户,则这些用户只能对视图所见的数据进行权限内的操作,而视图之外的数据对这些用户是不可见的,从而也就对视图之外的数据进行了保护。同样,针对不同的应用程序建立视图,使用该应用程序也只能操作视图内的数据,对视图外的数据也进行了保护。例如Student表涉及三个系的学生数据,可以在其上定义三个视图,每个视图只包含

20、一个系的学生数据,并只允许每个系的系主任查询自己系的学生视图。,29,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制数据控制概述授权收回权限3.7 嵌入式SQL,30,数据控制概述,数据控制是指DBMS用来保证数据库正确稳定运行所提供的对数据的管理机制。SQL中的数据控制包括事务管理和数据保护,即数据库的恢复、并发控制、数据库的安全性和完整性控制。数据库的完整性控制是通过数据库定义过程来指定,在数据更新过程中由系统来进行检查并予以保证;事务处理、数据库的恢复、并发控制会在以后的章节专门讲解;本节只讲述SQL中的安全性

21、控制。数据库的完整性是用来防止合法的用户对数据库的无意破坏,即防止允许更新的用户不小心对数据的错误更新而破坏数据库;数据库的安全性是用来防止非法用户有意窃取或恶意破坏数据库中的数据。数据库的安全性控制通过授权机制来实现,即通过赋予用户对数据库的使用权限来保证数据的安全。,31,授权,授权 将数据库中的某些对象的某些操作权限赋予某些用户授权使用GRANT语句:GRANT,.ON TO,.WITH GRANT OPTION;,DBA拥有数据库操作所有权限,他可以将权限赋予其他用户。建立数据库对象的用户称为该对象的属主(OWNER),他拥有该对象的所有操作权限。接受权限的用户可以是一个或多个具体用户

22、,也可以是全体用户(PUBLIC)。指定了WITH GRANT OPTION子句,获得某种权限的用户还可以把这种权限再授予别的用户;没有指定WITH GRANT OPTION子句,获得某种权限的用户只能使用该权限,不能传播该权限。,32,授权,权限一览表:,例1 把查询Student表权限授给用户U1。GRANT SELECT ON TABLE Student TO U1;,33,授权,例2 把对Student表和Course表的全部权限授予用户U2和U3。GRANT ALL PRIVILIGES ON TABLE Student,Course TO U2,U3;例3 把对表SC的查询权限授予

23、所有用户。GRANT SELECT ON TABLE SC TO PUBLIC;例4 把查询Student表和修改学生学号的权限授给用户U4。GRANT UPDATE(Sno),SELECT ON TABLE Student TO U4;,34,授权,例5 把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户。GRANT INSERT ON TABLE SC TO U5WITH GRANT OPTION;执行例5后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限:GRANT INSERT ON TABLE SC TO U6;WITH GRANT OPTION;同

24、样,U6还可以将此权限授予U7:GRANT INSERT ON TABLE SC TO U7;但U7不能再传播此权限。U5 U6 U7,35,授权,例6 DBA把在数据库S_C中建立表的权限授予用户U8。GRANT CREATETABON DATABASE S_C TO U8;,36,收回权限,收回权限 从指定用户那里收回对指定对象的指定权限。使用REVOKE语句:REVOKE,.ON FROM,.;例7 把用户U4修改学生学号的权限收回。REVOKE UPDATE(Sno)ON TABLE Student FROM U4;例8 收回所有用户对表SC的查询权限。REVOKE SELECT ON

25、 TABLE SC FROM PUBLIC;,37,收回权限,例9 把用户U5对SC表的INSERT权限收回。REVOKE INSERT ON TABLE SC FROM U5;系统将收回直接或间接从U5处获得的对SC表的INSERT权限:U5 U6 U7收回U5、U6、U7获得的对SC表的INSERT权限:U5 U6 U7若存在多重授与(从不同用户处得到相同权限),则仍具有该权限,即只收回自己所级联(间接)授与出的权限。,38,关于权限管理的说明,DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户。用户对自己建立的基本表和视图拥有全部的操作权限,并且可以用

26、GRANT语句把其中某些权限授予其他用户。被授权的用户如果有“继续授权”的许可,还可以把获得的权限再授予其他用户。所有授予出去的权力在必要时又都可以用REVOKE语句收回。,39,作业(10),P127题9 题11,数据库系统,41,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL嵌入式SQL概述不用游标的SQL语句使用游标的SQL语句,42,3.7 嵌入式SQL,应用程序访问数据库方法:,嵌入式SQL将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合用的SQL预编译程序将嵌入的SQL

27、语句转换为能被程序设计语言(如C语言)的编译器识别的函数调用专门的数据库应用系统开发平台如PowerBuilder,Delphi中可以直接使用嵌入式SQL应用程序接口(API)通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回查询结果不需要专用的预编译程序常用接口:ODBC,JDBC,ADO等API访问数据库将在下学期数据库编程讲中讲授,43,嵌入式SQL概述,什么是嵌入式SQL(Embedded SQL)?SQL语句嵌入到其他高级语言中,这时高级语言被称为(宿)主语言。为什么要引入嵌入式SQL?(1)SQL语言是非过程化语言(2)事务处理应用需要过程化语言这两种方式存在差别

28、,在程序设计的环境下,SQL语句要做某些必要的扩充。如何区分主语言与SQL语句?前缀:EXEC SQL结束标志:随主语言的不同而不同如:C语言中使用SQL:EXEC SQL;例:EXEC SQL DROP TABLE Student;,44,嵌入式SQL概述,如何实现SQL语句的执行?扩充主语言使之能处理SQL预编译,将SQL语句转为主语言可执行的目标代码预编译的过程:1.由DBMS的预处理程序对源程序进行扫描,识别出SQL语句;2.把它们转换成主语言调用语句,以使主语言编译程序能识别它;3.最后由主语言的编译程序将整个源程序编译成目标码。,45,嵌入式SQL概述,嵌入SQL语句的分类:,嵌入

29、SQL语句,声明语句,可执行语句,数据定义,数据操纵,数据控制,在高级语言中,允许出现声明语句的地方,都可以写声明性SQL语句;允许出现可执行的高级语言语句的地方,都可以写可执行SQL语句。将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句:SQL语句是非过程化的面向集合的语句,负责操纵数据库;高级语言语句是过程化的面向记录的语句,负责控制程序流程。,46,嵌入式SQL概述,SQL与主语言如何交互?1.主变量1)主语言向SQL语句提供参数2)将SQL语句查询数据库的结果交主语言进一步处理2.SQL通信区(SQLCA,SQL Communication Area)1)向主语言传

30、递SQL语句的执行状态信息2)主语言能够据此控制程序流程3.游标解决集合性操作语言与过程性操作语言的不匹配,47,嵌入式SQL概述,含嵌入式SQL的执行流程(不使用游标):,48,嵌入式SQL概述,含嵌入式SQL的执行流程(不使用游标):,主语言进行变量声明和界面处理,并读取用户数据;SQL语句用主变量从主语言中接收执行参数,操纵数据库;SQL语句的执行状态由DBMS送至SQLCA中;主语言程序从SQLCA中取出状态信息,据此决定下一步操作;如果SQL语句从数据库中成功地检索出数据,则通过主变量传给主语言做进一步处理,否则退出主程序;如果SQL语句返回的是结果集,则主语言通过游标逐一处理各记录

31、。,49,不用游标的SQL语句,一、声明性语句声明性语句是专为在嵌入式SQL中声明主变量、SQLCA等而设置的声明主变量1.EXEC SQL BEGIN DECLARE SECTION;2.EXEC SQL END DECLARE SECTION;这两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明。声明SQLCA 3.EXEC SQL INCLUDE SQLCA;,50,不用游标的SQL语句,二、数据定义语句例1 建立一个“学生”表Student。EXEC SQL CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHA

32、R(20),Ssex CHAR(1),Sage INT,Sdept CHAR(15);数据定义语句(DDL)中不允许使用主变量!例:错误语句 EXEC SQL DROP TABLE:table_name;三、数据控制语句例2 把查询Student表权限授给用户U1。EXEC SQL GRANT SELECT ON TABLE Student TO U1;,51,不用游标的SQL语句,四、查询结果为单记录的SELECT语句,语句格式:EXEC SQL SELECT ALL|DISTINCT,.INTO,.FROM,.WHERE GROUP BY HAVING ORDER BY ASC|DESC;

33、说明:把从数据库中找到的符合条件的记录,放到INTO子句指出的主变量中去。,52,不用游标的SQL语句,使用注意事项:1.主变量的使用范围INTO子句WHERE子句的条件表达式HAVING短语的条件表达式 2.使用指示变量指示变量只能用于INTO子句中当SELECT子句的目标列返回空值时,系统不会给对应的主变量赋值(仍保持执行SQL语句之前的值),而将其后的指示变量置为负值当发现指示变量值为负值时,不管主变量为何值,均应认为主变量值为NULL,四、查询结果为单记录的SELECT语句,53,不用游标的SQL语句,3.查询结果为空集如果数据库中没有满足条件的记录,即查询结果为空,则DBMS将SQL

34、CODE的值置为1004.查询结果为多条记录程序出错,DBMS会在SQLCA中返回错误信息,四、查询结果为单记录的SELECT语句使用注意事项:,54,不用游标的SQL语句,例3 根据学生号码查询学生信息。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno;主变量givensno需要在此前由宿主语言赋值,且在SQL声明段中已经声明;主变量Hsno,Hname,Hsex,Hage和Hdept也均已在前面的声明段中声明过了。此SQ

35、L语句执行后,INTO子句将查询的返回值赋给对就的五个主变量,可以由主语言进行过程化处理。解决了非过程化向过程化的转变。,四、查询结果为单记录的SELECT语句,55,不用游标的SQL语句,例4 查询某个学生选修某门课程的成绩。假设已将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。EXEC SQL SELECT Sno,Cno,Grade INTO:Hsno,:Hcno,:Hgrade:Gradeid FROM SC WHERE Sno=:givensno AND Cno=:givencno;当该学生成绩为空时,SQL语句执行后会给指示变量Gradeid

36、置为负值,而主变量Hgrade仍保持原来的值(不正确),这时主程序应根据指示变量的值判定主变量是否为有效值。在开发应用程序时应慎用此句:随着数据的变动或查询条件的不同,返回记录可能不止一条,造成应用程序出错。,四、查询结果为单记录的SELECT语句,56,不用游标的SQL语句,五、非CURRENT形式的UPDATE语句例6 修改某个学生c1号课程的成绩。假设该学生的学号已赋givensno,新成绩已赋给newgrade。EXEC SQL UPDATE SC SET Grade=:newgrade WHERE Cno=c1 AND Sno=:givensno;例7 将计算机系全体学生年龄置NUL

37、L值。Sageid=-1;EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=CS;将指示变量Sageid赋一个负值后,无论主变量Raise为何值,DBMS都会将CS系所有记录的年龄属性置空值。,57,不用游标的SQL语句,六、非CURRENT形式的DELETE语句例8 某个学生退学了,现要将有关他的所有选课记录删除掉。假设该学生的姓名已赋给主变量stdname EXEC SQL DELETE FROM SC WHERE Sno=(SELECT Sno FROM Student WHERE Sname=:stdname);,58

38、,不用游标的SQL语句,七、非CURRENT形式的INSERT语句例9 某个学生新选修了某门课程,将有关记录插入SC表 假设学生的学号已赋给主变量stdno,课程号已赋给主变量couno。gradeid=-1;EXEC SQL INSERT INTO SC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr:gradeid);由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用指示变量指示相应的主变量为空值。,59,嵌入式SQL概述,例:带有嵌入式SQL的一小段C程序:查询并打印学生成绩。./*C语言的头文件、变量声明等*/EXEC SQL INCLUDE S

39、QLCA;/*(1)定义SQL通信区*/EXEC SQL BEGIN DECLARE SECTION;/*(2)声明主变量*/CHAR Sno(5);CHAR Cno(3);INT grade,Gradeid;EXEC SQL END DECLARE SECTION;main()printf(“Input Sno and Cno:”);scanf(“%s%s”,/*打印结果*/*(6)释放连接*/,60,使用游标的SQL语句,什么是游标(Cursor)?游标是嵌入式SQL引入的机制游标是SQL查询语句向宿主语言提供查询结果集的一段公共缓冲区嵌入式SQL提供了逐条处理游标记录的功能,将当前记录各

40、字段值推入主变量,并移动游标指针游标解决了SQL语言只有记录处理能力的问题,将记录的各字段赋给主变量,交由宿主语言进行单值处理,61,嵌入式SQL概述,含嵌入式SQL的执行流程(使用游标):,62,使用游标的SQL语句,使用游标的步骤1.说明游标EXEC SQL DECLARE CURSOR FOR;2.打开游标EXEC SQL OPEN;3.移动游标指针,然后取当前记录EXEC SQL FETCH NEXT|PRIOR|FIRST|LAST FROM INTO,.;4.关闭游标EXEC SQL CLOSE;,63,使用游标的SQL语句,一、查询结果为多条记录的SELECT语句例1 查询某个系

41、全体学生的信息(学号、姓名、性别和年龄)。要查询的系名由用户在程序运行过程中指定,放在主变量deptname中.EXEC SQL INCLUDE SQLCA;/*包含SQL通信区*/EXEC SQL BEGIN DECLARE SECTION;./*说明主变量 deptname,HSno,HSname,HSsex,HSage等*/.EXEC SQL END DECLARE SECTION;.gets(deptname);/*为主变量deptname赋值*/.,64,使用游标的SQL语句,EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,S

42、age FROM Student WHERE SDept=:deptname;/*定义游标*/EXEC SQL OPEN SX/*打开游标*/WHILE(1)/*用循环结构逐条处理结果集中的记录*/EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:HSage;/*将游标指针向前推进一行,然后从 结果集中取当前行,送相应主变量*/if(sqlca.sqlcode SUCCESS)break;/*若所有查询结果已处理完或出现SQL语句错误,则退出循环*/./*由主语言语句进行进一步处理*/;EXEC SQL CLOSE SX;/*关闭游标*/.游标解决了单记录

43、SQL查询的局限性,提高了程序的健壮性。,65,使用游标的SQL语句,二、CURRENT形式的UPDATE语句和DELETE语句使用游标的步骤:(1)说明游标(2)打开游标,把所有满足查询条件的记录从指定表取至缓冲区(3)推进游标指针,并把当前记录从缓冲区中取出来送至主变量(4)检查该记录是否需要处理(修改或删除),是则处理之(5)重复第(3)和(4)步,用逐条取出结果集中的行进行判断和处理(6)关闭游标,释放结果集占用的缓冲区和其他资源,66,使用游标的SQL语句,例3 对某个系的学生信息,根据用户的要求修改其中某些人的年龄字段。.EXEC SQL INCLUDE SQLCA;EXEC SQ

44、L BEGIN DECLARE SECTION;./*说明主变量 deptname,HSno,HSname,HSsex,HSage,NEWAge等*/.EXEC SQL END DECLARE SECTION;.gets(deptname);/*为主变量deptname赋值*/.EXEC SQL DECLARE SX CURSOR FORSELECT Sno,Sname,Ssex,SageFROM StudentWHERE SDept=:deptnameFOR UPDATE OF Sage;/*说明游标*/,67,使用游标的SQL语句,EXEC SQL OPEN SX/*打开游标*/WHILE

45、(1)/*用循环结构逐条处理结果集中的记录*/EXEC SQL FETCH SX INTO:HSno,:Hsname,:HSsex,:HSage;/*将游标指针向前推进一行,然后从 结果集中取当前行,送相应主变量*/if(sqlca.sqlcode SUCCESS)break;/*若所有查询结果均已处理完或 出现SQL语句错误,则退出循环*/printf(%s,%s,%s,%d,HSno,HSname,HSsex,HSage);/*显示该记录*/printf(“UPDATE AGE?”);/*问用户是否要修改*/scanf(%c,68,使用游标的SQL语句,if(yn=y or yn=Y)/*

46、需要修改*/printf(INPUT NEW AGE:);scanf(%d,/*关闭游标*/.,69,使用游标的SQL语句,例4 对某个系的学生信息,根据用户的要求删除其中某些人的记录。.EXEC SQL INCLUDE SQLCA;EXEC SQL BEGIN DECLARE SECTION;./*说明主变量 deptname,HSno,HSname,HSsex,HSage等*/.EXEC SQL END DECLARE SECTION;.gets(deptname);/*为主变量deptname赋值*/.EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,S

47、name,Ssex,Sage FROM Student WHERE SDept=:deptname FOR UPDATE;/*无此句无法用current of*/,70,使用游标的SQL语句,EXEC SQL OPEN SX/*打开游标*/WHILE(1)/*用循环结构逐条处理结果集中的记录*/EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:HSage;/*将游标指针向前推进一行,然后从 结果集中取当前行,送相应主变量*/if(sqlca.sqlcode SUCCESS)break;/*若所有查询结果均已处理完或 出现SQL语句错误,则退出循环*/pri

48、ntf(%s,%s,%s,%d,HSno,HSname,HSsex,HSage);/*显示该记录*/printf(DELETE?);/*问用户是否要删除*/scanf(%c,71,使用游标的SQL语句,if(yn=y or yn=Y)/*需要删除*/EXEC SQL DELETE FROM Student WHERE CURRENT OF SX;/*删除当前记录*/.;EXEC SQL CLOSE SX;/*关闭游标*/.游标提供了逐条提取结果集中记录的功能,转为由高级语言处理。是否需要引入CURRENT形式的INSERT语句?为什么?,72,静态SQL与动态SQL,静态SQL嵌入的SQL语句中涉及的表名及属性名是确定的,即在编译时已确定,而可变的部分只是相应的取值(用主变量传递),称为静态SQL动态SQL嵌入的SQL语句中允许由主变量传递属性名、表名、数据对象名及其取值,以及完整的SQL语句,称为动态SQL有关动态SQL的内容将在下学期数据库编程中专门讲授,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号