
第3章 关系数据库标准语言SQL
一、选择题
1SQL的运算参数和结果都是( )形式。
A.关系
B.元组
C.数据项
D.属性
【答案】A
【解析】结构化查询语言是一种非过程化、面向集合的数据库语言。面向集合的特点是指SQL的运算参数和结果都是集合形式-表或关系。
2以下有关索引的叙述中正确的是( )。
A.索引越多,更新速度越快
B.索引可以用来提供多种存取路径
C.索引需要用户维护,并列索引中列的个数不受限制
D.索引需要用户维护
【答案】B
【解析】索引是建立在列上的一种数据对象,它对表中的数据提供一种逻辑顺序,当在数据库表中搜索某一行时,可以通过使用索引来找到它的物理位置。索引一旦建立后就交由DBMS管理,不需人工干预,所以索引是动态的,每当数据库表更新,相应的索引也随之更新,为此,过多的索引列和频繁的数据更新都会消耗系统资源,增加系统开销,从而降低索引应有的作用。
3下面描述正确的是( )。
A.可以在任何数据库中创建视图
B.可以在视图上创建索引
C.如果视图引用的基表或者视图被删除,则该视图不能再被使用,直到创建新的基表或者视图
D.通过视图查询数据时,SQL Server不检查数据完整性规则
【答案】C
【解析】创建和使用视图需遵循一些基本原则,为此还应注意以下问题:
①只能在当前数据库中创建视图。
②如果视图引用的基表或者视图被删除,则该视图不能再被使用,直到创建新的基表或者视图。
③不能在视图上创建索引,不能在规则、默认、触发器的定义中引用视图。
④当通过视图查询数据时,SQL Server要检查数据完整性规则,以确保语句中涉及的所有数据库对象存在,而且数据修改语句不能违反数据完整性规则。
4查询选课关系SC(Sno,Cno,Score)表中还没有给定成绩(Score)的课程号(Sno)和学号(Cno),下列语句正确的是( )
A.SELECT Sno,Cno FROM SC WHERE Score IS NULL
B.SELECT*FROM SC WHERE Score=NULL
C.SELECT Sno,Cno FROM SC
D.SELECT Score FROM SC WHERE Sno,Cno IS NOT NULL
【答案】A
【解析】在数据库基本表中,还没有给定成绩的属性列,意味着该属性列的数据还从未更新过,为此,其值应该是空(NULL),SQL中可以用IS NULL和IS NOT NULL来查询属性列值是空值或不为空值的元组。根据题意,应该选择A项。注意,IS不能用“=”来代替。
5SQL语言中,HAVING子句用于筛选满足条件的( )。
A.列
B.行
C.分组
D.元组
【答案】C
【解析】HAVING子句常与GROUP BY子句联合使用,GROUP BY通常指出分组的依据列,即依据那个属性列来分组,而HAVING子句则指出各分组提取的条件。例如:要求列出某班本学期所有课程中,班级平均成绩高于75的课程号、课程名称时,GROUP BY子句应该指出分组的依据是选课关系中的课程号属性列,HAVING子句则提出该课程的全班平均成绩AVG要高于75,低于75的就不提取了。
6某校选课关系基本表SC(S#,C#,Grade),其中S#,C#分别代表学号和课程号且均为字符型数据,Grade表示成绩为数值型数据,现要往该表中插入数据,请问以下语句中不正确的是( )。
A.INSERT INTO SC(S#,C#,Grade)VALUES(‘S4’,‘C6’,90)
B.INSERT INTO SC(S#,C#)VALUES(‘S5’,‘C8’)
C.INSERT INTO SC VALUES<‘S4’,‘C4’,85)
D.INSERT INTO SC(S#,C#,Grade)VALUES(S2,C3,89)
【答案】D
【解析】在SQL语言中,使用INSERT语句插入数据时,需要注意以下几个问题:首先,列名表和元组值中的项数应该对称相等,并且保持数据类型一致;其次,元组值中给出的数据元素个数应该小于等于关系模式中的属性列个数,而且此时列名表不可缺省,列名表中未给出的属性列的值在插入时取默认值1此外,列表名缺省时意味着取关系模式中的全部属性列,而且其顺序与模式定义一致,插入时还需要注意非空属性列值的输入及主码列值的唯一性等问题。
7下列哪个函数能将一个表达式从一种数据类型改变为另一种数据类型?( )
A.COUNT(*)
B.COUNT(*)
C.CONVERT(*)
D.AVG(*)
【答案】C
【解析】CONVERT函数能将某种数据类型的表达式显式转换为另一种数据类型。其他3个都是聚集函数,COUNT( )的功能是统计一列中值的个数;COUNT(*)统计元组个数;AVG( )计算一列值的平均值(此列必须是数值型)。此外,SQL语言中还提供了另一个数据类型转换函数CAST,这两个函数均能将表达式值转换为指定的数据类型,CONVERT可以指定长度,而CAST不能指定长度。
8下列说法正确的是( )。
A.可以利用存储过程在当前数据库中创建固定数据库角色
B.当前数据库中的用户自定义角色可以用存储过程删除
C.不能将数据库用户账户添加为当前数据库中角色的成员
D.Public角色可以被删除
【答案】B
【解析】在T-SQL中,通过sp-helpdbfixedrole存储过程,查看SQL Server固定数据库角色列表;利用sp-addrolemember存储过程将数据库用户的账户,添加为当前数据库中数据库角色的成员;利用sp-droprolemember存储过程从当前数据库的数据库角色中,删除数据库安全账户。但不能利用存储过程在当前数据库中创建固定数据库角色,排除A项。此外,SQL Server包括两类具有隐含权限的预定义角色,固定服务器角色和固定数据库角色。这些隐含权限不能授予其他用户账户。如果有用户需要这些权限,则必须将其账户添加到这些预定义角色中,排除C项;Public角色是SQL Server数据库管理系统中每个数据库都存在的特殊角色。它提供数据库中用户默认权限,每个数据库用户都自动是此角色的成员。所以Public角色不能被删除,排除D项;在T-SQL中,通过sp-helprole存储过程,查看角色;利用sp-addrole存储过程在当前数据库创建新的数据库角色;利用sp-droprole存储过程从当前数据库删除角色。B项是正确的。
9以下有关SELECT子句的叙述中不正确的是( )。
A.SELECT子句中只能包含表中的列及其构成的表达式
B.SELECT子句规定了结果集中的列序列
C.SELECT子句中可以使用别名
D.如果FROM子句引用的两个表中有同名的列,则在SELECT子句中引用它们时必须使用表名前缀加以限定
【答案】A
【解析】SQL语言提供了SELECT语句进行数据库查询,该语句具有灵活的使用方式和丰富的功能。语句的功能是根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组。再按SELECT子句中目标列表达式,选出元组中属性值形成结果表。在同一个表自身联合查询时可以采用别名的方式以示区别,并在引用时通过表名前缀加以限定。故四个选项中A项是不正确的。
10以下定义的4个视图中,能够进行更新操作的是( )。
A.
B.
C.
D.
【答案】C
【解析】根据视图更新操作的限制,A项的视图数据来源于多个基本表,所以不能进行更新操作。B项的视图数据来源于一个基本表的聚合结果,所以不能进行更新操作。D项中视图不含有基本表的主码,所以不能进行更新操作。
二、填空题
1SQL语言的数据定义功能包括______、______、______和______。
【答案】定义数据库;定义基本表;定义视图;定义索引
2在SELECT命令中,______子句用于选择满足给定条件的元组,使用______子句可按指定列的值分组,同时使用______子句可提取满足条件的组。
【答案】WHERE;GROUP BY;HAVING
3视图是一个虚表,它是从______导出的表。在数据库中,只存放视图的______,不存放视图对应的______。
【答案】一个或几个基本表;定义;数据
4设有如下关系表R:R(NO,NAME,SEX,AGE,班号)主码是NO。其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,班号为班号。
写出实现下列功能的SQL语句。
①插入一个记录(25,‘李明’,‘男’,21,‘09031’):______。
②插入‘09031’班学号为30、姓名为‘郑和’的学生记录:______。
③将学号为10的学生姓名改为‘王华’______。
④将所有‘95101’班号改为‘10091’:______。
⑤删除学号为20的学生记录:______。
⑥删除姓‘王’的学生记录:______。
【答案】
①INSERT INTO R VALUES(25,‘李明’,‘男’,21,‘09031’)
②INSERT INTO R(NO,NAME,班号)VALUES(30,‘郑和’,‘09031’)
③UPDATE R SET NAME=‘王华’WHERE NO=10
④UPDATE R SET 班号=‘10091’WHERE 班号=‘95101’
⑤DELETE FROM R WHERE NO=20
⑥DELETE FROM R WHERE NAME LIKE‘王%’
5在SELECT命令中进行查询,若希望查询的结果不出现重复元组,应在SEL ECT语句中使用______保留字。
【答案】DISTINCT
三、判断题
1在SQL中,ALTER TABLE语句中MODIFY用于修改字段的类型和长度等,ADD用于添加新的字段。( )
【答案】×
【解析】ALTER TABLE语句中,ALTER COLUMN用于修改字段的类型和长度等,ADD用于添加新的字段。
2可以用UNION将两个查询结果合并为一个查询结果。( )
【答案】√
3视图是观察数据的一种方法,只能基于基本表建立。( )
【答案】×
【解析】也可以建立视图的视图。
4在SELECT语句中,需要对分组情况满足的条件进行判断时,应使用WHERE子句。( )
【答案】×
【解析】应使用HAVING子句。
5在CREATE INDEX语句中,使CLUSTERED来建立簇索引。( )
【答案】√
四、问答题
1设有一个SPJ数据库,包括S、P、J、SPJ 4个关系模式:
S(Sno,Sname,Status,City)
P(Pno,Pname,Color,Weight)
J(Jno,Jname,City)
SPJ(Sno,Pno,Jno,Qty)
供应商表S由供应商代码(Sno)、供应商姓名(Sname)、供应商状态(Status)、供应商所在城市(City)组成。零件表P由零件代码(Pno)、零件名(Pname)、颜色(Color)、重量(Weight)组成。工程项目表J由工程项目代码(Jno)、工程项目名(Jname)、工程项目所在城市(City)组成。供应情况表SPJ由供应商代码(Sno)、零件代码(Pno)、工程项目代码(Jno)、供应数量(Qty)组成,表示某供应商供应某种零件给某工程项目的数量为Qty。请为“三建”工程项目建立一个供应情况的视图,包括供应商代码(Sno)、零件代码(Pno)、供应数量(Qty)。针对该视图完成下列查询:
(1)找出“三建”工程项目使用的各种零件代码及其数量。
(2)找出供应商S1的供应情况。
(3)把对表S的INSERT权限授予用户张勇,并允许他再将此权限授予其他用户。
(4)把查询SPJ表和修改Qty属性的权限授给用户李天明。
答:建立视图:
CREATE VIEW V_SPJ AS SELECT Sno,Pno,Qty FROM SPJ
WHERE Jno=(SELECT Jno FROM J WHERE Jname=‘三建’);
(1)SELECT Pno,Qty FROM V_SPJ;
(2)SELECT Pno,Qty FROM V_SPJ WHERE Sno=‘S1’;
(3)GRANT INSERT ON TABLE S TO张勇WITH GRANT OPTION;
(4)GRANT SELECT,UPDATE(Qty)ON TABLE SPJ TO 李天明;
2设有关系R和S,如图3-1所示。试用SQL语句实现:
(1)查询属性C>50时,R中与之相关联的属性B的值。
(2)当属性C=40时,将R中与之相关联的属性B值修改为b4。

图3-1 关系R和S
答:(1)对应的SQL语句如下:

(2)对应的SOL语句如下:

3设有4个关系模式如下:
S(供应商号,姓名,STATE,CITY)
P(PNO,PNAME,COLOR,WEI,PRICE)
J(JNO,JNAME,CITY)
SPJ(学号,PNO,JNO,QTY)
其中,S表示供应商,它的各属性依次为供应商号、供应商名、供应商所在省份和供应商所在城市;P表示零件,它的各属性依次为零件号、零件名、零件颜色、零件重量和单价;J表示工程,它的各属性依次为工程号、工程名和工程所在城市;SPJ表示供货关系,它的各属性依次为供应商号、零件号、工程号和供货数量。用SQL语句实现下面的查询要求:
(1)查询列出供应了全部零件的供应商名和其所在城市。
(2)查询列出供应红色零件的供应商名。
答:(1)对应的SQL语句如下:

(2)对应的SQL语句如下:

4设计一个程序采用游标方式输出求每个学生的班号、学号、姓名、课程名和分数,并以班号和学号排序,给出程序的执行结果。
答:对应的程序如下:

本程序的执行结果如下:

5设有如图3-2所示的3个基本表。表中各个属性的含义如下:A#(商店代号)、ANAME(商店名)、WQTY(店员人数)、CITY(所在城市)、B#(商品号)、BNAME(商品名称)、PRICE(商品价格)、QTY(商品数量)。试用SQL语句写出下列查询:
(1)找出店员人数不超过100人或者在长沙市的所有商店的商店代号和商店名。
(2)找出供应书包的商店名。
(3)找出至少供应代号为256的商店所供应的全部商品的商店名和所在城市。

图3-2 3个关系表
答:(1)对应的SQL语句如下:

(2)对应的SQL语句如下:
方法1:

方法2:

(3)对应的SQL语句如下:
