




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章关系数据库语言SQL,2,本章概述,SQL是关系数据库的标准语言,对关系模型的发展和商用DBMS的研制起着重要的作用。SQL语言是介乎于关系代数和元组演算之间的一种语言。本章详细介绍SQL的核心部分内容:数据定义、数据查询、数据更新。,3,关系数据库语言SQL,3.1SQL的体系结构3.2SQL的数据定义3.3SQL的数据查询3.4数据更新3.5视图的定义和对视图的操作,4,3.1SQL的体系结构,3.1.1SQL的产生与发展3.1.2SQL数据库的体系结构3.1.3SQL的组成,5,3.1.1SQL的产生与发展,SQL是20世纪70年代在IBM公司的研究所开发的,其大部分标准首先在SYSTEMR中实现。现在简称为SQL(StructuredQueryLanguage),即“结构化查询语言”。SQL已经成为一个标准。SQL的标准化工作一直在进行。SQL86,SQL89,SQL92,SQL99。注意许多具体的DBMS实现的SQL与标准有一定区别。,6,3.1.2SQL数据库的体系结构,用户1,用户2,用户3,用户4,视图1,视图2,基本表1,基本表2,基本表3,基本表4,存储文件1,存储文件2,存储文件3,存储文件4,图3.1SQL数据库的体系结构,SQL用户,View,Basetable,Storedfile,7,3.1.3SQL的组成,核心SQL主要有四个部分:(1)数据定义语言,即SQLDDL,用于定义SQL模式、基本表、视图、索引等结构。(2)数据操纵语言,即SQLDML。数据操纵分成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。(3)嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。(4)数据控制语言,即SQLDCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。,8,3.2SQL的数据定义,3.2.1SQL模式的创建和撤销3.2.2基本数据类型3.2.3基本表的创建、修改和撤销3.2.4索引的创建和撤销,9,3.2.1SQL模式的创建和撤销,SQL模式的创建可用CREATESCHEMA语句定义,其基本句法如下:CREATESCHEMA模式名AUTHORIZATION用户名SQL模式的撤消可用DROPSCHEMA语句定义,其基本句法如下:DROPSCHEMA模式名CASCADERESTRICT其方式有两种:CASCADE(级联式)方式。RESTRICT(约束式)方式。,执行DROP语句时,把SQL模式及其下属的基本表、视图、索引等所有元素全部撤消。,执行DROP语句时,只有当SQL模式中没有任何下属元素时,才能撤消SQL模式,否则拒绝执行DROP语句。,SCHEMADATABASE,10,3.2.2基本数据类型,SQL提供的主要数据类型(也称为“域类型”)有:(1)数值型INTEGER(INT),SMALLINT,REAL,DOUBLEPRECISION,FLOAT(n),NUMBERIC(p,d)(2)字符串型CHAR(n),VARCHAR(n)(3)位串型BIT(n),BITVARYING(n)(4)时间型DATE,TIME自定义类型CREATEDOMAINPERSON_NAMECHAR(8);,11,3.2.3基本表的创建、修改和撤销,基本表的创建例3.1基本表S,C,SC的创建。,CREATETABLES(S#CHAR(4)NOTNULL,SNAMECHAR(8)NOTNULL,AGESMALLINT,SEXCHAR(1),PRIMARYKEY(S#);,CREATETABLEC(C#CHAR(4)NOTNULL,CNAMECHAR(10)NOTNULL,TEACHERCHAR(8),PRIMARYKEY(C#);,CREATETABLESC(S#CHAR(4),C#CHAR(4),GRADESMALLINT,PRIMARYKEY(S#,C#),FOREIGNKEY(S#)REFERENCESS(S#),FOREIGNKEY(C#)REFERENCESC(C#),CHECK(GRADEBETWEEN0AND100);,12,基本表的创建、修改和撤销(2),基本表结构的修改(1)增加新的列用“ALTERADD”语句,其句法如下:ALTERTABLEADD(2)删除原有的列用“ALTERDROP”语句,句法如下:ALTERTABLEDROPCASCADERESTRICT此处CASCADE方式表示:在基本表中删除某列时,所有引用到该列的视图和约束也要一起自动地被删除。而RESTRICT方式表示在没有视图或约束引用该属性时,才能在基本表中删除该列,否则拒绝删除操作。(3)修改原有列的类型、宽度用“ALTERMODIFY”语句,句法如下:ALTERTABLEMODIFY,13,基本表的创建、修改和撤销(3),例3.2在基本表S中增加一个地址(ADDRESS)列,可用下列语句:ALTERTABLESADDADDRESSVARCHAR(30);应注意,新增加的列不能定义为“NOTNULL”。基本表在增加一列后,原有元组在新增加的列上的值都被定义为空值(NULL)。例3.3在基本表S中删除年龄(AGE)列,并且把引用该列的所有视图和约束也一起删除,可用下列语句:ALTERTABLESDROPAGECASCADE;例3.4在基本表S中S#的长度修改为6,可用下列语句:ALTERTABLESMODIFYS#CHAR(6);,14,基本表的创建、修改和撤销(4),基本表的撤销撤销语句的句法如下:DROPTABLECASCADERESTRICT此处的CASCADE、RESTRICT的语义同前面句法中的语义一样。例3.5需要撤消基本表S。但只有在没有视图或约束引用基本表S中的列时才能撤消,否则拒绝撤消。DROPTABLESRESTRICT;,15,3.2.4索引的创建和撤销,索引的创建创建索引可用“CREATEINDEX”语句实现。句法如下:CREATEUNIQUEINDEXON()例3.6(1)CREATEINDEXS#_INDEXONS(S#);(2)CREATEUNIQUEINDEXSC_INDEXONSC(S#ASC,C#DESC);索引的撤销当索引不需要时,可以用“DROPINDEX”语句撤销,其句法如下:DROPINDEX,16,3.3SQL的数据查询,3.3.1SELECT查询语句3.3.2SELECT语句完整的句法3.3.3SELECT语句中的限定3.3.4基本表的联接操作3.3.5SQL3中的递归查询,17,3.3.1SELECT查询语句(1),SELECTFROMWHERE句型在关系代数中最常用的式子是下列表达式:A1,An(F(R1Rm)这里R1、Rm为关系,F是公式,A1、An为属性。针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:SELECTA1,AnFROMR1,RmWHEREF这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。,F中使用的运算符1.算术比较运算符:,=,=,或!=2.逻辑运算符:AND,OR,NOT3.集合成员资格运算符:IN,NOTIN4.谓词:EXISTS(存在量词),ALL,SOME,UNIQUE5.聚合函数:AVG,MIN,MAX,SUM,COUNT6.嵌套:F(SELECT语句)SELECT查询结果运算符UNION(并)、INTERSECT(交)、EXCEPT(差),18,3.3.1SELECT查询语句(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所学课程的学生学号。,SELECTS#,GRADEFROMSCWHEREC#=C2;,(2)检索学习课程号为C2的学生学号与姓名。连接查询SELECTS.S#,SNAMEFROMS,SCWHEREC#=C2ANDS.S#=SC.S#;嵌套查询相关子查询SELECTS#,SNAMESELECTS#,SNAMEFROMSFROMSWHERES#IN(SELECTS#WHEREC2IN(SELECTC#FROMSCFROMSCWHEREC#=C2);WHERES.S#=SC.S#);存在量词的嵌套查询SELECTS#,SNAMEFROMSWHEREEXISTS(SELECT*FROMSCWHEREC#=C2ANDS.S#=SC.S#);,(3)检索选修课程名为MATHS的学生学号与姓名。连接查询SELECTS.S#,SNAMEFROMS,SC,CWHERECNAME=MATHSANDS.S#=SC.S#ANDSC.C#=C.C#;嵌套查询SELECTS#,SNAMEFROMSWHERES#IN(SELECTS#FROMSCWHEREC#IN(SELECTC#FROMCWHERECNAME=MATHS);,SELECTS#FROMSCWHEREC#=C2ORC#=C4;,SELECTX.S#FROMSCASX,SCASYWHEREX.C#=C2ANDY.C#=C4ANDX.S#=Y.S#;,SELECTSNAME,AGEFROMSWHERES#NOTIN(SELECTS#FROMSCWHEREC#=C2);或者SELECTSNAME,AGEFROMSWHERENOTEXISTS(SELECT*FROMSCWHEREC#=C2ANDS.S#=SC.S#);,语义:在表S中查找学生,要求这个学生选修了全部课程。换言之,在表S中找学生,在C中不存在一门课程,这个学生没有选修。SELECTSNAMEFROMSWHERENOTEXISTS(SELECT*FROMCWHERENOTEXISTS(SELECT*FROMSCWHERES.S#=SC.S#ANDC.C#=SC.C#);,语义:在表SC中找学生,不存在S3选修的一门课程,这个学生没有选修。SELECTDISTINCTS#FROMSCASXWHERENOTEXISTS(SELECT*FROMSCASYWHEREY.S#=S3ANDNOTEXISTS(SELECT*FROMSCASZWHEREX.S#=Z.S#ANDY.C#=Z.C#);,19,3.3.1SELECT查询语句(3),SELECT语句的图示形式例3.9对于例3.8中的第二个查询语句的图示形式如下所述。,20,3.3.1SELECT查询语句(4),聚合函数COUNT(*)计算元组的个数COUNT(列名)对一列中的值计算个数SUM(列名)求某一列值的总和(此列的值必须是数值型)AVG(列名)求某一列值的平均值(此列的值必须是数值型)MAX(列名)求某一列值的最大值MIN(列名)求某一列值的最小值例3.10求男同学的总人数和平均年龄。统计选修了课程的学生人数。SELECTCOUNT(*),AVG(AGE)SELECTCOUNT(DISTINCTS#)FROMSFROMSC;WHERESEX=M;,21,3.3.2SELECT语句完整的句法(1),SELECT语句完整的句法如下:SELECT目标表的列名或列表达式序列FROM基本表名和(或)视图序列WHERE行条件表达式GROUPBY列名序列HAVING组条件表达式ORDERBY列名ASC|DESC,,22,3.3.2SELECT语句完整的句法(2),整个语句的执行过程如下:(1)读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。(2)选取满足WHERE子句中给出的条件表达式的元组。(3)按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。(4)按SELECT子句中给出的列名或列表达式求值输出。(5)ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。,23,3.3.2SELECT语句完整的句法(3),例3.11对教学数据库的基本表S、SC、C中数据进行查询和计算。统计每一年龄选修课程的学生人数SELECTAGE,COUNT(DISTINCTS.S#)FROMS,SCWHERES.S#=SC.S#GROUPBYAGE;由于要统计每一个年龄的学生人数,因此要把满足WHERE子句中条件的查询结果按年龄分组,在每一组中的学生年龄相同。此时的SELECT子句应对每一组分开进行操作,在每一组中,年龄只有一个值,统计的人数是这一组中的学生人数。,24,3.3.2SELECT语句完整的句法(4),求基本表S中男同学的每一年龄组(超过50人)有多少人?要求查询结果按人数升序排列,人数相同按年龄降序排列。SELECTAGE,COUNT(S#)FROMSWHERESEX=MGROUPBYAGEHAVINGCOUNT(*)50ORDERBY2,AGEDESC;,25,3.3.3SELECT语句中的限定(1),SELECT子句中的规定SELECT子句描述查询输出的表格结构,即输出值的列名或表达式。其形式如下:SELECTALL|DISTINCT|*条件表达式中的算术比较操作条件表达式中可出现算术比较运算符(,!),也可以用“BETWEENAND”比较运算符限定一个值的范围。列和基本表的改名操作,例3.12在表SC中检索男同学选修的课程号。SELECTDISTINCTC#FROMS,SCWHERES.S#=SC.S#ANDSEX=M;检索每个学生的出生年份。SELECTS#,SNAME,2008-AGEFROMS;,例3.13检索1820岁的学生姓名。SELECTSNAMEFROMSWHEREAGE=18ANDAGESOME(SELECTGRADEFROMSCWHERES#=S4);检索不学C2课程的学生姓名和年龄。SELECTSNAME,AGEFROMS注意:WHERES#ALL(SELECTS#IN与“=SOME”等价FROMSCNOTIN与“ALL”等价WHEREC#=C2);检索平均成绩最高的学生学号。selectmax(avg(grade)SELECTS#fromscFROMSCgroupbys#;此种写法错误,GROUPBYS#聚合函数不能进行复合运算。HAVINGAVG(GRADE)=ALL(SELECTAVG(GRADE)FROMSCGROUPBYS#);,例3.8检索学习课程号为C2的学生学号与姓名。SELECTS#,SNAMEFROMSWHEREEXISTS(SELECT*FROMSCWHEREC#=C2ANDS.S#=SC.S#);,例3.19检索只开设了一门课程的教师姓名。SELECTTEACHERFROMCASXWHEREUNIQUE(SELECTTEACHERFROMCASYWHEREX.TEACHER=Y.TEACHER);,例3.20检索平均成绩超过80分的学生学号和平均成绩。SELECTS#,AVG(GRADE)FROMSCGROUPBYS#HAVINGAVG(GRADE)80;导出表形式:SELECTS#,AVG_GRADEFROM(SELECTS#,AVG(GRADE)FROMSCGROUPBYS#)ASRESULT(S#,AVG_GRADE)WHEREAVG_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:RNATURALLEFTOUTERJOINSE2:RLEFTOUTERJOINSONR.B=S.BANDR.C=S.CE3:RLEFTOUTERJOINSUSING(B),(a)关系R,(b)关系S,(c)关系E1,(d)关系E2,(e)关系E3,图3.11关系的联接操作,30,3.3.5SQL3中的递归查询,例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)单元组的插入INSERTINTO基本表名(列名表)VALUES(元组值)(2)多元组的插入INSERTINTO基本表名(列名表)VALUES(元组值),(元组值),(元组值)(3)查询结果的插入INSERTINTO基本表名(列名表)SELECT查询语句这个语句可把一个SELECT语句的查询结果插到某个基本表中。(4)表的插入INSERTINTO基本表名1(列名表)TABLE基本表名2这个语句可把基本表2的值插入到基本表1中。,例3.24往基本表SC中插入一个元组(S4,C6,90)。INSERTINTOSC(S#,C#,score)VALUES(S4,C6,90);,例3.24往基本表SC中连续插入三个元组。INSERTINTOSCVALUES(S4,C4,85),(S3,C6,90),(S7,C2,70);,例3.24在基本表SC中,把平均成绩大于80分的男同学的学号和平均成绩存入另一个已知的表S_GRADE(S#,AVG_GRADE)中。INSERTINTOS_GRADE(S#,AVG_GRADE)SELECTS#,AVG(GRADE)FROMSCWHERES#IN(SELECTS#FROMSWHERESEX=M)GROUPBYS#HAVINGAVG(GRADE)80;,例3.24某一个班级的选修课情况已在基本表SC4(S#,C#)中,把SC4的数据插入到表SC中。INSERTINTOSC(S#,C#)TABLESC4;,33,3.4.2数据删除,SQL的删除操作是指从基本表中删除元组,其句法如下:DELETEFROM基本表名WHERE条件表达式其语义是从基本表中删除满足条件表达式的元组。删除语句实际上是“SELECT*FROM基本表名WHERE条件表达式”和DELETE操作的结合,每找到一个元组,就把它删去。应该注意,DELETE语句只能从一个基本表中删除元组。WHERE子句中条件可以嵌套,也可以是来自几个基本表的复合条件。,例3.25把课程名为MATHS的成绩从基本表SC中删除。DELETEFROMSCWHEREC#IN(SELECTC#FROMCWHERECNAME=MATHS);把C4课程中小于该课程平均成绩的成绩元组从基本表SC中删除。DELETEFROMSCWHEREC#=C4ANDSCORE(SELECTAVG(SCORE)FROMSCWHEREC#=C4);,34,3.4.3数据修改,当需要修改基本表中元组的某些列值时,可以用UPDATE语句实现,其句法如下:UPDATE基本表名SET列名=值表达式,列名=值表达式ROW=(元组)WHERE条件表达式其语义是:修改基本表中满足条件表达式的那些元组中的列值,需修改的列值在SET子句中指出。,例3.26把C5课程的课程名改为DB。UPDATECSETCNAME=DBWHEREC#=C5;把女同学的成绩提高10%。UPDATESCSETSCORE=SCORE*1.1WHERES#IN(SELECTS#FROMSWHERESEX=F);当C4课程的成绩低于该门课程平均成绩时,提高5%。UPDATESCSETSCORE=SCORE*1.05WHEREC#=C4ANDSCORE(SELECTAVG(SCORE)FROMSCWHEREC#=C4);在C中,把课程号为C5的元组修改为(C5,DB,LIU)。UPDATECSETROW=(C5,DB,LIU)WHEREC#=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),视图的创建创建视图可用“CREATEVIEW”语句实现。其句法如下:CREATEVIEW()AS例3.27对于教学数据库中基本表S、SC、C,用户经常要用到S#、SNAME、CNAME和SCORE等列的数据,那么可用下列语句建立视图:CREATEVIEWSTUDENT_SCORE(S#,SNAME,CNAME,SCORE)ASSELECTS.S#,SNAME,CNAME,SCOREFROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#;,38,3.5.1视图的创建和撤销(2),视图的撤销在视图不需要时,可以用“DROPVIEW”语句把其从系统中撤销。其句法如下:DROPVIEW视图名例3.28撤销STUDENT_SCORE视图,可用下列语句实现:DROPVIEWSTUDENT_SCORE;,39,3.5.2对视图的更新操作(1),定义3.1如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。,40,3.5.2对视图的更新操作(2),例3.29下面讨论对视图更新的几个例子。设有一个视图定义CREATEVIEWSUDENT_SCOREASSELECTS.S#,SNAME,CNAME,SCOREFROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#;这个视图定义了学生选修的课程名和成绩,是由三个基本表联接而成的。如果用户要在视图中执行插入操作:INSERTINTOSTUDENT_SCOREVALUES(S24,WANG,MATHS,80);若在基本表C中,课程名为MATHS的课程号有多个,则往基本表SC插入元组时,课程号C#就不定了。因此,对这个视图的更新是不允许的。,41,3.5.2对视图的更新操作(3),设有一个视图定义,包含每个学生选修课程(成绩为非空)的门数和平均成绩:CREATEVIEWS_SCORE(S#,C_NUM,AVG_SCORE)ASSELECTS#,COUNT(C#),AVG(SCORE)FROMSCWHERESCOREISNOTNULLGROUPBYS#;视图S_SCORE虽然是从单个基本表导出,但导出时使用了分组和聚集操作,因此也是不能更新的。譬如,在未更改基本表SC中值时,要在视图S_SCORE中更改学生的平均成绩,显然是不切实际的。,42,3.5.2对视图的更新操作(4),如果定义了一个有关男学生的视图:CREATEVIEWS_MALEASSELECTS#,SNAME,AGEFROMSWHERESEX=M;这个视图是从单个关系只使用选择和投影导出的,并且包含键S#,因此是可更新的。例如,执行插入操作:INSERTINTOS_MALEVALUES(S28,WU,18);系统自动会把它转变成下列语句:INSERTINTOSVALUES(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.1SQL的实现方式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)。,EXECSQLEND_EXEC,EXESQLBEGINDECLARESECTIONcharsno5,name9;charSQL_STATE6;EXESQLENDDECLARESECTION,EXECSQLDECLARECURSORFOREND_EXEC,EXECSQLOPENEND_EXEC,EXECSQLFETCHFROMINTOEND_EXEC,EXECSQLCLOSEEND_EXEC,47,3.6.3嵌入式SQL的使用技术,不涉及游标的SQLDML语句涉及游标的SQLDML语句卷游标的定义和推进,例3.30(1)在基本表S中,根据共享变量givensno的值检索学生的姓名、年龄和性别。EXECSQLSELECTsname,age,sexINTO:sn,:sa,:ssFROMsWHEREs#=:givensno;,48,涉及游标的SQLDML语句,(1)SELECT语句的使用方式当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用,一定要用游标机制把多个元组一次一个地传送给宿主语言程序处理。(2)对游标指向元组的修改或删除操作在游标处于活动状况时,可以修改或删除游标指向的元组。,49,例3.31,在基本表SC中检索某学生的学习成绩信息:defineNO_MORE_TUPLES!(strcmp(SQLSTATE,“02000”)Voidsel()EXECSQLBEGINDECLARESECTION;charsno5,cno5,givensno5;intg;charSQLSTATE6;EXECSQLENDDECLARESECTION;EXECSQLDECLAREscxCURSORFORSELECTs#,c#,gradeFROMscWHEREs#=:givensno;EXECSQLOPENscx;while(1)EXECSQLFETCHFROMscxINTO:sno,:cno,:g;if(NO_MORE_TUPLES)break;printf(“%s,%s,%d”,sno,cno,g);EXECSQLCLOSEscx;,50,3.6.4动态SQL语句(1),动态SQL预备语句EXECSQLPREPARE动态SQL语句名FROM共享变量或字符串这里共享变量或字符串的值应是一个完整的SQL语句。这个语句可以在程序运行时由用户输入才组合起来。此时,这个语句并不执行。,51,3.6.4动态SQL语句(2),动态SQL执行语句EXECSQLEXECUTE动态SQL语句名动态SQL语句使用时,还可以有两点改进:(1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可合并成一个语句:EXECSQLEXECUTEIMMEDIATE共享变量或字符串(2)当预备语句中组合而成的SQL语句的条件值尚缺时,可以在执行语句中用USING短语补上:EXECSQLEXECUTEUSING,52,3.6.4动态SQL语句(3),例3.33下面两个C语言的程序段说明了动态SQL语句的使用技术。EXECSQLBEGINDECLARESECTION;char*query;EXECSQLENDDECLARESECTION;scanf(%s,query);/*从键盘输入一个SQL语句*/EXECSQLPREPAREqueFROM:query;EXECSQLEXECUTEque;这个程序段表示从键盘输入一个SQL语句到字符数组中;字符指针query指向字符串的第1个字符。如果执行语句只做一次,那么程序段最后两个语句可合并成一个语句:EXECSQLEXECUTEIMMEDIATE:query;,53,3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权委托代管合同协议书范本7篇
- 石油树脂采购合同8篇
- 男女朋友间赠与合同10篇
- 建设工程施工合同填写样本5篇
- 物业管理代收租金承包合同模板7篇
- 房屋墙体拆除合同协议书
- 承包协议书合同格式
- 人教版音乐七年级上册第三单元《金色的秋天》教学设计
- 2024四川巴中市恩阳区国有资本投资运营集团有限公司面向社会公开招聘3人笔试参考题库附带答案详解
- 人教部编版九年级上册第6课 希腊罗马古典文化教学设计
- 《结膜炎诊断与治疗》课件
- 2025东风汽车校招人才测评题库
- 云南黔滇行2024-2025学年中考道德与法治试题(含答案)
- 吉林2025年03月长春新区面向社会公开选聘8名各产业招商办公室负责人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 微风发电项目可行报告
- 医院防雷电安全应急预案
- 2025年中小学生安全教育日知识竞赛考试题(附答案)
- 2025年4月自考00152组织行为学押题及答案
- 2025【英文合同】授权代理合同英文范本
- 北师大版2025二年级语文下册期中考试综合检测
- 2024年四川省资阳市中考物理试题【含答案、解析】
评论
0/150
提交评论