第3章关系数据库语言SQL教材中习题3的解答3.2解:①SELECTS#,SNAMEFROMSWHEREAGE17ANDSEX=’F’;②SELECTC.C#,CNAME(联接查询方式)FROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#ANDSEX=’M’;或:SELECTC#,CNAME(嵌套查询方式)FROMCWHEREC#IN(SELECTC#FROMSCWHERES#IN(SELECTS#FROMSWHERESEX=’M’));或:SELECTC#,CNAME(存在量词方式)FROMCWHEREEXISTS(SELECT*FROMSCWHEREC.C#=SC.C#ANDEXISTS(SELECT*FROMSWHERESC.S#=S.S#ANDSEX=’M’));EXISTS表示存在量词,EXISTS操作符后子查询的结果集中如果不为空,则产生逻辑真值“true”,否则产生假值“false”这类查询和不相关子查询有一个明显区别,即子查询的查询条件依赖于外层父查询的某个属性值,内层查询由于与外层查询有关,因此必须反复求值一般处理过程为:首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组,重复这一过程,直到外层表全部查完为止。③SELECTT.T#,TNAMEFROMT,SC,C,SWHERET.T#=C.C#ANDSC.C#=C.C#ANDSC.S#=S.S#ANDSEX=’M’;④SELECTDISTINCTX..S#FROMSCASX,SCASYWHEREX.S#=Y.S#ANDX.C#!=Y.C#;⑤SELECTC#FROMSCASX,SCASYWHEREX.C#=Y.C#ANDX.S#=’S2’ANDY.S#=’S4’;⑥SELECTC#FROMCWHERENOTEXISTS(SELECT*FROMS,SCWHERES.S#=SC.S#ANDSC.C#=C.C#ANDSNAME=’WANG’);⑦SELECTC#,CNAMEFROMCWHERENOTEXISTS(SELECT*FROMSWHERENOTEXISTS(SELECT*FROMSCWHERES#=S.S#ANDC#=C.C#));外层循环依次扫描C关系中的每个元组,中层循环依次扫描S关系中的每个元组,内层循环依次扫描SC关系中的每个元组,对于C关系中的每个元组,若有一个学生没有选修,则最内层查询为空,得出中层选择条件为真,进而得出中层查询不为空,从而外层的选择条件为假,该课程不会选出来放到结果集中。所以,只有某个课程被学生中的所有学生选修,最内层查询每次都不为空,中层选择条件每次都为假,得出中层查询结果为空,进而得出外层选择条件为真,该课程元组被选择出来放到结果集中。⑧SELECTDISTINCTS#FROMSCASXWHERENOTEXISTS(SELECT*FROMC,TWHEREC.T#=T.T#ANDTNAME=’LIU’ANDNOTEXISTS(SELECT*FROMSCASYWHEREY.S#=X.S#ANDY.C#=C.C#));或者SELECTDISTINCTS#FROMSCASXWHERENOTEXISTS(SELECT*FROMCWHERET#IN(SELECTT#FROMTWHERETNAME=’LIU’)ANDNOTEXISTS(SELECT*FROMSCASYWHEREY.S#=X.S#ANDY.C#=C.C#));练习题3.1填空题1.在SQL中,关系模式称为__________,子模式称为__________,元组称为__________,属性称为__________。2.SQL中,表有两种:__________和__________,也称为__________和__________。3.SQL中,用户有两种:__________和__________。4.SQL中,外模式一级数据结构的基本单位是__________。5.基本表中,“主键”概念应该体现其值的__________和__________两个特征。6.操作“元组IN(集合)”的语义是____________________。7.表达式中的通配符“%”表示__________,“_”(下划线)表示__________。8.操作“元组SOME(集合)”的语义是____________________。9.操作“元组ALL(集合)”的语义是____________________。10.SQL有两种使用方式:__________和__________。3.2单项选择题(在备选答案中选出一个正确答案)1.在SQL中,用户可以直接进行查询操作的是[]A.实表和虚表B.基本表和实表C.视图和虚表D.基本表2.SQL中,聚合函数COUNT(列名)用于[]A.计算元组个数B.计算属性的个数C.对一列中的非空值计算个数D.对一列中的非空值和空值计算个数3.SQL中,与“NOTIN”等价的操作符是[]A.=SOMEB.SOMEC.=ALLD.ALL4.SQL中,谓词EXISTS可用来测试一个集合是否[]A.有重复元组B.有重复的列名C.为非空集合D.有空值5.对于基本表EMP(ENO,ENAME,SALARY,DNO)其属性表示职工的工号、姓名、工资和所在部门的编号。基本表DEPT(DNO,DNAME)其属性表示部门的编号和部门名。有一SQL语句:SELECTCOUNT(DISTINCTDNO)FROMEMP;其等价的查询语句是[]A.统计职工的总人数B.统计每一部门的职工人数C.统计职工服务的部门数目D.统计每一职工服务的部门数目6.对于第6题的两个基本表,有一个SQL语句:SELECTENO,ENAMEFROMEMPWHEREDNONOTIN(SELECTDNOFROMDEPTWHEREDNAME='金工车间';其等价的关系代数表达式是:[]A.πENO,ENAME(σDNAME≠'金工车间'(EMP⋈DEPT))B.πENO,ENAME(EMP⋈DEPT)C.πENO,ENAME(EMP)-πENO,ENAME(σDNAME='金工车间'(EMP⋈DEPT))D.πENO,ENAME(EMP)-πENO,ENAME(σDNAME≠'金工车间'(EMP⋈DEPT))DNAME≠'金工车间'7.对于第6题的两个基本表,有一个SQL语句:UPDATEEMPSETSALARY=SALARY*1.05WHEREDNO='D6'ANDSALARY(SELECTAVG(SALARY)FROMEMP);其等价的修改语句为[]A.为工资低于D6部门平均工资的所有职工加薪5%B.为工资低于整个企业平均工资的职工加薪5%C.为在D6部门工作、工资低于整个企业平均工资的职工加薪5%D.为在D6部门工作、工资低于本部门平均工资的职工加薪5%8.有关嵌入式SQL的叙述,不正确的是[]A.宿主语言是指C一类高级程序设计语言B.宿主语言是指SQL语言C.在程序中要区分SQL语句和宿主语言语句D.SQL有交互式和嵌入式两种使用方式加:3.3简答题1.试叙述SQL的关系代数特点和元组演算特点。2.SQL语言对于“查询结果是否允许存在重复元组”是如何实现的?3.SELECT语句中,何时使用分组子句,何时不必使用分组子句?练习题答案3.1填空题答案1.基本表视图行列2.基本表视图实表虚表3.应用程序终端用户4.视图5.惟一非空6.若元组在集合中,其值为true,否则为false7.与零个或多个字符组成的字符串匹配与单个字符匹配8.若元组值大于集合中某一元组值,则其值为true,否则为false9.若元组值小于集合中每一元组值,则其值为true,否则为false10.交互式SQL嵌入式SQL3.2单项选择题答案1.A2.C3.D4.C5.C6.C7.C8.B加:3.3简答题答案1.答:SQL的SELECT语句的基本句法来自于关系代数表达式πL(σF(R1×…×Rm)),并且SQL中有并(UNION)、交(INTERSECT)和差(EXCEPT)等操作,因此SQL具有关系代数特点。SELECT语句中出现的基本表名,都应该理解成基本表中的元组变量,而列名应理解成元组分量,这样SQL就具有了元组演算的特点。2.答:对于SELECT语句中SELECT子句,若用“SELECTDISTINCT”形式,则查询结果中不允许有重复元组;若不写DISTINCT字样,则查询结果中允许出现重复元组。3.答:SELECT语句中使用分组子句的先决条件是要有聚合操作。当聚合操作值与其他属性的值无关时,不必使用分组子句。譬如求男同学的人数。此时聚合值只有一个,因此不必分组。当聚合操作值与其他属性的值有关时,必须使用分组子句。譬如求每一性别的人数。此时聚合值有两个,与性别有关,因此必须分组。