第3章 关系数据库语言SQL.doc
《第3章 关系数据库语言SQL.doc》由会员分享,可在线阅读,更多相关《第3章 关系数据库语言SQL.doc(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、优质文本第3章 关系数据库语言SQL3.1 根本内容分析3.1.1 本章重要概念1SQL数据库的体系结构,SQL的组成。2SQL的数据定义:SQL模式、根本表和索引的创立和撤销。3SQL的数据查询;SELECT语句的句法,SELECT语句的三种形式及各种限定,根本表的联接操作,SQL3中的递归查询。4SQL的数据更新:插入、删除和修改语句。5视图的创立和撤消,对视图更新操作的限制。6嵌入式SQL:预处理方式,使用规定,使用技术,卷游标,动态SQL语句。3.1.2 本章的重点篇幅1教材中P97的例3.8SELECT语句。2教材中P123的例3.31和P123的例3.32嵌入式SQL。3.1.3
2、重要内容分析SELECT语句是SQL的核心内容,对于该语句考生应掌握以下内容。1SELECT语句的来历在关系代数中最常用的式子是以下表达式:A1,An(F(R1Rm)这里R1、Rm为关系,F是公式,A1、An为属性。针对上述表达式,SQL为此设计了SELECTFROMWHERE句型:SELECT A1,AnFROM R1,RmWHERE F这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。2SELECT语句中出现的根本表名,应理解为根本表中的元组变量,而列名应理解为元组分量。3SELECT语句的语义有三种情况,下面以学生表SS#,SNAME,AGE,
3、SEX为例说明。第一种情况:SELECT语句中未使用分组子句,也未使用聚合操作,那么SELECT子句的语义是对查询的结果执行投影操作。譬如:SELECT S#,SNAMEFROM SWHERE SEX=M;第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。譬如:SELECT COUNT*,AVGAGEFROM SWHERE SEX=M;该语句是求男同学的人数和平均年龄。第三种情况:SELECT语句使用了分组子句和聚合操作有分组子句时必有聚合操作,此时SELECT子句的语义是对查询结果的每一分组去做聚合操作。譬
4、如:SELECT AGE,COUNT*FROM SWHERE SEX=MGROUP BY AGE;该语句是求男同学每一年龄的人数。4SELECT语句中使用分组子句的先决条件是要有聚合操作。但执行聚合操作不一定要用分组子句。譬如求男同学的人数,此时聚合值只有一个,因此不必分组。但同一个聚合操作的值有多个时,必须使用分组子句。譬如求每一年龄的学生人数。此时聚合值有多个,及年龄有关,因此必须分组。3.2 教材中习题3的解答3.1 名词解释根本表:实际存储在数据库中的表,称为根本表。视图:是从根本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是数据库中只存放视图的定义而不存放视图的数据。实表
5、:是对根本表的别称。虚表:是对视图的别称。相关子查询:SELECT语句嵌套时,子查询中查询条件依赖于外层查询中的值,因此子查询要反复求值供外层查询使用。这种子查询称为相关子查询。联接查询:查询时要从多个根本表中提取数据,此时把多个根本表写在同一层的FROM子句中,这种查询形式称为联接查询。嵌套查询:查询时要从多个根本表中提取数据,此时把多个根本表分别放在不同层次上的FROM子句中,这种查询形式称为嵌套查询。交互式SQL:在终端交互方式使用的SQL语言。嵌入式SQL:嵌入在高级语言的程序中使用的SQL语言。共享变量:嵌入的SQL语句和主语言语句间传递信息的变量,称为共享变量。共享变量先由主语言程
6、序定义,再用SQL的说明语句说明,然后SQL语句就可使用这些变量。游标:游标是及某一查询相联系的符号名。游标有游标关系和游标指针两层含义。在游标翻开时,游标指针指向查询结果的第一个记录之前。卷游标:在游标推进时,可以进退自如的游标。3.2 对于教学数据库的三个根本表 S(S#,SNAME,AGE,SEX) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER)试用SQL的查询语句表达以下查询:检索LIU老师所授课程的课程号和课程名。检索年龄大于23岁的男学生的学号和姓名。检索学号为S3学生所学课程的课程名及任课教师名。检索至少选修LIU老师所授课程中一门课程的女学生姓名。检索W
7、ANG同学不学的课程的课程号。检索至少选修两门课程的学生学号。检索全部学生都选修的课程的课程号及课程名。检索选修课程包含LIU老师所授课程的学生学号。解:SELECT C#, CNAMEFROM CWHERE TNAME=LIU; SELECT S#, SNAMEFROM SWHERE AGE23 AND SEX=M;SELECT CNAME,TEACHERFROM SC, CWHERE SC.C#=C.C# AND S#=S3;SELECT SNAME联接查询方式FROM S, SC, CWHERE S.S#=SC.S# AND SC.C#=C.C# AND SEX=FAND TNAME=L
8、IU;或:SELECT SNAME嵌套查询方式FROM SWHERE SEX=FAND S# IN (SELECT S#FROM SCWHERE C# IN (SELECT C#FROM CWHERE TNAME=LIU);或:SELECT SNAME存在量词方式FROM SWHERE SEX=FAND EXISTS (SELECT *FROM SCWHERE SC.S#=S.S#AND EXISTS (SELECT * FROM C WHERE C.C#=SC.C#AND TNAME=LIU);SELECT C#FROM CWHERE NOT EXISTS(SELECT * FROM S,
9、SC WHERE S.S#=SC.S# AND SC.C#=C.C#AND SNAME=WANG); SELECT DISTINCT X.S#FROM SC AS X, SC AS YWHERE X.S#=Y.S# AND X.C#!=Y.C#; SELECT C#, CNAMEFROM CWHERE NOT EXISTS(SELECT *FROM SWHERE NOT EXISTS(SELECT * FROM SC WHERE S#=S.S# AND C#=C.C#);在1974年的SYSTEM R系统中,曾使用过“集合包含的语法,即集合1CONTAINS集合2用这种语法也能写出此题的SEL
10、ECT语句,即:SELECT C#,CNAMEFROM CWHERE SELECT S# FROM SC WHERE C#=C.C# CONTAINSSELECT S# FROM S;由于判断“集合1CONTAINS集合2及“NOT EXISTS集合2EXCEPT集合1是等价的,因此此题的SELECT语句也能这样写:SELECT C#,CNAMEFROM CWHERE NOT EXISTSSELECT S# FROM SEXCEPTSELECT S# FROM SC WHERE C#=C.C#; SELECT DISTINCT S#FROM SC AS XWHERE NOT EXISTS(SE
11、LECT * FROM C WHERE TNAME=LIUAND NOT EXISTS(SELECT * FROM SC AS Y WHERE Y.S#=X.S# AND Y.C#=C.C#);及类似,此题的SELECT语句也能这样写:SELECT DISTINCT S#FROM SC XWHERE NOT EXISTSSELECT C# FROM C WHERE TEACHER=LIUEXCEPTSELECT C# FROM SC Y WHERE Y.S#=X.S#;3.3 对于第3.2题中的8个查询语句,试给出SELECT语句的图示形式。解:为了说明问题,这里先用高级语言的算法形式表示其执
12、行过程,再给出图示形式。下面给出、的算法及图示形式。 如果把三个关系S、SC、C看成三个文件,那么可以看出这个查询语句的SELECT语句实际上是一个三重循环。从而可得这个查询的算法形式如下:for关系S的每个元组dowhich:=false;if S.SEX=F thenfor 关系SC的每个元组,且NOT which doif SC.S#=S.S# thenfor 关系C的每个元组,且NOT which doif C.C#=SC.C#,且TEACHER=LIU thenprint(S.SNAME); which:=true; ;这个算法可以用图3.1表示。SS#SNAMEAGESEXSCS#
13、C#GRADECC#CNAMETEACHER_XP.F_X_Y_YLIU图3.1 for 关系S的每个元组 do if S.SNAME=WANG thenfor 关系C的每个元组 dowhich:=false; for 关系SC的每个元组,且NOT which doif SC.S# =S.S# ,且SC.C#=C.C# then which := true;if NOT which then printS.SNAME;这个算法可以用图3.2表示。图中“表示“NOT EXISTS,即“不存在满足此条件的元组SS#SNAMEAGESEXCC#CNAMETEACHERSCS#C#GRADE_XWAN
14、GP._Y_X_Y图3.2 for 关系C的每个元组 do which1 := false; for 关系S的每个元组,且NOT which1 do which2 := false;for 关系SC的每个元组,且NOT which2 do if SC.S# =S.S#, 且SC.C# =C.C# then which2 := true;if NOT which2 then which1:=true;if NOT which1 then printC.C#,C.CNAME; ;这个算法可以用图3.3表示。CC#CNAMETEACHERSS#SNAMEAGESEXSCS#C#GRADEP._XP.
15、_Y_Y_X图3.3 for 关系SC的每个元组x do which1 := false; for 关系C的每个元组y,且NOT which1 do if y.TEACHER=LIUthen which2 := false;for 关系SC的每个元组z,且NOT which2 doif z.S# =x.S#,且z.C# =y.C# then which2 := true;if NOT which2 then which1:=true;if NOT which1 then printx.S#;这个算法可以用图3.4表示。SCS#C#GRADECC#CNAMETEACHERSCS#C#GRADEP
16、._XP._YLIU_X_Y图3.43.4 设有两个根本表RA,B,C和SA,B,C,试用SQL查询语句表达以下关系代数表达式: RS RS RS RSA,B(R) B,CS 3=3 课 1,63=4RS 1,2,3R S RCS解: (SELECT * FROM R)UNION(SELECT * FROM S); (SELECT * FROM R)INTERSECT(SELECT * FROM S); (SELECT * FROM R)MINUS(SELECT * FROM S); SELECT *FROM R, S; SELECT R.A, R.B, S.CFROM R, SWHERE R
17、.B=S.B; SELECT R.A, S.CFROM R, SWHERE R.C=S.A; SELECT R.*R.*表示R中全部属性FROM R, SWHERE R.C=S.C;RCS的元组表达式如下: t |uvwRu Sv Rw w1=u1 w2=u2 w3=v3 t1=u1 t2=u2据此,可写出SELECT语句:SELECT A, BFROM R RXWHERE NOT EXISTS( SELECT *FROM SWHERE NOT EXISTS( SELECT *FROM R RYWHERE RY.A=RX.A AND RY.B=RX.B AND RY.C=S.C);3.5 设有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 关系数据库语言SQL 关系 数据库 语言 SQL
限制150内