数据库系统原理与设计

上传人:枫** 文档编号:592815654 上传时间:2024-09-22 格式:PPT 页数:156 大小:262.50KB
返回 下载 相关 举报
数据库系统原理与设计_第1页
第1页 / 共156页
数据库系统原理与设计_第2页
第2页 / 共156页
数据库系统原理与设计_第3页
第3页 / 共156页
数据库系统原理与设计_第4页
第4页 / 共156页
数据库系统原理与设计_第5页
第5页 / 共156页
点击查看更多>>
资源描述

《数据库系统原理与设计》由会员分享,可在线阅读,更多相关《数据库系统原理与设计(156页珍藏版)》请在金锄头文库上搜索。

1、第三章 关系数据库语言SQL“数据库系统原理及应用数据库系统原理及应用”课程课程第三章第三章关系数据库语言关系数据库语言SQL 主主 讲讲 人:李俊山人:李俊山 教授教授 联系方式:联系方式:743419 743419 办公地点:训练楼办公地点:训练楼516516房间房间第三章 关系数据库语言SQLSQLSQL语句的分类:语句的分类: 数数据据定定义义语语句句:用用于于定定义义数数据据库库的的逻逻辑辑结结构构,包包括括定义基本表、定义视图和定义索引。定义基本表、定义视图和定义索引。 数数据据查查询询语语句句:用用于于按按不不同同查查询询条条件件实实现现对对数数据据库库中数据的检索查询。中数据的

2、检索查询。 数数据据操操纵纵语语句句:用用于于更更改改和和操操作作表表中中的的数数据据,包包括括数据插入、数据修改、数据删除及数据查询。数据插入、数据修改、数据删除及数据查询。 数据控制语句:数据控制语句:用于实现用户授权、基本表和视图用于实现用户授权、基本表和视图授权、事务控制、完整性和安全性控制等。授权、事务控制、完整性和安全性控制等。 第三章 关系数据库语言SQL3.1.1 3.1.1 表的定义、修改与撤消表的定义、修改与撤消 1. 1. 表的定义表的定义 表的定义语句格式为:表的定义语句格式为: CREATETABLE(, );); 第三章 关系数据库语言SQL其中:其中: 典型的典型

3、的(a)CHAR(m):长长度度为为m的的字字符符(串串)型型数数据据,长长度不够时用空白字符补充,不超过度不够时用空白字符补充,不超过240。(b)VARCHAR(m):长长度度小小于于等等于于m的的字字符符(串串)型数据,长度不够时不补充其它字符。型数据,长度不够时不补充其它字符。(c)INT/INTEGER:长整型数据。:长整型数据。(d)DATE:日日期期型型数数据据,形形式式为为YYYY-MM-DD,分别表示年、月、日。,分别表示年、月、日。第三章 关系数据库语言SQL其中:其中: 典型的典型的(a)NULL:指出该列可以为空值。:指出该列可以为空值。(b)NOTNULL:指指出出该

4、该列列不不能能为为空空值值。每每一一个个表中至少应有一个列的可选项为表中至少应有一个列的可选项为NOTNULL。(c)PRIMARYKEY:指出该列名为表的主键。:指出该列名为表的主键。(d)DEFAULT:给所在的列设置一个缺省值。:给所在的列设置一个缺省值。(e)CHECK:指指出出该该列列的的值值只只能能取取CHECK约约束束条件范围的值。条件范围的值。第三章 关系数据库语言SQL例例3.2创创建建图图所所示示的的教教学学管管理理数数据据库库系系统统中中的的学学生生关关系表系表S,可用如下的表定义语句定义:,可用如下的表定义语句定义:CREATETABLES(S#CHAR(9)PRIMA

5、RYKEY,SNAMECHAR(10)NOTNULL,SSEXCHAR(2)CHECK(SSEXIN(男男,女女),SBIRTHINDATENOTNULL,PLACEOFBCHAR(16),SCODECHAR(5)NOTNULL,CLASSCHAR(5)NOTNULL););第三章 关系数据库语言SQL其中:其中: (a)表的主键约束表的主键约束格式为:格式为:PRIMARYKEY()当当该该表表的的主主键键由由2个个或或2个个以以上上属属性性组组成成时时,表表的的主主键必须由表的完整性约束给出。键必须由表的完整性约束给出。 第三章 关系数据库语言SQL例例3.3创创建建教教学学管管理理数数据

6、据库库系系统统中中的的学学习习关关系系SC,可可用如下的表定义语句定义:用如下的表定义语句定义:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#)););第三章 关系数据库语言SQL(b)表的外键约束表的外键约束格式为:格式为:FOREIGNKEY()REFERENCE()本本子子句句定定义义了了一一个个列列名名为为“”1”的的外外键键,它它与与表表“”中中的的“”2”相相对对应应,且且“”2”在表在表“”中是主键。中是主键。第三章 关系数据库语言SQL例例3.4教教学学管管理理数数据据库库系系统统中中的

7、的学学习习关关系系SC,可可重重新新用如下的表定义语句定义如下:用如下的表定义语句定义如下:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#),FOREIGNKEY(C#)REFERENCESC(C#);第三章 关系数据库语言SQL(c)表检验表检验CHECK约束约束格式为:格式为:CHECK() 表表检检验验约约束束CHECKCHECK子子句句的的含含义义和和格格式式与与列列检检验验约约束束相相同同,所所不不同同的的是是,表表检检验验约约束束CHECKCHECK子子句句是是一一个个独独立立的的子子句句而

8、而不不是是子子句句中中的的一一部部分分。表表检检验验约约束束CHECKCHECK子子句句中中的的 不不仅仅可可以以是是一一个个条条件件表表达达式式,而而且且还可以是一个包含还可以是一个包含SELECTSELECT语句的语句的SQLSQL语句。语句。第三章 关系数据库语言SQL例例3.5教教学学管管理理数数据据库库系系统统中中的的学学习习关关系系SC,还还可可用用如下的表定义语句定义如下:如下的表定义语句定义如下:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#),FOREIGNKEY(C#)REFEREN

9、CESC(C#),CHECK(GRADEBETWEEN0AND100);第三章 关系数据库语言SQL 2. 2. 表的修改表的修改 (1)改变表名改变表名 修改表名的语句格式为:修改表名的语句格式为: RENAME RENAME TO TO ;第三章 关系数据库语言SQL 2. 2. 表的修改表的修改 (2)增加列增加列 在在表表的的最最后后一一列列后后面面增增加加新新的的一一列列,但但不不允允许许将将一一个列插入到原表的中间。个列插入到原表的中间。 增加列语句的格式为:增加列语句的格式为: ALTER TABLE ALTER TABLE ADD ADD ;第三章 关系数据库语言SQL例例3.

10、7给给专专业业表表SSSS增增加加一一个个新新属属性性NOUSE_COLUMNNOUSE_COLUMN,设设其数据类型为其数据类型为NUMERIC(8NUMERIC(8,1)1)。 语句应为:语句应为: ALTER TABLE SS ADD NOUSE_COLUMN ALTER TABLE SS ADD NOUSE_COLUMN NUMERIC(8 NUMERIC(8,1)1);第三章 关系数据库语言SQL 2. 2. 表的修改表的修改 (3)删除删除列列 删除表中不再需要的列,删除表中不再需要的列,语句格式为:语句格式为: ALTER TABLE ALTER TABLE DROP DROP

11、CASCADE | RESTRICT CASCADE | RESTRICT;其其中中,可可选选项项“CASCADE “CASCADE | | RESTRICT”RESTRICT”是是删删除除方方式式。当当选选择择CASCADECASCADE时时,表表示示在在删删除除名名为为“”的的表表中中的的列列“”时时,所所有有引引用用到到该该列列的的视视图图或或有有关关约约束束也也一一起起被被删删除除;当当选选择择RESTRICTRESTRICT时时,表表示示当当没没有有视视图图或或有有关关约约束束引引用用列列“”时时,该该列列才才能能被被删删除除,否否则拒绝该删除操作。则拒绝该删除操作。第三章 关系数据

12、库语言SQL例例3.8 3.8 删删除除专专业业表表SSSS中中增增加加的的属属性性NOUSE_COLUMNNOUSE_COLUMN的的两两种删除种删除语句分别为:语句分别为: ALTER TABLE SS DROP NOUSE_COLUMN CASCADE ALTER TABLE SS DROP NOUSE_COLUMN CASCADE; ALTER TABLE SS DROP NOUSE_COLUMN RESTRICT ALTER TABLE SS DROP NOUSE_COLUMN RESTRICT; 第三章 关系数据库语言SQL 2. 2. 表的修改表的修改 (4)修改修改列的定义列的

13、定义 修修改改属属性性列列的的定定义义语语句句只只用用于于修修改改列列的的类类型型和和长长度度,列列的的名名称称不不能能改改变变。当当表表中中已已有有数数据据时时,不不能能缩缩短短列列的的长长度度,但可以增加列的长度。但可以增加列的长度。 修改列定义语句格式为:修改列定义语句格式为: ALTER TABLE ALTER TABLE MODIFY MODIFY ; 第三章 关系数据库语言SQL例例3.8 3.8 将将专专业业表表SSSS中中的的专专业业名名称称SSNAME(30)SSNAME(30)修修改改为为SSNAME(40)SSNAME(40),即长度增加,即长度增加1010。 ALTER

14、 TABLE SS MODIFY SSNAME VARCHAR(40) ALTER TABLE SS MODIFY SSNAME VARCHAR(40); 第三章 关系数据库语言SQL 3. 3. 表的撤销表的撤销 表表的的撤撤消消就就是是将将不不再再需需要要的的表表或或定定义义有有错错误误的的表表删删除除掉掉。当一个表被撤消时,该表中的数据也一同被撤消(删除)。当一个表被撤消时,该表中的数据也一同被撤消(删除)。 撤消表的语句格式为:撤消表的语句格式为: DROP TABLE DROP TABLE CASCADE | RESTRICT CASCADE | RESTRICT;其其中中, , C

15、ASCADECASCADE表表示示在在撤撤消消表表“”时时,所所有有引引用用这这个个表表的的视视图图或或有有关关约约束束也也一一起起被被撤撤消消;RESTRICTRESTRICT表表示示在在没没有有视视图图或或有有关关约约束束引引用用该该表表的的属属性性列列时时,表表“”才才能能被撤消,否则拒绝该撤消操作。被撤消,否则拒绝该撤消操作。 第三章 关系数据库语言SQL3.1.2 3.1.2 数据的插入、修改、删除、提交与撤消数据的插入、修改、删除、提交与撤消 1. 1. 数据的插入数据的插入 向向表表中中插插入入一一行行数数据据的的单单元元组组值值插插入入方方式式的的INSERTINSERT语语句

16、格式为:句格式为: INSERT INTO INSERT INTO ( ) VALUESVALUES( );); 第三章 关系数据库语言SQL其中:其中: (1)(1)如如果果选选择择可可选选项项“( )”,表表示示在在插插入入一一个个新新元元组组时时,只只向向由由 i指指出出的的列列中中插插入入数数据据,其其他他没没有有列列出出的的列列不不插插入入数数据据( (为为空空值值) ),且且“”中中必必须须至至少少包包括括表表中中那那些些列列约约束束为为“NOT “NOT NULL”NULL”的的列列和和主主键键列列。如果不选择该可选项,则默认表中所有的列都要插入数据。如果不选择该可选项,则默认表

17、中所有的列都要插入数据。 (2) (2) 指指出出要要插插入入列列的的具具体体值值。如如果果选选择择了了可可选选项项,则则 中中的的属属性性列列值值必必须须与与 中中的的属属性性列列名名一一一一对对应应;如如果果没没有有选选择择可可选选项项,则则 中的属性列值必须与中的属性列值必须与 中的属性列名一一对应。中的属性列名一一对应。 第三章 关系数据库语言SQL例例3.10 3.10 给给学学习习关关系系SCSC中中插插入入王王丽丽丽丽同同学学(学学号号为为200401003200401003)学学习习计计算算机机网网络络课课(课课程程号号为为C403001C403001)的成绩(的成绩(8989

18、分)。分)。 INSERT INTO SC INSERT INTO SC (S#S#,C#C#,GRADEGRADE) VALUES VALUES(200401003200401003,C403001C403001,8989););或:或: INSERT INTO SC INSERT INTO SCVALUES(200401003,C403001,89););第三章 关系数据库语言SQL3.1.2 3.1.2 数据的插入、修改、删除、提交与撤消数据的插入、修改、删除、提交与撤消 2. 2. 数据的修改数据的修改 语句格式为:语句格式为: UPDATE UPDATE SET SET 1 1, 2

19、 ,2, , , n n WHERE WHERE 其其中中,“i ”i”指指出出将将列列“”的的值值修修改改成成 。可可选选项项“WHERE “WHERE ”中中的的 指指定定修修改改有有关关列列的的数数据据时时所所应应满满足足的的条条件件。当当不不选选择择该该选项时,表示修改表中全部元组中相应列的数据。选项时,表示修改表中全部元组中相应列的数据。 第三章 关系数据库语言SQL例例3.13 3.13 将将学学生生关关系系S S中中的的学学生生名名字字“王王丽丽丽丽”改改为为“王黎丽王黎丽”。 UPDATE S UPDATE S SET SNAME SET SNAME王黎丽王黎丽WHERES#2

20、00401003;第三章 关系数据库语言SQL例例3.14 3.14 将所有女同学的专业改为将所有女同学的专业改为S0404S0404。 UPDATE S UPDATE S SET SCODE SET SCODES0404S0404WHERESSEX女女;第三章 关系数据库语言SQL3.1.2 3.1.2 数据的插入、修改、删除、提交与撤消数据的插入、修改、删除、提交与撤消 3. 3. 数据的删除数据的删除 语句格式为:语句格式为: DELETE FROM DELETE FROM WHERE WHERE 其其中中,可可选选项项“WHERE “WHERE ”中中的的 指指定定所所删删元元组组应应

21、满满足足的的条条件件。当当不不选选该该可可选选项项时时,表表示示删删除除表表中中全全部部数据。数据。 第三章 关系数据库语言SQL例例3.15 3.15 在在学学生生关关系系S S中中删删除除学学号号为为200403001200403001的的学学生生信信息。息。 DELETE FROM S DELETE FROM S WHERE S# =200403001 WHERE S# =200403001;例例 删除专业关系中的全部信息。删除专业关系中的全部信息。 DELETE FROM SS DELETE FROM SS;第三章 关系数据库语言SQL3.1.2 3.1.2 数据的插入、修改、删除、提

22、交与撤消数据的插入、修改、删除、提交与撤消 4. 4. 数据的提交数据的提交 工作区概念:工作区概念: 数数据据提提交交的的概概念念:就就是是把把用用户户对对数数据据库库中中数数据据的的更更新新结结果永久地保存到数据库中。果永久地保存到数据库中。 显式提交显式提交: : 隐式提交:隐式提交:第三章 关系数据库语言SQL3.1.2 3.1.2 数据的插入、修改、删除、提交与撤消数据的插入、修改、删除、提交与撤消 5. 5. 数据的撤销数据的撤销 命令格式命令格式: : 第三章 关系数据库语言SQL3 3 简单查询简单查询 1. SELECT 1. SELECT查询语句查询语句 SQLSQL查询语

23、句的基本格式为:查询语句的基本格式为: SELECT SELECT FROM FROM WHERE WHERE 第三章 关系数据库语言SQL3 3 简单查询简单查询 2. 2. 无条件查询无条件查询 例例 查询教学管理数据库中全部学生的基本信息。查询教学管理数据库中全部学生的基本信息。 SELECT * SELECT * FROM S FROM S; 例例3.19 3.19 查询课程关系查询课程关系C C中的记录数,也即开课的总门数。中的记录数,也即开课的总门数。 SELECT COUNT(*) SELECT COUNT(*) FROM C FROM C; 第三章 关系数据库语言SQLSQLS

24、QL语言中常用的聚合函数主要有语言中常用的聚合函数主要有:(1 1)COUNT(*) COUNT(*) 计算元组的个数;计算元组的个数;(2 2)COUNT(COUNT(列名列名) ) 计算某一列中数据的个数;计算某一列中数据的个数;(3 3)COUNT DISTINCT(COUNT DISTINCT(列名列名) ) 计算某一列中不同值的个数;计算某一列中不同值的个数;(4 4)SUM(SUM(列名列名) ) 计算某一数据列中值的总和;计算某一数据列中值的总和;(5 5)AVG(AVG(列名列名) ) 计算某一数据列中值的平均值;计算某一数据列中值的平均值;(6 6)MIN(MIN(列名列名)

25、 ) 求求( (字符、日期、属性列字符、日期、属性列) )的最小值;的最小值;(7 7)MAX(MAX(列名列名) ) 求求( (字符、日期、属性列字符、日期、属性列) )的最大值;的最大值;第三章 关系数据库语言SQL例例3.20 3.20 计计算算所所有有学学生生所所学学课课程程的的最最高高分分数数、最最低低分分数和平均分数。数和平均分数。 SELECT MAX(GRADE) SELECT MAX(GRADE),MIN(GRADE)MIN(GRADE),AVG(GRADE)AVG(GRADE) FROM SC FROM SC; 第三章 关系数据库语言SQL3 3 简单查询简单查询 3. 3

26、. 单条件查询单条件查询 例例3.21 3.21 查查询询所所有有学学习习计计算算机机网网络络课课( (课课程程号号为为C403001)C403001)的的学生的学号和成绩。学生的学号和成绩。 SELECT S# SELECT S#,GRADEGRADE FROM SC FROM SC WHERE C# =C403001 WHERE C# =C403001; 第三章 关系数据库语言SQL 表条件表达式中的关系比较符表条件表达式中的关系比较符 运算符运算符含义含义= = ! = ! = 或或 = = 18 AND AGE = 18 AND AGE = 25; 第三章 关系数据库语言SQL 上上例

27、例中中:这这种种把把某某数数值值型型列列的的值值限限定定在在某某个个数数值值区区间间的的比比较较查查询询条条件件( 、= 、=)可可以以用用比比较较运运算算符符“BETWEEN AND”“BETWEEN AND”来表示,来表示,格式为:格式为: BETWEEN BETWEEN AND AND 例的查询可以改写为:例的查询可以改写为: SELECT *SELECT * FROM S1 FROM S1 WHERE AGE BETWEEN 18 AND 25 WHERE AGE BETWEEN 18 AND 25;第三章 关系数据库语言SQL5. 5. 分组查询分组查询 在在SQLSQL语语言言中中

28、,把把元元组组按按某某个个或或某某些些列列上上相相同同的的值值分分组组,然后再对各组进行相应操作的查询方式称为分组查询。然后再对各组进行相应操作的查询方式称为分组查询。 分组查询的语句格式为:分组查询的语句格式为: SELECT SELECT FROM FROM WHERE WHERE GROUP BY GROUP BY HAVING HAVING ; 第三章 关系数据库语言SQL (1 1)GROUP BYGROUP BY子句子句 GROUP GROUP BYBY子子句句用用来来将将列列的的值值分分成成若若干干组组,从从而而控控制制查查询询的结果排序。的结果排序。 例例3.24 3.24 计

29、算各个同学的平均分数。计算各个同学的平均分数。 SELECT #S SELECT #S,AVG(GRADE)AVG(GRADE) FROM SC FROM SC GROUP BY #S GROUP BY #S; 第三章 关系数据库语言SQL例例3.25 3.25 计算每个专业的男、女生分别有多少人数。计算每个专业的男、女生分别有多少人数。 SELECT SCODE SELECT SCODE,SSEXSSEX,COUNT(*)COUNT(*) FROM S FROM S GROUP BY SCODE GROUP BY SCODE,SSEXSSEX; 第三章 关系数据库语言SQL (2 2)HAV

30、INGHAVING子句子句 在在数数据据查查询询中中,有有时时只只希希望望选选择择满满足足一一定定条条件件的的分分组组。一一般般是是利利用用GROUP GROUP BYBY子子句句进进行行分分组组,利利用用HAVINGHAVING子子句句判判断断分组应满足的条件。分组应满足的条件。 例例3.26 3.26 查询学生总数超过查询学生总数超过300人的专业及其具体的总人数。人的专业及其具体的总人数。SELECT SCODESELECT SCODE,COUNT(*)COUNT(*) FROM S FROM S GROUP BY SCODE GROUP BY SCODE HAVING COUNT(*)

31、300 HAVING COUNT(*)300; 第三章 关系数据库语言SQL6. 6. 结果排序结果排序 通通常常,SELECTSELECT的的查查询询结结果果是是按按元元组组在在数数据据库库中中的的存存储储顺顺序序给给出出的的。但但有有时时用用户户希希望望按按照照某某种种约约定定的的顺顺序序给给出出查查询询结结果果,ORDER ORDER BYBY子子句句可可以以实实现现查查询询结结果果的的排排序序显显示示功功能能,其语句格式为:其语句格式为: SELECT SELECT FROM FROM WHERE WHERE ORDER ORDER BY BY ASC/DESC ASC/DESC ,

32、, ,ASC/DESCASC/DESC; 第三章 关系数据库语言SQL例例3.27 3.27 按学号递增的顺序显示学生的基本信息。按学号递增的顺序显示学生的基本信息。 SELECT * SELECT * FROM S FROM S ORDER BY S# ASC ORDER BY S# ASC; 例例3.28 3.28 按按学学号号递递增增、课课程程成成绩绩递递减减的的顺顺序序显显示示学学生生的的课课程程成绩。成绩。 SELECT S#SELECT S#,C#C#,GRADEGRADE FROM SC FROM SC ORDER BY S# ASC ORDER BY S# ASC,GRADE

33、DESCGRADE DESC; 第三章 关系数据库语言SQL7. 7. 字符串的匹配字符串的匹配 在在WHEREWHERE子子句句的的条条件件表表达达式式中中,实实现现两两个个字字符符串串的的部部分分字字符的相等比较。符的相等比较。比较运算符的格式为:比较运算符的格式为: LIKE LIKE 字符串字符串11通配符通配符 字符串字符串22其中:其中: (1 1)下下划划线线_ _:在在字字符符串串比比较较时时,如如果果有有一一个个字字符符可可以以任意,则在该字符位置上用下划线表示。任意,则在该字符位置上用下划线表示。 (2 2)百百分分号号% %:在在字字符符串串比比较较时时,如如果果有有一一

34、个个长长度度大大于于等等于于0 0子子字字符符串串可可以以任任意意,则则在在该该子子字字符符串串位位置置上上用用百百分分号号表示。表示。 第三章 关系数据库语言SQL例例3.29 3.29 查询学生关系查询学生关系S S中姓李的学生的学号和姓名。中姓李的学生的学号和姓名。 SELECT S# SELECT S#,SNAMESNAME FROM S FROM S WHERE SNAME LIKE WHERE SNAME LIKE 李李%;第三章 关系数据库语言SQL8. 8. 比较完整的比较完整的SELECTSELECT查询语句查询语句 SELECT SELECT FROM FROM WHERE

35、 WHERE GROUP BY GROUP BY HAVING HAVING ORDER BY ORDER BY ASC/DESC ASC/DESC , , ,ASC/DESCASC/DESC;第三章 关系数据库语言SQL3 SQL3 SQL语言中的常用函数及其使用方式语言中的常用函数及其使用方式 1. 1. 日期型函数日期型函数 日期是日期是SQLSQL语言中的标准数据类型(语言中的标准数据类型(DATEDATE)。)。 函函 数数 功功 能能sysdatelast_daynext_day(d,w_day)add_months(d,n)months_between(d1,d2)to_char

36、(d,new_d)取当前日期和时间取当前日期和时间取本月最后一天取本月最后一天计计算算日日期期d d之之后后第第一一周周指指定定星星期期几几( (由由w_dayw_day指指定定) )的日期的日期取在日期取在日期d d的基础上后推的基础上后推n n个月的日期个月的日期计算日期计算日期d1d1和和d2d2之间相差的月数之间相差的月数将将日日期期d d的的缺缺省省格格式式“DD-MON-YYYY”“DD-MON-YYYY”表表示示成成指指定的新格式定的新格式new_dnew_d表表3.3 3.3 常用的日期函数常用的日期函数 第三章 关系数据库语言SQL例例3.30 3.30 查查询询出出生生日日

37、期期在在19821982年年1 1月月1 1日日到到19821982年年1212月月3131日日之之间间的的所所有有学学生生的的学学号号、姓姓名名和和出出生生日日期期,并并按按日日期期的的递递增增顺序排列。顺序排列。 SELECT S# SELECT S#,SNAMESNAME,SBIRTHINSBIRTHIN FROM S FROM S WHERE SBIRTHIN WHERE SBIRTHIN BETWEEN1-JUN-1982AND 31-DEC-1982 BETWEEN1-JUN-1982AND 31-DEC-1982 ORDER BY SBIRTHIN ORDER BY SBIRTH

38、IN; 第三章 关系数据库语言SQL表表3.4 3.4 常用的日期显示格式常用的日期显示格式 日期显示格式(模式)日期显示格式(模式) 示例示例 缺省格式缺省格式MM/DD/YYMM/DD/YYYYYY/MM/DDYYYY/MM/DDDY DD MON YYDY DD MON YYDay Mon DDDay Mon DD 23-FEB-9923-FEB-9902/23/9902/23/991999/02/231999/02/23WED 12 JAN 88WED 12 JAN 88Wednesday Jan 12Wednesday Jan 12 第三章 关系数据库语言SQL例例3.31 3.31

39、 在在上上例例中中,出出生生日日期期的的缺缺省省显显示示方方式式不不符符合合我我国国的的日日期期表表示示习习惯惯,可可用用日日期期转转换换函函数数函函数数to_charto_char将将其其转转换换成成“年年/ /月月/ /日日”的表示形式。的表示形式。 SELECT S# SELECT S#,SNAMESNAME, to_char(SBIRTHIN to_char(SBIRTHIN,YYYY”/”MM”/”DD)YYYY”/”MM”/”DD) FROM S FROM S WHERE SBIRTHIN WHERE SBIRTHIN BETWEEN 1-JUN-1982 AND 31-DEC-1

40、982 BETWEEN 1-JUN-1982 AND 31-DEC-1982 ORDER BY SBIRTHIN ORDER BY SBIRTHIN; 第三章 关系数据库语言SQL2. 2. 字符串函数字符串函数表表3.5 3.5 常用的字符串函数常用的字符串函数 函函 数数 功功 能能length(str)initcap(str)lower(str)upper(str)replace(str,str1,str2)substr(str,m,n)itrim(str)ascii(str)求字符串的长度求字符串的长度将字符串将字符串strstr中的第一个字符转换成大写字符中的第一个字符转换成大写字符

41、将字符串将字符串strstr中的大写字母转换成小写字母中的大写字母转换成小写字母将字符串将字符串strstr中的小写字母转换成大写字符中的小写字母转换成大写字符将字符串将字符串strstr中的所有中的所有 str1 str1换成换成 str2 str2从字符串从字符串strstr的第的第m m个字符开始取出个字符开始取出n n个字符个字符截掉字符串截掉字符串strstr尾部的空格尾部的空格取字符串取字符串 str str的的ASCIIASCII码值码值第三章 关系数据库语言SQL3 SQL3 SQL语言中的常用函数及其使用方式语言中的常用函数及其使用方式 3. 3. 算术函数算术函数表表3.6

42、 3.6 常用的算术函数常用的算术函数 函数函数 功能功能 abs(n)ceil(n)floor(n)mod(m,n)power(m,n)round(n,m)sign(n)sqrt(n)求求n n的绝对值的绝对值求大于等于数值求大于等于数值n n的最小整数的最小整数求小于等于数值求小于等于数值n n的最大整数的最大整数取余数。若取余数。若n=0n=0,则取,则取m m求求m m的的n n次方次方四舍五入,保留四舍五入,保留m m位位n=0n=0,返回,返回0 0;nnnn,返回,返回1 1;n0n0,返回,返回-1-1求求n n的平方的平方 第三章 关系数据库语言SQL4. 4. 空值显示与空

43、值函数空值显示与空值函数例例3.33 3.33 查询学习关系查询学习关系SCSC中分数中分数GRADEGRADE为空值的课程号。为空值的课程号。 SELECT C# SELECT C# FROM SC FROM SC WHERE GRADE IS NULL WHERE GRADE IS NULL;第三章 关系数据库语言SQL3 SQL3 SQL高级查询技术高级查询技术 1. 1. 多表联接查询(多表联接查询(二元二元查询/ /多元多元查询 )SELECT S.S#SELECT S.S#,SNAMESNAME FROM S FROM S,SCSC WHERE S.S# = SC.S# AND C

44、# =C401001 WHERE S.S# = SC.S# AND C# =C401001; 例例3.37 3.37 查查询询所所有有学学习习了了数数据据结结构构课课(课课程程号号为为C401001C401001)的学生的学号和姓名。)的学生的学号和姓名。第三章 关系数据库语言SQL例例3.38 3.38 查查询询选选修修了了“信信息息安安全全技技术术”课课程程的的学学生生的的学学号号与姓名。与姓名。 SELECT S.S# SELECT S.S#,SNAMESNAME FROM S FROM S,SCSC,C C WHERE S.S# = SC.S# AND SC.C# = C.C# WHE

45、RE S.S# = SC.S# AND SC.C# = C.C# AND CNAME = AND CNAME =信息安全技术信息安全技术; 第三章 关系数据库语言SQL3 SQL3 SQL高级查询技术高级查询技术 2. 2. 外联接查询外联接查询 学学 号号 姓名姓名 性别性别 出生年月出生年月 籍贯籍贯 专业代码专业代码 班级班级200401001 200401001 张华张华 男男 14-dec-82 14-dec-82 北京北京 S0401 200401 S0401 200401200401002 200401002 李建平李建平 男男 20-aug-82 20-aug-82 上海上海

46、S0401 200401 S0401 200401200401003 200401003 王丽丽王丽丽 女女 02-feb-83 02-feb-83 上海上海 S0401 200401 S0401 200401200402001 200402001 杨秋红杨秋红 女女 09-may-83 09-may-83 西安西安 S0402 200402 S0402 200402200402002 200402002 吴志伟吴志伟 男男 30-jun-82 30-jun-82 南京南京 S0402 200402 S0402 200402200402003 200402003 李涛李涛 男男 25-jun-

47、83 25-jun-83 西安西安 S0402 200402 S0402 200402200403001 200403001 赵晓艳赵晓艳 女女 11-mar-82 11-mar-82 长沙长沙 S0403 200403 S0403 200403专业代码专业代码 专业名称专业名称 S0401 S0401 计算机科学计算机科学 S0402 S0402 指挥自动化指挥自动化 S0403 S0403 网络工程网络工程 S0404 S0404 信息研究信息研究学生关系学生关系S:专专业业关关系系SS注意:虽然存在信息研究专业,虽然存在信息研究专业,但学生关系的当前值中没但学生关系的当前值中没有信息研究

48、专业的学生有信息研究专业的学生。第三章 关系数据库语言SQL 对于查询:对于查询: SELECT SS.SCODE#SELECT SS.SCODE#,S#S#,SNAMESNAME FROM SS FROM SS,S S ORDER BY SCODE# ORDER BY SCODE#; 有查询结果:有查询结果:SCODE SSNAME S# SNAMESCODE SSNAME S# SNAME S0401 S0401 计算机科学计算机科学 200401001 200401001 张华张华 S0401 S0401 计算机科学计算机科学 200401002 200401002 李建平李建平 S04

49、01 S0401 计算机科学计算机科学 200401003 200401003 王丽丽王丽丽 S0402 S0402 指挥自动化指挥自动化 200402001 200402001 杨秋红杨秋红 S0402 S0402 指挥自动化指挥自动化 200402002 200402002 吴志伟吴志伟 S0402 S0402 指挥自动化指挥自动化 200402003 200402003 李涛李涛 S0403 S0403 网络工程网络工程 200403001 200403001 赵晓艳赵晓艳 由于信息研究由于信息研究专业没有学生,专业没有学生,所以查询结果所以查询结果丢失了信息研丢失了信息研究的专业信息,

50、究的专业信息,为此,为此,SQL引引入了外联接查入了外联接查询。询。第三章 关系数据库语言SQL 外联接查询包括:左外联接和右外联接。外联接查询包括:左外联接和右外联接。 ( (1)1)1)1)左外联接左外联接左外联接左外联接(Left-outer Join)(Left-outer Join)(Left-outer Join)(Left-outer Join) R S = (R S)(R1 (? ?) R S = (R S)(R1 (? ?)其中:其中:其中:其中: R1=R-R(RS) (2) (2) (2) (2)右外联接右外联接右外联接右外联接(Right-outer Join)(Rig

51、ht-outer Join)(Right-outer Join)(Right-outer Join) R S = (R S)(? ?) S1) R S = (R S)(? ?) S1)其中:其中: S1=S-S1=S-SS(R SR S)第三章 关系数据库语言SQL 外联接查询包括:左外联接和右外联接。外联接查询包括:左外联接和右外联接。 设设“R.A = S.B”“R.A = S.B”是是WHEREWHERE子句中的等值条件表达式,则:子句中的等值条件表达式,则: (1 1)左左外外联联接接的的表表示示形形式式为为,其其含含义义是是假假设设在在等等值值条条件件右右边边的的关关系系S S中中有

52、有一一个个“全全空空”的的元元组组,且且该该元元组组可可与与等等值值条条件件左左边边的的关关系系R R中中任任何何不不满满足足等等值值联联接接条条件件的的元元组组匹匹配配构构成一个新的元组;成一个新的元组; (2 2)右右外外联联接接的的表表示示形形式式为为R.A R.A = = S.B(+)S.B(+),其其含含义义是是假假设设在在等等值值条条件件左左边边的的关关系系R R中中有有一一个个“全全空空”的的元元组组,且且该该元元组组可可与与等等值值条条件件右右边边的的关关系系S S中中任任何何不不满满足足等等值值联联接接条条件件的元组匹配构成一个新的元组。的元组匹配构成一个新的元组。 第三章

53、关系数据库语言SQL 这时,上述的这时,上述的查询语句:查询语句: SELECT SS.SCODE#SELECT SS.SCODE#,S#S#,SNAMESNAME FROM SS FROM SS,S S ORDER BY SCODE# ORDER BY SCODE#; 就可以改写成:就可以改写成: SELECT SS.SCODE#SELECT SS.SCODE#,S#S#,SNAMESNAME FROM SS FROM SS,S S WHERE SS.SCODE# WHERE SS.SCODE#(+)(+)= S.SCODE#= S.SCODE# ORDER BY SCODE# ORDER

54、BY SCODE#; 查询出的结果就包含了:查询出的结果就包含了: S0404 S0404 信息研究信息研究 null null null null 尽管信息研究专尽管信息研究专业没有学生,但业没有学生,但专业仍然存在!专业仍然存在!第三章 关系数据库语言SQL3. 3. 嵌套查询嵌套查询 即即:在在SQLSQL语语言言中中,如如果果在在一一个个SELECTSELECT语语句句的的WHEREWHERE子子句句中中嵌嵌入入了了另另一一个个SELECTSELECT语语句句,则则称称为为嵌嵌套套查查询询。WHEREWHERE子句中的子句中的SELECTSELECT语句称为子查询。语句称为子查询。第三

55、章 关系数据库语言SQL例例3.39 3.39 查查询询张张华华同同学学(学学号号为为200401001200401001)的的那那个个班班的的女女同学的基本信息。同学的基本信息。SELECT *SELECT * FROM S FROM S WHERE CLASS=(SELECT CLASS WHERE CLASS=(SELECT CLASS FROM S FROM S WHERE S# =200401001) WHERE S# =200401001) AND SSEX = AND SSEX =女女; 第三章 关系数据库语言SQL4. 4. 谓词演算查询谓词演算查询 表表3.7 3.7 常用的

56、谓词操作符常用的谓词操作符 操作符操作符 说说 明明 betweenAandBnotbetweenAandBlikeinnotinanysomeallexistsnotexists某列的数值区间是某列的数值区间是AA,BB某列的数值区间在某列的数值区间在AA,BB外外两个字符串的部分字符相等,其余可以任意两个字符串的部分字符相等,其余可以任意某列的某个值属于集合成员中的一个成员某列的某个值属于集合成员中的一个成员某列的值不属于集合成员中的任何一个成员某列的值不属于集合成员中的任何一个成员某列的值满足一个条件即可某列的值满足一个条件即可满足集合中的某些值满足集合中的某些值某列的值满足子查询中所有

57、值的记录某列的值满足子查询中所有值的记录总存在一个值满足条件总存在一个值满足条件不存在任何值满足条件不存在任何值满足条件第三章 关系数据库语言SQL 4. 4. 谓词演算查询谓词演算查询 (1 1)IN IN 和和 NOT IN NOT IN谓词谓词 条件表达式格式为:条件表达式格式为: IN IN 2 NOT IN NOT IN 2 前前者者的的含含义义:如如果果集集合合1 1中中的的数数据据是是集集合合2 2中中的的成成员员,那么逻辑值为那么逻辑值为truetrue,否则为,否则为falsefalse。 后后者者的的含含义义:如如果果集集合合1 1中中的的数数据据不不是是集集合合2 2中中

58、的的成成员,那么逻辑值为员,那么逻辑值为truetrue,否则为,否则为falsefalse。第三章 关系数据库语言SQL例例3.40 3.40 查查询询所所有有学学习习了了数数据据结结构构课课(课课程程号号为为C401001C401001)的学生的学生的学号和姓名。的学号和姓名。 SELECT S.S# SELECT S.S#,SNAMESNAME FROM S FROM S WHERE S# IN (SELECT S# WHERE S# IN (SELECT S# FROM SC FROM SC WHERE C# =C401001) WHERE C# =C401001); 第三章 关系数据

59、库语言SQL例例3.41 3.41 利利用用嵌嵌套套查查询询实实现现例例,也也即即查查询询选选修修了了“信信息息安安全技术全技术”课程的学生的学号与姓名。课程的学生的学号与姓名。SELECT S.S#SELECT S.S#,SNAMESNAMEFROM SFROM SWHERE S# INWHERE S# IN (SELECT S# (SELECT S# FROM SC FROM SC WHERE C# IN WHERE C# IN (SELECT C# (SELECT C# FROM C FROM C WHERE CNAME= WHERE CNAME=信息安全技术信息安全技术););思思路路

60、:选选修修了了“信信息息安安全全技技术术”课课的的课课程程号号;选选修修了了该该课课程程(号号)的的学学生生的的学学号号第三章 关系数据库语言SQL 4. 4. 谓词演算查询谓词演算查询 (2 2)ANYANY和和SOMESOME谓词谓词 条件表达式格式为:条件表达式格式为: ANY ANY SOME SOME 其其中中,是是算算术术比比较较运运算算符符 、= 、=、= =、!=!=。其其含含义义是是:比比较较运运算算符符左左边边的的数数据据与与右右边边集集合合中中的的某某个个或或某某些些元元素素是是否否满足满足运算运算,满足则为真,不满足则为假,满足则为真,不满足则为假。 在在SQLSQL语

61、语言言中中,ANYANY和和SOMESOME具具有有相相同同的的含含义义,早早期期的的版版本本用用的的是是ANYANY,新新的的版版本本都都改改为为SOMESOME,有有些些商商用用数数据据库库版版本本的的SQLSQL语言中,同时保存了语言中,同时保存了ANYANY和和SOMESOME两个谓词。两个谓词。 第三章 关系数据库语言SQL例例3.42 3.42 查查询询所所有有学学习习了了数数据据结结构构课课(课课程程号号为为C401001C401001)的学生的学号和姓名。的学生的学号和姓名。 SELECT S.S# SELECT S.S#,SNAMESNAME FROM S FROM S WH

62、ERE S# = ANY (SELECT S# WHERE S# = ANY (SELECT S# FROM SC FROM SC WHERE C# =C401001) WHERE C# =C401001);其中,其中,“= ANY”“= ANY”的作用相当于的作用相当于ININ。 第三章 关系数据库语言SQL 4. 4. 谓词演算查询谓词演算查询 (3 3)ALLALL谓词谓词 条件表达式格式为:条件表达式格式为: ALL ALL 含含义义是是:比比较较运运算算符符左左边边的的数数据据与与右右边边集集合合中中的的所所有有元元素素是是否否满满足足运运算算,满满足足其其逻逻辑辑值值为为truet

63、rue,不不满满足足其其逻逻辑值为辑值为falsefalse。 。 第三章 关系数据库语言SQL例例3.43 3.43 查查询询考考试试成成绩绩大大于于网网络络工工程程专专业业(专专业业代代码码为为S0403S0403)所有学生的课程成绩)所有学生的课程成绩的学生的基本信息。的学生的基本信息。SELECT S.S#SELECT S.S#,SNAMESNAME,SSEXSSEX,SBIRTHINSBIRTHIN, PLACEOFB PLACEOFB,SCODESCODE,CLASSCLASS FROM S FROM S,SCSC WHERE S.S# = SC.S# AND GRADE ALL

64、WHERE S.S# = SC.S# AND GRADE ALL ( (SELECT GRADESELECT GRADE FROM S FROM S,SC SC WHERE S.S# = SC.S# WHERE S.S# = SC.S# AND SCODE = S0403 AND SCODE = S0403; 第三章 关系数据库语言SQL 4. 4. 谓词演算查询谓词演算查询 (4 4)EXISTSEXISTS和和NOT EXISTSNOT EXISTS谓词 条件表达式格式为:条件表达式格式为: EXISTSEXISTS( ) NOT EXISTSNOT EXISTS( ) 前前者者的的含含义

65、义是是:当当集集合合中中至至少少存存在在一一个个元元素素(非非空空)时时,其逻辑值为其逻辑值为truetrue,否则为,否则为falsefalse; 后后者者的的含含义义是是:当当集集合合中中不不存存在在任任何何元元素素(为为空空)时时,其逻辑值为其逻辑值为truetrue,否则为,否则为falsefalse。 通常用于测试子查询是否有返回结果。通常用于测试子查询是否有返回结果。 第三章 关系数据库语言SQL例例3.44 3.44 查查询询所所有有学学习习了了数数据据结结构构课课(课课程程号号为为C401001C401001)的学生的学号和姓名。的学生的学号和姓名。 SELECT S.S# S

66、ELECT S.S#,SNAMESNAME FROM S FROM S WHERE EXISTS (SELECT * WHERE EXISTS (SELECT * FROM SC FROM SC WHERE SC.S# = S.S# WHERE SC.S# = S.S# AND C# =C401001) AND C# =C401001); 直直观观的的意意义义为为:查查询询的的是是那那些些,在在学学习习关关系系中中存存在在所所学学课程为数据结构的学生的学号和姓名。课程为数据结构的学生的学号和姓名。第三章 关系数据库语言SQL 5. 5.查询结果的并、交、差操作查询结果的并、交、差操作 (1 1

67、)并操作)并操作 即即,指指将将两两个个或或多多个个SELECTSELECT语语句句的的查查询询结结果果组组合合在在一一起起作为总的查询结果输出。语句格式为:作为总的查询结果输出。语句格式为: SELECT SELECT FROM FROM WHERE WHERE UNION ALL SELECT UNION ALL SELECT 语句语句 ; 其其中中,如如果果不不选选择择可可选选项项 ALLALL,则则在在输输出出总总查查询询结结果果时时重重复复的的行行会会自自动动被被取取掉掉。如如果果选选择择可可选选项项 ALLALL,则则表表示示将将全部行合并输出,也即不取掉重复行。全部行合并输出,也

68、即不取掉重复行。 第三章 关系数据库语言SQL例例3.46 3.46 合并学生关系和专业关系中的专业代码。合并学生关系和专业关系中的专业代码。 SELECT SCODE# SELECT SCODE# FROM S FROM S UNION SELECT SCODE# UNION SELECT SCODE# FROM SS FROM SS; 第三章 关系数据库语言SQL 5. 5.查询结果的并、交、差操作查询结果的并、交、差操作 (2 2)交操作)交操作 查查询询结结果果的的交交操操作作是是指指将将同同时时属属于于两两个个或或多多个个SELECTSELECT语语句句的的查查询询结结果果作作为为总

69、总的的查查询询结结果果输输出出。查查询询结结果果交交操操作作的的基本数据单位是行。其语句格式为:基本数据单位是行。其语句格式为: SELECT SELECT FROM FROM WHERE WHERE INTERSECT SELECT INTERSECT SELECT 语句语句 ; 第三章 关系数据库语言SQL例例3.47 3.47 查询有成绩的学生的学号。查询有成绩的学生的学号。 SELECT S# SELECT S# FROM S FROM S INTERSECT SELECT S# INTERSECT SELECT S# FROM SC FROM SC WHERE GRADE IS NO

70、T NULL; WHERE GRADE IS NOT NULL;第三章 关系数据库语言SQL 5. 5.查询结果的并、交、差操作查询结果的并、交、差操作 (3 3)差操作)差操作 是是指指从从第第一一个个SELECTSELECT语语句句的的查查询询结结果果中中去去掉掉属属于于第第二二个个SELECTSELECT语语句句查查询询结结果果的的行行作作为为总总的的查查询询结结果果输输出出。其其语语句句格式为:格式为: SELECT SELECT FROM FROM WHERE WHERE MINUS SELECT MINUS SELECT 语句句; 第三章 关系数据库语言SQL例例3.48 3.48

71、 查询没有成绩的学生的学号。查询没有成绩的学生的学号。 SELECT S# SELECT S# FROM S FROM S MINUS SELECT S# MINUS SELECT S# FROM SC FROM SC WHERE GRADE IS NOT NULL; WHERE GRADE IS NOT NULL;第三章 关系数据库语言SQL 课堂综合练习:课堂综合练习: 1 1、查询全部学生的学号、姓名、所学课程号和成绩。、查询全部学生的学号、姓名、所学课程号和成绩。 2 2、查询没有选修任何课程的学生的学号和姓名。、查询没有选修任何课程的学生的学号和姓名。 3 3、找出选修了全部课程的学

72、生的学号和姓名。、找出选修了全部课程的学生的学号和姓名。第三章 关系数据库语言SQL 堂综合练习答案:堂综合练习答案: 1 1、查查询询全全部部学学生生的的学学号号、姓姓名名、所所学学课课程程号号和和成成绩。绩。 SELECT S.S# SELECT S.S#,SNAMESNAME,C#C#,GRADEGRADE FROM S FROM S,SCSC WHERE C# IN WHERE C# IN (SELECT C# (SELECT C# FROM SC FROM SC WHERE S.S# = SC.S#) WHERE S.S# = SC.S#);第三章 关系数据库语言SQL 堂综合练习答

73、案:堂综合练习答案: 2 2、查询没有选修任何课程的学生的学号和姓名。、查询没有选修任何课程的学生的学号和姓名。 SELECT S# SELECT S#,SNAMESNAME FROM S FROM S WHERE NOT EXISTS WHERE NOT EXISTS (SELECT * (SELECT * FROM SC FROM SC WHERE SC.S# = S.S#) WHERE SC.S# = S.S#);第三章 关系数据库语言SQL 堂综合练习答案:堂综合练习答案: 3 3、找找出出选选修修了了全全部部课课程程的的学学生生的的学学号号和和姓姓名名(没没有有一一们可他不选)。们可

74、他不选)。 SELECT S#SELECT S#,SNAMESNAME FROM S FROM S WHERE NOT EXISTS WHERE NOT EXISTS (SELECT * (SELECT * FROM C FROM C WHERE NOT EXISTS WHERE NOT EXISTS (SELECT * (SELECT * FROM SC FROM SC WHERE SC.S# = S.S# AND WHERE SC.S# = S.S# AND SC.C# = C.C#) SC.C# = C.C#);第三章 关系数据库语言SQL 第三章第三次课第三章第三次课第三章 关系数据库

75、语言SQL3.3.1 3.3.1 视图的概念视图的概念 视视图图是是由由数数据据库库中中满满足足一一定定条条件件约约束束的的数数据据组组成成的的“虚虚表表”,它它可可以以由由某某个个表表中中满满足足一一定定条条件件的的行行组组成成,也也可可以以由由某某个个(或或某某些些)表表的的某某些些列列组组成成,还还可可以以由由若干个表经过一定的运算而形成。若干个表经过一定的运算而形成。 第三章 关系数据库语言SQL图图3.1 3.1 视图与基本表的映射关系视图与基本表的映射关系视图视图3 3视图视图4 4视图视图1 1视图视图2 2表表1 1表表2 2表表3 3表表4 4第三章 关系数据库语言SQL3

76、3 视图的定义视图的定义 视图的定义语句格式为:视图的定义语句格式为: CREATE VIEW CREATE VIEW ( () AS SELECT AS WITH READ ONLY | WITH CHECK OPTION WITH READ ONLY | WITH CHECK OPTION;其其中中,当当选选择择WITH WITH READ READ ONLYONLY可可选选项项时时,表表示示该该视视图图被被定定义义成成一一个个只只读读,不不能能进进行行插插入入、删删除除和和修修改改操操作作。当当选选择择WITH WITH CHECK CHECK OPTIONOPTION可可选选项项时时,

77、用用户户必必须须保保证证每每当当向向该该视视图图中中插插入入或或更更新新数数据据时时,所所插插入入或或更更新新的的数数据据能能够够从从该该视图查询出来。视图查询出来。 第三章 关系数据库语言SQL例例3.49 3.49 教学安排视图:教学安排视图: TA(C# TA(C#,CNAMECNAME,CLASSHCLASSH,TNAMETNAME,TRSECTIONTRSECTION)的创建语句为:的创建语句为: CREATE VIEW TACREATE VIEW TA AS SELECT C# AS SELECT C#,CNAMECNAME,CLASSHCLASSH,TNAMETNAME,TRSE

78、CTIONTRSECTION FROM C FROM C,TEACHTEACH,T T WHERE C.C#=TEACH.C# AND TEACH.T#=T.T# WHERE C.C#=TEACH.C# AND TEACH.T#=T.T#;其其中中,只只有有视视图图名名TATA,没没有有 选选项项说说明明视视图图TATA的列名表与的列名表与SELECTSELECT语句中的列名表相同。语句中的列名表相同。第三章 关系数据库语言SQL例例(续)(续)平均成绩视图平均成绩视图A_GRADE(S#A_GRADE(S#,SNAMESNAME,AVG_GRADE) AVG_GRADE) 的创建语句为:的创

79、建语句为: CREATE VIEW A_GRADE CREATE VIEW A_GRADE(S#S#,SNAMESNAME,AVG_GRADEAVG_GRADE) AS SELECT S.S# AS SELECT S.S#,SNAMESNAME,AVG(GRADE)AVG(GRADE) FROM S FROM S,SCSC WHERE S.S# = SC.S# AND GRADE IS NOT NULL WHERE S.S# = SC.S# AND GRADE IS NOT NULL; GROUP BY S.S# GROUP BY S.S# ORDER BY S.S# ORDER BY S.S

80、#; 第三章 关系数据库语言SQL3 3 在视图上进行查询操作在视图上进行查询操作 例例3.50 3.50 利用视图利用视图A_GRADEA_GRADE查询学生所学课程的平均成绩。查询学生所学课程的平均成绩。 SELECT * SELECT * FROM A_GRADE FROM A_GRADE; 如如果果用用查查询询语语句句实实现现查查询询学学生生所所学学课课程程的的平平均均成成绩绩,其其查询语句应为:查询语句应为: SELECT S.S# SELECT S.S#,SNAMESNAME,AVG(GRADE)AVG(GRADE) FROM S FROM S,SCSC WHERE S.S# =

81、SC.S# AND GRADE IS NOT NULL WHERE S.S# = SC.S# AND GRADE IS NOT NULL; GROUP BY S.S# GROUP BY S.S# ORDER BY S.S# ORDER BY S.S#; 第三章 关系数据库语言SQL3 3 在视图上进行数据更新在视图上进行数据更新 在在视视图图上上进进行行数数据据更更新新操操作作(INSERT(INSERT、DELETEDELETE、UPDATE)UPDATE)时时应注意以下几点:应注意以下几点: (1 1)如如果果某某视视图图是是建建立立在在多多个个表表的的基基础础上上,那那么么不不允允许许对

82、该视图进行更新操作。对该视图进行更新操作。 (2 2)如如果果在在某某视视图图的的定定义义中中使使用用了了GROUP GROUP BYBY子子句句和和聚聚合合函数,那么不允许对该视图进行更新操作。函数,那么不允许对该视图进行更新操作。 (3 3)如如果果视视图图是是建建立立在在单单个个表表的的基基础础上上,且且视视图图的的属属性性列列个个数数与与表表的的属属性性列列个个数数相相同同,或或少少于于表表的的属属性性列列个个数数时时,且且所所少少的的列列是是表表中中可可为为空空值值(NULL)(NULL)的的列列,则则可可在在该该视视图图上上进行更新操作。进行更新操作。 第三章 关系数据库语言SQL

83、3.3.6 3.3.6 用户视图对数据库设计和系统性能带来的影响用户视图对数据库设计和系统性能带来的影响 (1 1)用用户户视视图图给给数数据据库库应应用用系系统统的的设设计计提提供供了了极极大大的优越性的优越性 用用户户视视图图的的建建立立,会会使使在在应应用用程程序序中中用用到到并并反反复复出出现现的的含含有有复复杂杂关关系系联联接接和和投投影影的的查查询询语语句句被被简简单单的的视视图图查查询询语语句句所所代代替替。这这样样不不仅仅简简化化了了用用户户接接口口,使使应应用用程程序序中中的的SQLSQL语语句句变变得得简简单单明明了了,清清晰晰可可读读;而而且且可可以以使使应应用用程程序序

84、员员把把编编写写应应用用程程序序的的主主要要精精力力集集中中在在对对数数据据的的处处理理、分分析析和和用用户界面的实现上,方便应用程序的设计。户界面的实现上,方便应用程序的设计。 第三章 关系数据库语言SQL3.3.6 3.3.6 用户视图对数据库设计和系统性能带来的影响用户视图对数据库设计和系统性能带来的影响 (2 2)实现了数据库的逻辑数据独立性)实现了数据库的逻辑数据独立性 由由于于不不同同的的用用户户具具有有不不同同用用户户视视图图,这这样样就就使使一一个个用用户户视视图图的的变变化化不不会会影影响响另另一一些些用用户户视视图图。当当数数据据库库的的逻逻辑辑结结构构(概概念念模模型型)

85、或或存存储储结结构构(存存储储模模型型)发发生生变变化化时时,并并且且这这些些变变化化与与某某一一或或某某些些用用户户的的视视图图无无关关时时,就就不不必必改改变变该该用用户户的的应应用用程程序序;当当这这些些变变化化与与某某一一或或某某些些用用户户的的视视图图有有关关时时,可可通通过过改改变变基基本本表表到到用用户户视视图图之之间间的的映映射射关关系系,也也即即通通过过重重新新定定义义用用户户视视图图而而使使用用户户视视图图保保持持不不变变或或稍稍有有变变化化,从从而而不不必必修修改改应应用用程程序序或或少少量修改应用程序。这样就实现了数据库的逻辑数据独立性。量修改应用程序。这样就实现了数据

86、库的逻辑数据独立性。 第三章 关系数据库语言SQL3.3.6 3.3.6 用户视图对数据库设计和系统性能带来的影响用户视图对数据库设计和系统性能带来的影响 (3 3)可起到了对数据库中数据进行安全保护的作用可起到了对数据库中数据进行安全保护的作用 由由于于不不同同用用户户具具有有不不同同的的用用户户视视图图,这这样样就就使使得得在在各各个个用用户户视视图图中中只只出出现现他他自自己己关关心心的的那那部部分分数数据据,其其它它数数据据对对他他来来说说是是不不能能使使用用的的。而而且且系系统统给给用用户户使使用用的的是是视视图图而而不不是是在在数数据据库库中中存存储储有有数数据据的的表表。这这样样

87、就就起起到到了了对对数数据据库库中中数据进行安全保护的作用。数据进行安全保护的作用。 第三章 关系数据库语言SQL3.4.1 3.4.1 数据插入操作(数据插入操作(数据的导入数据的导入) 把把从从某某个个或或某某些些表表中中查查询询出出的的数数据据插插入入到到另另一一个个表表中中去去。语句格式为:语句格式为: INSERT INTO INSERT INTO ( ) ) ; 其中,其中, 是一个合法的是一个合法的SELECTSELECT查询语句查询语句 。第三章 关系数据库语言SQL例例3.51 3.51 设设在在教教学学管管理理数数据据库库系系统统中中,要要建建立立某某些些临临时时表表来来辅

88、辅助助有有关关管管理理过过程程。若若其其中中有有一一个个临临时时表表用用于于暂暂存存选选修修了了“信信息息安安全全技技术术”课课程程的的学学生生的的学学号号、姓姓名名、专业名称和班级,表的其格式为:专业名称和班级,表的其格式为: S_C S_C(S#S#,SNAMESNAME,SSNAMESSNAME,CLASSCLASS)第三章 关系数据库语言SQL例例(续续)则则将将从从有有关关表表中中查查询询出出的的有有关关数数据据组组成成的的记记录录插插入该表的插入语句为:入该表的插入语句为: INSERT INTO S_C(S# INSERT INTO S_C(S#,SNAMESNAME,SSNAM

89、ESSNAME,CLASS)CLASS) SELECT S.S# SELECT S.S#,SNAMESNAME,SSNAMESSNAME,CLASSCLASS FROM S FROM S,SSSS WHERE SS.SCODE# = S.SCODE AND S# IN WHERE SS.SCODE# = S.SCODE AND S# IN (SELECT S# (SELECT S# FROM SC FROM SC WHERE C# IN WHERE C# IN (SELECT C# (SELECT C# FROM C FROM C WHERE CNAME = WHERE CNAME =信息安全

90、技术信息安全技术); 第三章 关系数据库语言SQL例例3.52 3.52 设设在在教教学学管管理理数数据据库库系系统统中中,有有一一个个临临时时表表用用于于暂暂存存平平均均成成绩绩大大于于等等于于8080分分的的女女同同学学的的学学号号和和平平均均成成绩绩。临临时表的格式为:时表的格式为: S_AVG(S#,AVG_GRADE) S_AVG(S#,AVG_GRADE)则则将将从从有有关关表表中中查查询询出出的的有有关关数数据据组组成成的的记记录录插插入入该该表表的的插入语句为:插入语句为: INSERT INTO S_AVG(S#,AVG_GRAGE) INSERT INTO S_AVG(S#

91、,AVG_GRAGE) SELECT S#,AVG(GRADE) SELECT S#,AVG(GRADE) FROM SC FROM SC WHERE S# IN (SELECT S# WHERE S# IN (SELECT S# FROM S FROM S WHERE SSEX = WHERE SSEX =女女) GROUP BY S# GROUP BY S# HAVING AVG(GRADE) = 80 HAVING AVG(GRADE) = 80;第三章 关系数据库语言SQL3.4.2 3.4.2 数据更新操作数据更新操作 用子查询表示条件的数据更新操作。语句格式为:用子查询表示条件的数

92、据更新操作。语句格式为: UPDATE UPDATE SET SET 1 1, 2 , 2, n n WHERE WHERE ; 其中,其中,WHEREWHERE条件中包含有条件中包含有SELECTSELECT查询子句查询子句 。第三章 关系数据库语言SQL例例3.53 3.53 为为了了加加强强对对高高水水平平尖尖子子人人才才的的重重点点培培养养,学学校校拟拟将将计计算算机机应应用用技技术术专专业业( (专专业业代代码码为为:S0401)S0401)中中,各各门门课课程程均均在在8585分分以以上上的的学学生生单单独独编编为为200400200400班班,所所以以需需要要修修改改学学生基本情

93、况数据库中的生基本情况数据库中的“班级班级”属性。其实现语句为:属性。其实现语句为: UPDATE S UPDATE S SET CLASS =200400 SET CLASS =200400 WHERE SCODE =S0401AND S# IN WHERE SCODE =S0401AND S# IN (SELECT S# (SELECT S# FROM SC FROM SC WHERE GRADE 85) WHERE GRADE 85); 第三章 关系数据库语言SQL例例3.54 3.54 由由于于试试题题难难度度原原因因,需需要要将将“计计算算机机网网络络”课课的成绩提高的成绩提高5%5

94、%。其实现语句为:。其实现语句为: UPDATE SC UPDATE SC WHERE C# IN WHERE C# IN (SELECT C# (SELECT C# FROM C FROM C WHERE CNAME = WHERE CNAME =计算机网络计算机网络); 第三章 关系数据库语言SQL3.5.1 3.5.1 嵌入式嵌入式SQLSQL的概念的概念 交交互互式式SQL SQL :是是非非过过程程语语言言,大大多多数数语语句句的的执执行行都都是是独独立立的的,与与上上下下文文无无关关的的;无无法法满满足足绝绝大大多多数数应应用用所所需需的的过过程性要求。程性要求。 嵌嵌入入式式SQ

95、LSQL:引引入入过过程程性性结结构构和和把把SQLSQL语语言言嵌嵌入入到到C C、PASCALPASCAL等高级语言的机制。等高级语言的机制。 宿主语言:宿主语言:在在SQLSQL嵌入形式中用到高级语言。嵌入形式中用到高级语言。 应应用用程程序序:含含有有嵌嵌入入SQLSQL语语句句的的高高级级语语言言应应用用程程序序称称为为宿宿主应用程序,简称为宿主程序或应用程序。主应用程序,简称为宿主程序或应用程序。 第三章 关系数据库语言SQL3.5.2 3.5.2 嵌入式嵌入式SQLSQL遇到的问题遇到的问题 (1 1)当当SQLSQL语语言言语语句句嵌嵌入入到到C C语语言言后后,宿宿主主程程序

96、序中中就就包包含含了了不不属属于于高高级级语语言言的的一一部部分分成成份份。换换句句话话说说,宿宿主主程程序序不不再再是是普普通通的的高高级级语语言言源源程程序序了了,显显然然也也不不能能用用通通常常的的编编译译、连连接接方方式式对对其其进进行行处处理理。如如何何实实现现宿宿主程序的编译是要解决的问题之一。主程序的编译是要解决的问题之一。 第三章 关系数据库语言SQL3.5.2 3.5.2 嵌入式嵌入式SQLSQL遇到的问题遇到的问题 (2 2)SQLSQL语语言言是是非非过过程程性性语语言言,大大多多数数SQLSQL语语句句的的执执行行是是独独立立的的,与与上上下下文文无无关关的的。而而C

97、C语语言言是是过过程程性性语语言言,程程序序的的执执行行机机制制是是顺顺序序、分分支支和和循循环环,当当前前语语句句的的执执行行与与前前面面语语句句的的执执行行结结果果有有关关,各各语语句句的的执执行行是是上上下下文文有有关关的的。那那么么,当当把把SQLSQL语语句句嵌嵌入入到到C C语语言言后后,如如何何来确定来确定SQLSQL语句的执行顺序是要解决的问题之一。语句的执行顺序是要解决的问题之一。 第三章 关系数据库语言SQL3.5.2 3.5.2 嵌入式嵌入式SQLSQL遇到的问题遇到的问题 (3 3)SQLSQL语语言言语语句句中中的的属属性性名名是是表表示示关关系系的的属属性性及及其其

98、当当前前值值的的集集合合型型“参参变变量量”。而而C C语语言言语语句句中中的的变变量量既既有有单单值值变变量量,又又有有数数组组变变量量。如如何何建建立立两两种种语语言言变变量之间联系是要解决的问题之一。量之间联系是要解决的问题之一。 (4 4)SQLSQL语语句句是是面面向向集集合合的的,一一次次查查询询的的结结果果往往往往有有许许多多行行。而而C C语语言言的的数数据据处处理理方方式式原原则则上上是是一一次次处处理理一一个个记记录录的的顺顺序序方方式式。如如何何使使它它们们在在对对数数据据的的保保持持和和处理上相一致是要解决的问题之一。处理上相一致是要解决的问题之一。 第三章 关系数据库

99、语言SQL3.5.3 3.5.3 嵌入式嵌入式SQLSQL的实现的实现 两种实现途径:两种实现途径: (1 1)建立全新的编译程序,使之可直接编译建立全新的编译程序,使之可直接编译SQLSQL语句;语句; (2 2)采采用用预预处处理理方方式式,把把宿宿主主程程序序中中的的SQLSQL语语句句转转换换成成可为高级语言调用的函数形式:可为高级语言调用的函数形式: 后一种途径的实现需要:后一种途径的实现需要:后一种途径的实现需要:后一种途径的实现需要: 提供预编译器;提供预编译器; 提供实现所有提供实现所有SQLSQL语句的函数库。语句的函数库。 第三章 关系数据库语言SQL3.5.3 3.5.3

100、 嵌入式嵌入式SQLSQL的实现的实现 (续)(续) 基基于于预预处处理理方方式式的的数数据据库库应应用用程程序序从从编编写写到到执执行行的的过过程程为:为: (1 1)编写包含有嵌入式)编写包含有嵌入式SQLSQL语句的宿主语言应用程序;语句的宿主语言应用程序; (2 2)利利用用预预编编译译器器对对应应用用程程序序进进行行预预编编译译,产产生生含含有有高高级语言函数调用的级语言函数调用的“普通普通”高级语言源程序;高级语言源程序; (3 3)利利用用高高级级语语言言编编译译器器编编译译由由(2)(2)生生成成的的高高级级语语言言源源程序,生成相应的目标文件;程序,生成相应的目标文件; (4

101、 4)对对生生成成的的目目标标文文件件和和所所需需的的函函数数库库进进行行连连接接,生生成成可执行文件;可执行文件; (5 5)运行可执行文件形式的应用程序。)运行可执行文件形式的应用程序。 第三章 关系数据库语言SQL3.5.4 SQL3.5.4 SQL语句的嵌入形式语句的嵌入形式 第三章 关系数据库语言SQL3.5.5 3.5.5 宿主程序的组成与结构宿主程序的组成与结构 预预编编译译单单元元:在在嵌嵌入入式式SQLSQL中中,将将宿宿主主应应用用程程序序中中的的一个源程序文件称为一个预编译单元。一个源程序文件称为一个预编译单元。 宿宿主主程程序序的的组组成成:具具有有与与C C语语言言一

102、一样样的的组组成成结结构构 ,一一个个宿宿主主应应用用程程序序可可以以分分成成若若干干个个源源程程序序文文件件,每每个个源源程程序序文文件件可可以以是是一一个个独独立立的的预预编编译译单单元元,可可以以将将这这些些经经过过独独立立预预编编译译的的程程序序再再分分别别独独立立编编译译,并并生生成成各各自自的的目目标标文件,最后将这些目标文件连接成一个完整的执行文件。文件,最后将这些目标文件连接成一个完整的执行文件。 第三章 关系数据库语言SQL3.5.5 3.5.5 宿主程序的组成与结构宿主程序的组成与结构 预编译单元的组成结构:预编译单元的组成结构: (1 1)说明部分()说明部分(DECLA

103、REDECLARE部分)部分) (2 2)通信区定义部分)通信区定义部分 (3 3)系统连接部分)系统连接部分 (4 4)程序体)程序体程序首部程序体第三章 关系数据库语言SQL 1. 1. 说明部分(说明部分(DECLAREDECLARE部分)部分) (1 1)主语言变量、宿主变量、宿主变量的使用规则:)主语言变量、宿主变量、宿主变量的使用规则: 主语言变量:主语言变量: 宿主变量:宿主变量:在在SQLSQL语句中使用的主语言的变量称为宿主变量。语句中使用的主语言的变量称为宿主变量。 第三章 关系数据库语言SQL例例3.55 3.55 根根据据由由宿宿主主变变量量S1S1给给出出的的学学生生

104、学学号号,查查询询、学生的姓名、性别和出生年月。学生的姓名、性别和出生年月。 EXEC SQLEXEC SQL SELECT SNAME SELECT SNAME,SSEXSSEX,SBIRTHINSBIRTHIN FROM S FROM S INTO :SNAME1INTO :SNAME1,:SSEX1:SSEX1,:SBIRTH:SBIRTH WHERE S# = :S1 WHERE S# = :S1; 由本例说明:由本例说明:宿主变量是主语言和宿主变量是主语言和SQLSQL语句都可以语句都可以对其赋值和引用其值的变量。对其赋值和引用其值的变量。 第三章 关系数据库语言SQL 宿主变量的使

105、用规则:宿主变量的使用规则: 宿主变量必须在宿主变量必须在DECLAREDECLARE部分定义。部分定义。 在在SQLSQL语语句句中中使使用用宿宿主主变变量量时时,必必须须在在仅仅接接宿宿主主变变量量的的前前面面写写一一个个冒冒号号“:”;在在纯纯C C语语言言语语句句中中使使用用宿主变量时,与非宿主变量一样不加任何标记。宿主变量时,与非宿主变量一样不加任何标记。 宿主变量不能是宿主变量不能是SQLSQL语言中的保留字。语言中的保留字。 一个宿主变量在一条一个宿主变量在一条SQLSQL语句中只能使用一次。语句中只能使用一次。 宿主变量可以带指示变量。宿主变量可以带指示变量。 第三章 关系数据

106、库语言SQL 1. 1. 说明部分(说明部分(DECLAREDECLARE部分)部分) (续)(续) (2 2)指示变量)指示变量 是是一一个个用用来来指指示示所所指指宿宿主主变变量量的的值值或或条条件件的的整整型型变变量。量。 宿主变量利用指示变量赋空值或检测是否是空值。宿主变量利用指示变量赋空值或检测是否是空值。 第三章 关系数据库语言SQL 指示变量的使用规则为:指示变量的使用规则为: 指示变量必须在指示变量必须在DECLAREDECLARE部分定义。部分定义。 在在SQLSQL语语句句中中使使用用指指示示变变量量时时,必必须须在在仅仅接接指指示示变变量量的的前前面面写写一一个个冒冒号号

107、“:”;在在纯纯C C语语言言语语句句(也也即即,主语言)中使用指示变量时,不用加任何标记。主语言)中使用指示变量时,不用加任何标记。 指示变量不能是指示变量不能是SQLSQL语言中的保留字。语言中的保留字。 指指示示变变量量必必须须定定义义成成2 2字字节节的的整整型型变变量量,如如shortshort,intint类型。类型。 在在SQLSQL语语句句中中,指指示示变变量量必必须须紧紧跟跟在在所所指指宿宿主主变变量之后,中间不能有逗号或空格。量之后,中间不能有逗号或空格。 第三章 关系数据库语言SQL例例3.56 3.56 宿主变量带有指示变量的例子。宿主变量带有指示变量的例子。 根根据据

108、由由宿宿主主变变量量S1S1给给出出的的学学号号查查询询学学生生姓姓名名、性性别和出生年月。别和出生年月。 EXEC SQLEXEC SQL SELECT SNAME SELECT SNAME,SSEXSSEX,SBIRTHINSBIRTHIN FROM S FROM S INTO INTO :SNAME1:SNAME1: :SNAME2SNAME2,:SSEX1:SSEX1:SSEX2:SSEX2, :SBIRTH:SBIRTH:SBIRTH2:SBIRTH2 WHERE S# = :S1 WHERE S# = :S1; 第三章 关系数据库语言SQL 1. 1. 说明部分(说明部分(DECL

109、AREDECLARE部分)部分) (续)(续) (3 3)DECLAREDECLARE的格式的格式 用用DECLAREDECLARE定义宿主变量和指示变量的描述格式为定义宿主变量和指示变量的描述格式为: EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION; 第三章 关系数据库语言SQL 1. 1. 说明部分(说明部分(DECLAREDECLARE部分)部分) (续)(续) (4 4)作为宿主变量的指针)作为

110、宿主变量的指针 和和C C语语言言一一样样,宿宿主主变变量量的的指指针针是是由由星星号号“*”“*”和和变变量名来说明的。比如:量名来说明的。比如: EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; int GRADE1 int GRADE1,GRADE2GRADE2,*intptr*intptr; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION;但但在在SQLSQL语语句句中中,指指针针变变量量前前不不写写星星号号(星星号号是是隐隐含含的的),而要在

111、变量名前加一个冒号,而要在变量名前加一个冒号“:”。比如:。比如: SELECT INT_PTR INTO :intptr FROM SELECT INT_PTR INTO :intptr FROM 第三章 关系数据库语言SQL 1. 1. 说明部分(说明部分(DECLAREDECLARE部分)部分) (续)(续) (5 5)VARCHARVARCHAR伪类型伪类型 VARCHARVARCHAR伪伪类类型型用用于于说说明明称称为为伪伪类类型型变变量量的的变变长长字字符符串。串。 伪伪类类型型变变量量在在DECLAREDECLARE部部分分说说明明后后,就就可可以以在在宿宿主主程程序中被引用了。

112、序中被引用了。 第三章 关系数据库语言SQL比如:比如: EXEC SQL BEGIN DECLARE SECTIONEXEC SQL BEGIN DECLARE SECTION; VARCHAR uid20 VARCHAR uid20; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION;相当于定义了一个结构体变量:相当于定义了一个结构体变量: struct struct unsigned int len unsigned int len; unsigned char arr20 unsigned char arr20; uid

113、; uid; 在在C C语言中对该结构体变量的引用方式为:语言中对该结构体变量的引用方式为: 是是无无符符号号整整数数类类型型,用用于于表表示示(存存放放)伪伪类类型型变变量量定定义的字符串的长度。义的字符串的长度。 用于表示(存放)伪类型变量定义的字符串。用于表示(存放)伪类型变量定义的字符串。第三章 关系数据库语言SQL例例3.57 3.57 给出例的语句中的主变量说明。给出例的语句中的主变量说明。 EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; VARCHAR SNAME110 VARCHAR SNAME110

114、,SSEX12SSEX12,S19S19; date SBIRTH date SBIRTH; int SNAME2 int SNAME2,SSEX2SSEX2,SBIRTH2SBIRTH2; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION; (以上是例的正确形式,注意改错!)(以上是例的正确形式,注意改错!) 第三章 关系数据库语言SQL 2. SQL 2. SQL通信区及其定义通信区及其定义 (1 1)问题的提出)问题的提出 在在基基于于预预处处理理的的宿宿主主语语言言中中,宿宿主主程程序序中中的的一一条条SQLSQL语语句

115、句的的执执行行实实质质上上是是执执行行一一次次函函数数调调用用,通通过过相相应应的的函函数数调调用用实实现现该该SQLSQL语语句句的的功功能能。函函数数在在执执行行过过程程中中可可能能出出现现各各种种情情况况,所所以以就就引引入入了了SQLSQL通通信信区区SQLCA SQLCA ,利利用用SQLSQL通通信信区区来来返返回回函函数数调调用用的的执执行行状状态态信信息息,在在返返回回后后根根据据返返回回信信息息,决决定定下下一一步步的的执执行行流流程程或或对对错错误误的的处理。处理。 第三章 关系数据库语言SQL 2. SQL 2. SQL通信区及其定义通信区及其定义 (2 2)SQLSQL

116、通信区的定义通信区的定义 在宿主程序的相应部分用加上语句:在宿主程序的相应部分用加上语句: EXEC SQL INCLUDE SQLCA EXEC SQL INCLUDE SQLCA; 第三章 关系数据库语言SQL 2. SQL 2. SQL通信区及其定义通信区及其定义 (3 3)SQLCASQLCA返回的信息类别返回的信息类别 任务完成,一切正常;任务完成,一切正常; 任务完成,但有例外,也即有警告信息;任务完成,但有例外,也即有警告信息; 有某种错误,任务没有完成。有某种错误,任务没有完成。 第三章 关系数据库语言SQL 2. SQL 2. SQL通信区及其定义通信区及其定义 (4 4)对

117、)对SQLCASQLCA返回信息的判别方式返回信息的判别方式 WHENEVERWHENEVER语句:语句: WHENEVERWHENEVER语句格式:语句格式: EXEC SQL WHENEVER SQLERROR|SQLWARINGEXEC SQL WHENEVER SQLERROR|SQLWARING |NOT FOUND |NOT FOUND STOP|CONTINUE|GOTO STOP|CONTINUE|GOTO ; 第三章 关系数据库语言SQL 3. 3. 系统连接(数据库登录)系统连接(数据库登录) CONNECT CONNECT语句:语句: CONNECT CONNECT语句格

118、式:语句格式: EXEC SQL CONNECTEXEC SQL CONNECT: IDENTIFIED BY IDENTIFIED BY: ;或或 EXEC SQL CONNECTEXEC SQL CONNECT: / ; 第三章 关系数据库语言SQL 4. 4. 程序体程序体 在在程程序序首首部部(DECLAREDECLARE部部分分、SQLSQL通通信信区区、系系统统连连接接部分)之后,就是程序体。部分)之后,就是程序体。 程程序序体体是是主主语语言言语语句句和和由由“EXEC “EXEC SQL”SQL”为为开开始始标标识识的的SQLSQL语句(语句(DDLDDL语句、语句、DMLDM

119、L语句、语句、DCLDCL语句)组成。语句)组成。第三章 关系数据库语言SQL例例3.58 3.58 宿主应用程序系统连接(注册登录)示例。宿主应用程序系统连接(注册登录)示例。 #include#include #include #include EXEC SQLEXEC SQLEXEC SQLEXEC SQL BEGIN DECLARE SECTION BEGIN DECLARE SECTION; /*/*说明说明SQLSQL变量变量*/*/ VARCHAR uid10 VARCHAR uid10; /* uid/* uid中存放用户名中存放用户名 */ */ VARCHAR pwd8 V

120、ARCHAR pwd8; /* pwd/* pwd中存放口令中存放口令 */ */ EXEC SQLEXEC SQLEXEC SQLEXEC SQL END DECLARE SECTION END DECLARE SECTION; EXEC SQLEXEC SQLEXEC SQLEXEC SQL INCLUDE SQLCA INCLUDE SQLCA; /* /* 说明说明SQLSQL通信区通信区 */ */ Main() Main() strcpy(uid.arr,”scott”) strcpy(uid.arr,”scott”); /*/*初始化用户名初始化用户名:scott*/:scott

121、*/ = ) = ) /*/*初始化初始化uiduid的长度值的长度值*/*/ strcpy(pwd.arr,”tigger”) strcpy(pwd.arr,”tigger”); /*/*初始化口令初始化口令:tigger*/:tigger*/ = ) = ); /*/*初始化初始化pwdpwd的长度值的长度值*/*/ EXEC SQLEXEC SQLEXEC SQLEXEC SQL CONNECT :uid IDENTIFIED BY :pwd CONNECT :uid IDENTIFIED BY :pwd; /* /* 注册登录数据库注册登录数据库 */ */ Printf(“Succe

122、ssfully connected to SQLn”) Printf(“Successfully connected to SQLn”); EXEC SQLEXEC SQLEXEC SQLEXEC SQL COMMIT WORK RELEASE; COMMIT WORK RELEASE; /*/*提交并释放数据库提交并释放数据库*/*/ exit(0) exit(0); 第三章 关系数据库语言SQL3.5.6 3.5.6 数据更新及其嵌入式数据更新及其嵌入式SQLSQL应用程序设计应用程序设计 (1 1)数据的插入)数据的插入 例例:向向数数据据库库中中已已存存在在的的课课程程关关系系表表中中

123、插插入入一一个个记记录的应用程序。录的应用程序。 第三章 关系数据库语言SQL#include#include#include#includeEXEC SQLEXEC SQLEXEC SQLEXEC SQL BEGIN DECLARE SECTION BEGIN DECLARE SECTION; /* /* 说明说明SQLSQL变量变量 */ */ VARCHAR uid10 VARCHAR uid10; /* uid /* uid中存放用户名中存放用户名 */ */ VARCHAR pwd8 VARCHAR pwd8; /* pwd /* pwd中存放口令中存放口令 */ */ VARCHA

124、R cnum7 VARCHAR cnum7; /* /*定义课程号定义课程号CNUMCNUM为伪类型为伪类型*/*/ VARCHAR cname30 VARCHAR cname30; /* /*定义课程名定义课程名CNAMECNAME为伪类型为伪类型*/*/ int classh int classh; /* /*定义学时数定义学时数CLASSH CLASSH 为整型数为整型数*/*/EXEC SQLEXEC SQLEXEC SQLEXEC SQL END DECLARE SECTION END DECLARE SECTION;EXEC SQLEXEC SQLEXEC SQLEXEC SQL

125、INCLUDE SQLCA INCLUDE SQLCA; /* /* 说明说明SQLSQL通信区通信区 */ */Main()Main()第三章 关系数据库语言SQLMain()Main() ,”scott”)”scott”); /* /* 初始化用户名:初始化用户名:scott */scott */ = ) = ); /* /* 初始化初始化uiduid的长度值的长度值 */ */ ,”tigger”)”tigger”); /* /* 初始化口令:初始化口令:tigger */tigger */ = ) = ); /* /* 初始化初始化pwdpwd的长度值的长度值 */ */ EXEC S

126、QLEXEC SQLEXEC SQLEXEC SQL CONNECT :uid IDENTIFIED BY :pwd CONNECT :uid IDENTIFIED BY :pwd; /* /* 注册登录数据库注册登录数据库 */ */ printf(“ printf(“用户用户%s%s已成功地连接到数据库!已成功地连接到数据库!n”n”,) ); While(1) While(1) prinft(“nn prinft(“nn输入课程号:输入课程号: ”) ”); scanf(”%s” scanf(”%s”,&cnum)&cnum); =) =); /* /*设置课程号设置课程号CNUMCNU

127、M的长度的长度*/*/ prinft(“nn prinft(“nn输入课程名称:输入课程名称: ”) ”);第三章 关系数据库语言SQL scanf(”%s” scanf(”%s”,&cname)&cname); =) =);/*/*设置课程名设置课程名CNAMECNAME的长度的长度*/*/ prinft(“nn prinft(“nn输入课程的学时数:输入课程的学时数: ”) ”); scanf(”%d” scanf(”%d”,&classh)&classh); EXEC SQLEXEC SQLEXEC SQLEXEC SQL INSERT INTO C(C# INSERT INTO C(C

128、#,CNAMECNAME,CLASSH)CLASSH) VALUES(:cnum VALUES(:cnum,:cname:cname,:classh):classh); EXEC SQL COMMIT WORK EXEC SQL COMMIT WORK; /* /* 提交输入的记录提交输入的记录 */ */ printf(“ printf(“课程课程%s %s 已经被插入。已经被插入。nn”nn”,) ); EXEC SQLEXEC SQLEXEC SQLEXEC SQL COMMIT WORK RELEASE COMMIT WORK RELEASE; /* /* 退出数据库退出数据库 */

129、*/ exit() exit(); 第三章 关系数据库语言SQL3.5.6 3.5.6 数据更新及其嵌入式数据更新及其嵌入式SQLSQL应用程序设计应用程序设计 (2 2)数据删除)数据删除 例例:从从数数据据库库中中已已存存在在的的学学生生关关系系表表中中删删除除一一行行记记录的应用程序。录的应用程序。 第三章 关系数据库语言SQL#include#includeEXEC SQLEXEC SQLEXEC SQLEXEC SQL BEGIN DECLARE SECTION BEGIN DECLARE SECTION; /* /* 说明说明SQLSQL变量变量 */ */ VARCHAR uid

130、10 VARCHAR uid10; /* uid /* uid中存放用户名中存放用户名 */ */ VARCHAR pwd8 VARCHAR pwd8; /* pwd /* pwd中存放口令中存放口令 */ */ VARCHAR snum9 VARCHAR snum9; /* /*定义学号定义学号SNUMSNUM为伪类型为伪类型*/*/EXEC SQLEXEC SQLEXEC SQLEXEC SQL END DECLARE SECTION END DECLARE SECTION;EXEC SQLEXEC SQLEXEC SQLEXEC SQL INCLUDE SQLCA INCLUDE SQL

131、CA; /* /* 说明说明SQLSQL通信区通信区 */ */Main()Main() ,”scott”)”scott”); /* /*初始化用户名:初始化用户名:scott*/scott*/ = ) = ); /* /* 初始化初始化uiduid的长度值的长度值 */ */ ,”tigger”)”tigger”); /* /*初始化口令:初始化口令:tigger*/tigger*/ = ) = ); /* /*初始化初始化pwdpwd的长度值的长度值*/*/ EXEC SQLEXEC SQLEXEC SQLEXEC SQL WHENEVER SQLERROR STOP WHENEVER S

132、QLERROR STOP;第三章 关系数据库语言SQL EXEC SQLEXEC SQLEXEC SQLEXEC SQL CONNECT :uid IDENTIFIED BY :pwd CONNECT :uid IDENTIFIED BY :pwd; /* /* 注册登录数据库注册登录数据库 */ */ printf(“ printf(“用户用户%s%s已成功地连接到数据库!已成功地连接到数据库!n”n”,) ); printf(“nn printf(“nn请输入删除学生基本信息记录的学号:请输入删除学生基本信息记录的学号: ”) ”); scanf(”%s” scanf(”%s”,&snum

133、)&snum); EXEC SQLEXEC SQLEXEC SQLEXEC SQL DELETE FROM S WHERE S# = :snum DELETE FROM S WHERE S# = :snum; EXEC SQLEXEC SQLEXEC SQLEXEC SQL COMMIT WORK RELEASE COMMIT WORK RELEASE; /* /* 退出数据库退出数据库 */ */ printf(“nn printf(“nn学号为学号为%s%s的记录已经被删除。的记录已经被删除。n”n”,) ); exit() exit(); 第三章 关系数据库语言SQL3.5.6 3.5.

134、6 数据更新及其嵌入式数据更新及其嵌入式SQLSQL应用程序设计应用程序设计 (3 3)数据修改)数据修改 例例:由由于于试试题题难难度度原原因因,需需要要将将“计计算算机机网网络络”课课的的成成绩绩提提高高某某个个分分值值。设设提提高高的的分分值值预预先先放放在在共共享享变变量量markmark中中。用嵌入式用嵌入式SQLSQL写出修改语句。写出修改语句。 EXEC SQLEXEC SQL UPDATE SC UPDATE SC SET GRADE = GRADE + SET GRADE = GRADE + : :markmark WHERE C# IN WHERE C# IN (SELEC

135、T C# (SELECT C# FROM C FROM C WHERE CNAME = WHERE CNAME =计算机网络计算机网络);); 第三章 关系数据库语言SQL3.5.7 3.5.7 数据查询及其嵌入式数据查询及其嵌入式SQLSQL应用程序设计应用程序设计 1. 1. 查询结果没有记录或只有一行记录的查询查询结果没有记录或只有一行记录的查询 引引例例:嵌嵌入入式式SELECTSELECT语语句句的的不不同同之之处处是是,引引入入了了将将查询结果传递给有关输出宿主变量的查询结果传递给有关输出宿主变量的INTOINTO子句。如:子句。如: EXEC SQL SELECT SNAME E

136、XEC SQL SELECT SNAME,SSEXSSEX,SBIRTHINSBIRTHIN FROM S FROM S INTO :SNAME1 INTO :SNAME1,:SSEX1:SSEX1,:SBIRTH:SBIRTH WHERE S# = :S1 WHERE S# = :S1; 第三章 关系数据库语言SQL3.5.7 3.5.7 数据查询及其嵌入式数据查询及其嵌入式SQLSQL应用程序设计应用程序设计 1. 1. 查询结果没有记录或只有一行记录的查询查询结果没有记录或只有一行记录的查询 查查询询结结果果没没有有记记录录或或只只有有一一行行记记录录的的嵌嵌入入式式SELECTSELE

137、CT语语句的格式为:句的格式为: EXEC SQL SELECT EXEC SQL SELECT INTO INTO FROM FROM WHERE WHERE 其其中中:在在INTOINTO子子句句中中出出现现的的宿宿主主变变量量称称为为输输出出宿宿主主变变量量;在在WHEREWHERE子句中出现的宿主变量称为输入宿主变量。子句中出现的宿主变量称为输入宿主变量。第三章 关系数据库语言SQL 1. 1. 查询结果为多行记录的查询查询结果为多行记录的查询 问问题题的的提提出出:利利用用前前面面的的查查询询语语句句格格式式无无法法把把多多行行记记录一次传给录一次传给INTOINTO子句的宿主变量,

138、为此引入了游标。子句的宿主变量,为此引入了游标。 游游标标(cursor) (cursor) :是是一一个个与与某某一一SELECTSELECT语语句句相相联联系系的的符符号号名名。满满足足该该SELECTSELECT语语句句查查询询条条件件的的一一组组查查询询结结果果与与一一个工作区相联系,所以一个游标与一个工作区相对应。个工作区相联系,所以一个游标与一个工作区相对应。 第三章 关系数据库语言SQL 1. 1. 查询结果为多行记录的查询查询结果为多行记录的查询 (1 1)定义游标)定义游标(DECLARE CURSOR) (DECLARE CURSOR) 语句格式:语句格式: EXEC SQ

139、L DECLARE EXEC SQL DECLARE CURSOR FOR SELECT CURSOR FOR ; 第三章 关系数据库语言SQL例例3.62 3.62 从从学学习习关关系系表表中中,根根据据由由宿宿主主变变量量S1S1的的值值给给出出的的学学号号查查询询该该学学生生所所学学的的全全部部课课程程的的课课程程号号和和分分数数。写出定义游标语句写出定义游标语句: : EXEC SQL DECLARE CC1 CURSOR FOR EXEC SQL DECLARE CC1 CURSOR FOR SELECT C# SELECT C#,GRADEGRADE FROM SC FROM SC

140、 WHERE S# = :S1 WHERE S# = :S1;其中,其中,CC1CC1是新定义的游标的名称。是新定义的游标的名称。 第三章 关系数据库语言SQL 2. 2. 查询结果为多行记录的查询查询结果为多行记录的查询 (2 2)打开游标)打开游标(OPEN CURSOR) (OPEN CURSOR) 打打开开游游标标语语句句根根据据游游标标名名对对应应的的SELECTSELECT语语句句中中WHEREWHERE子子句句的的查查询询条条件件,标标识识出出那那些些满满足足查查询询条条件件的的行行( (记记录录) )的的集集合合(称称为为活活动动集集) ),并并建建立立起起该该活活动动集集与与

141、该该游游标标对对应应的的工工作作区的联系。区的联系。 活活动动集集中中当当前前等等待待被被处处理理的的行行称称为为当当前前行行。在在刚刚打打开开游游标时,当前行为第一行,此时游标指向当前行。标时,当前行为第一行,此时游标指向当前行。 语句格式:语句格式: EXEC SQL OPEN EXEC SQL OPEN ;第三章 关系数据库语言SQL 2. 2. 查询结果为多行记录的查询查询结果为多行记录的查询 (3 3)从活动集中读取数据)从活动集中读取数据(FETCH) (FETCH) 格式:格式: EXEC SQL FETCH EXEC SQL FETCH INTO INTO : : ,: ; F

142、ETCHFETCH语语句句首首先先从从活活动动集集中中读读出出当当前前行行的的数数据据,然然后后把把结结果果送送到到INTOINTO后后的的输输出出宿宿主主变变量量,接接着着使使游游标标指指向向活活动动集集的的新新的的当当前前行行,也也即即执执行行FETCHFETCH语语句句前前时时的的当当前前行行的的下下一一行行。FETCHFETCH语语句句通通常常置置于于宿宿主主程程序序中中的的循循环环结结构构之之中中,通通过过循循环环执执行行FETCHFETCH语语句句,就就可可以以逐逐一一地地把把活活动动集集中中的的行行取取到到宿宿主主变变量量中中,在在取取完完所所有有行行后后,根根据据WHENEVE

143、RWHENEVER语语句句的的检检测测条条件件,使程序从循环中跳出来。使程序从循环中跳出来。 第三章 关系数据库语言SQL 2. 2. 查询结果为多行记录的查询查询结果为多行记录的查询 (4 4)关闭游标)关闭游标(CLOSE CURSOR) (CLOSE CURSOR) 在在完完成成了了取取数数操操作作后后,就就应应该该关关闭闭游游标标,以以便便释释放放与与该该游标相关的资源。游标相关的资源。 关闭游标的语句格式为:关闭游标的语句格式为: EXEC SQL CLOSE EXEC SQL CLOSE ; 第三章 关系数据库语言SQL例例3.62 3.62 定义游标语句定义游标语句: : EXE

144、C SQL DECLARE CC1 CURSOR FOR EXEC SQL DECLARE CC1 CURSOR FOR SELECT C# SELECT C#,GRADEGRADE FROM SC FROM SC WHERE S# = :S1 WHERE S# = :S1;其中,其中,CC1CC1是新定义的游标的名称。是新定义的游标的名称。 例例3.63 3.63 打开游标语句。打开游标语句。 EXEC SQL OPEN CC1 EXEC SQL OPEN CC1; 例例3.64 3.64 从活动集中取数据。从活动集中取数据。 EXEC SQL FETCH CC1 INTO :CNUM EX

145、EC SQL FETCH CC1 INTO :CNUM,:GRADE1:GRADE1;例如:例如: 关闭游标:关闭游标: EXEC SQL CLOSE CC1EXEC SQL CLOSE CC1; 第三章 关系数据库语言SQL例例:利利用用游游标标编编写写,从从学学习习关关系系表表中中查查询询某某个个学学生生所所学学全全部部课课程程的的课课程号和分数。查询条件中的学号由宿主变量给出。程号和分数。查询条件中的学号由宿主变量给出。#include#includeEXEC SQL BEGIN DECLARE SECTIONEXEC SQL BEGIN DECLARE SECTION; /* /* 说

146、明说明SQLSQL变量变量 */ */ VARCHAR uid10 VARCHAR uid10; /* uid /* uid中存放用户名中存放用户名 */ */ VARCHAR pwd8 VARCHAR pwd8; /* pwd /* pwd中存放口令中存放口令 */ */ VARCHAR snum9 VARCHAR snum9; /* /* 定义学号定义学号SNUMSNUM为伪类型为伪类型 */ */ VARCHAR cnum7 VARCHAR cnum7; /* /* 定义课程号定义课程号CNUMCNUM为伪类型为伪类型 */ */ int grade int grade; /* /* 定

147、义分数定义分数GRADEGRADE为整型数为整型数 */ */EXEC SQL END DECLARE SECTIONEXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCAEXEC SQL INCLUDE SQLCA; /* /* 说明说明SQLSQL通信区通信区 */ */Main()Main() ,”scott”)”scott”); /* /* 初始化用户名:初始化用户名:scott */scott */ = ) = ); /* /* 初始化初始化uiduid的长度值的长度值 */ */第三章 关系数据库语言SQL ,”tigger”)”ti

148、gger”); /* /*初始化口令:初始化口令:tigger*/tigger*/ = ) = ); /* /*初始化初始化pwdpwd的长度值的长度值*/*/ EXEC SQL WHENEVER SQLERROR STOP EXEC SQL WHENEVER SQLERROR STOP; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; /* /* 注册登录数据库注册登录数据库 */ */ printf(“ printf(“用户用户%s%s已成功地连接到数据库!已成功地连接到数

149、据库!n”n”,) ); printf(“nn printf(“nn请输入学生的学号:请输入学生的学号: ”) ”); scanf(”%s” scanf(”%s”,&snum)&snum); EXEC SQL DECLARE CC1 CURSOR FOR EXEC SQL DECLARE CC1 CURSOR FOR SELECT C# SELECT C#,GRADEGRADE FROM SC FROM SC WHERE S# = :snum WHERE S# = :snum; EXEC SQL OPEN CC1 EXEC SQL OPEN CC1; EXEC SQL WHENEVER NOT

150、 FOUND GOTO outloop EXEC SQL WHENEVER NOT FOUND GOTO outloop; 第三章 关系数据库语言SQL printf(“n printf(“n课程号课程号 tt tt分数分数n”)n”); For( For(; ;) ) EXEC SQL FETCH CC1 INTO :cnum EXEC SQL FETCH CC1 INTO :cnum,:grade:grade; printf(“%stt%dn” printf(“%stt%dn”,cnumcnum,grade)grade); outloop: continue; outloop: conti

151、nue; EXEC SQL CLOSE CC1 EXEC SQL CLOSE CC1; EXEC SQL WHENEVER SQLERROR CONTINUE EXEC SQL WHENEVER SQLERROR CONTINUE; /* /*用于避免陷入死循环用于避免陷入死循环*/*/ EXEC SQL COMMIT WORK RELEASE EXEC SQL COMMIT WORK RELEASE; /* /* 退出数据库退出数据库 */ */ exit() exit(); 第三章 关系数据库语言SQL 例:通过键盘输入指定要执行的例:通过键盘输入指定要执行的SQLSQL语句,并执行之。语

152、句,并执行之。 EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; char string060 char string060; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION; printf(“ printf(“请输入请输入SQLSQL语句串:语句串: ”) ”); gets(string0) gets(string0); EXEC SQL EXECUTE IMMEDIATE :string0 EXEC SQL EXECUTE IMMEDIATE :s

153、tring0; 其其中中,程程序序说说明明部部分分说说明明存存放放SQLSQL语语句句串串的的宿宿主主变变量量string0string0,由由gets gets 函函数数从从键键盘盘得得到到SQLSQL语语句句并并赋赋给给string0string0,然然后后由由EXECUTE EXECUTE IMMEDIATEIMMEDIATE语语句句执执行宿主变量行宿主变量string0string0中的中的SQLSQL语句。语句。 非查询的无参数动态语句也称为立即立即执行语句。非查询的无参数动态语句也称为立即立即执行语句。 第三章 关系数据库语言SQL例:通过键盘输入指定要删除的例:通过键盘输入指定要

154、删除的SQLSQL语句,并执行之。语句,并执行之。 EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; char string060 char string060; char snum9 char snum9; EXEC SQL END DECLARE SECTION EXEC SQL END DECLARE SECTION; printf(“ printf(“请输入请输入SQLSQL语句串:语句串: ”) ”); /* /* 用户通过键盘键入:用户通过键盘键入:DELETE S WHERE SNUM = :X */DE

155、LETE S WHERE SNUM = :X */ gets(string0) gets(string0); EXEC SQL PREPARE SS1 FROM :string0 EXEC SQL PREPARE SS1 FROM :string0; printf(“nn printf(“nn请输入学生的学号:请输入学生的学号: ”) ”); /* /* 假设用户通过键盘输入学号:假设用户通过键盘输入学号:200401002 */200401002 */ scanf(”%s” scanf(”%s”,&snum)&snum); EXEC SQL EXECUTE SS1 USING :snum E

156、XEC SQL EXECUTE SS1 USING :snum; printf(“nn printf(“nn请输入学生的学号:请输入学生的学号: ”) ”); /* /* 假设用户通过键盘输入学号:假设用户通过键盘输入学号:200403003 */200403003 */ scanf(”%s” scanf(”%s”,&snum)&snum); EXEC SQL EXECUTE SS1 USING :snum EXEC SQL EXECUTE SS1 USING :snum; 第三章 关系数据库语言SQL例例:利利用用查查询询动动态态SELECTSELECT语语句句编编写写,从从学学习习关关系系

157、表表中中查查询询某某个个学学生生所所学学全全部部 课课程的课程号和分数。查询条件中的学号由宿主变量给出。程的课程号和分数。查询条件中的学号由宿主变量给出。 #include #include EXEC SQL BEGIN DECLARE SECTION EXEC SQL BEGIN DECLARE SECTION; /* /* 说明说明SQLSQL变量变量 */ */ VARCHAR uid10 VARCHAR uid10; /* uid /* uid中存放用户名中存放用户名 */ */ VARCHAR pwd8 VARCHAR pwd8; /* pwd /* pwd中存放口令中存放口令 */

158、 */ VARCHAR snum9 VARCHAR snum9; /* /* 定义学号定义学号SNUMSNUM为伪类型为伪类型 */ */ VARCHAR cnum7 VARCHAR cnum7; /* /* 定义课程号定义课程号CNUMCNUM为伪类型为伪类型 */ */ int grade int grade; /* /* 定义分数定义分数GRADEGRADE为整型数为整型数 */ */ char select140 char select140; /* /* 用于暂存动态用于暂存动态selectselect语句语句 */ */ EXEC SQL END DECLARE SECTION E

159、XEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLCA EXEC SQL INCLUDE SQLCA; /* /* 说明说明SQLSQL通信区通信区 */ */ Main() Main() char where80 char where80; int i int i;第三章 关系数据库语言SQL ,”scott”)”scott”); /* /* 初始化用户名:初始化用户名:scott */scott */ = ) = ); /* /* 初始化初始化uiduid的长度值的长度值 */ */ ,”tigger”)”tigger”); /* /* 初始

160、化口令:初始化口令:tigger */tigger */ = ) = ); /* /* 初始化初始化pwdpwd的长度值的长度值 */ */ EXEC SQL WHENEVER SQLERROR STOP EXEC SQL WHENEVER SQLERROR STOP; EXEC SQL CONNECT :uid IDENTIFIED BY :pwd EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; /* /* 注册登录数据库注册登录数据库 */ */ printf(“ printf(“用户用户%s%s已成功地连接到数据库!已成功地连接到数据库!n”n”,)

161、); strcpy(select strcpy(select,“SELECT C#“SELECT C#,GRADE FROM SC WHERE ”)GRADE FROM SC WHERE ”); printf(“n printf(“n请输入请输入WHEREWHERE子句的条件:子句的条件: n”) n”); printf(”%s” printf(”%s”,select)select); gets(where) gets(where); strcat(select strcat(select,where)where); EXEC SQL PREPARE SS1 FROM :select EXEC

162、 SQL PREPARE SS1 FROM :select; EXEC SQL DECLARE CC1 CURSOR FOR SS1 EXEC SQL DECLARE CC1 CURSOR FOR SS1; EXEC SQL OPEN CC1 EXEC SQL OPEN CC1; printf(“n printf(“n学号学号 tt tt分数分数n”)n”); EXEC SQL WHENEVER NOT FOUND GOTO endloop EXEC SQL WHENEVER NOT FOUND GOTO endloop;第三章 关系数据库语言SQL For(i=0 For(i=0;i+)i+

163、) EXEC SQL FETCH CC1 INTO :cnum EXEC SQL FETCH CC1 INTO :cnum,:grade:grade; printf(“%stt%dn” printf(“%stt%dn”,cnumcnum,grade)grade); endloop: endloop: EXEC SQL CLOSE CC1 EXEC SQL CLOSE CC1; EXEC SQL WHENEVER SQLERROR CONTINUE EXEC SQL WHENEVER SQLERROR CONTINUE; /* /* 用于避免陷入死循环用于避免陷入死循环 */ */ EXEC SQL COMMIT WORK RELEASE EXEC SQL COMMIT WORK RELEASE; /* /* 退出数据库退出数据库 */ */ exit(0) exit(0);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号