SQL语言(综合) 课堂练习和习题

更新时间:2024-04-01 14:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

SQL语言 课堂练习和习题

一、选择题

1. SQL语言是( )的语言,容易学习 .

A.过程化 B. 非过程化 C.格式化 D. 导航式

2. SQL语言的数据操纵语句包括SELECT,INSERT,UPDATE,DELETE等.其中最重要的,也是使用最频繁的语句是( ) .

A. SELECT B. INSERT C. UPDATE D. DELETE

3. 在视图上不能完成的操作是( ) .

A. 更新视图 B. 查询 C. 在视图上定义新的表 D. 在视图上定义新的视图

4. SQL语言集数据查询,数据操纵,数据定义和数据控制功能于一体,其中,CREATE,DROP,ALTER语句是实现哪种功能( ).

A. 数据查询 B. 数据操纵 C. 数据定义 D. 数据控制

5. SQL语言中,删除一个视图的命令是( ).

A.DELETE B.DROP C.CLEAR D.REMOVE 6. 在SQL语言中的视图VIEW是数据库的( ) .

A. 外模式 B. 模式 C. 内模式 D. 存储模式 7. 下列的SQL语句中,( )不是数据定义语句.

A. CREATE TABLE B. DROP VIEW C. CREATE VIEW D. GRANT 8. 若要撤销数据库中已经存在的表S,可用( ).

A. DELETE TABLE S B. DELETE S C. DROP TABLE S D. DROP S 9. 若要在基本表S中增加一列CN(课程名),可用( ).

A.ADD TABLE S(CN CHAR(8)) B.ADD TABLE S ALTER(CN CHAR(8))

C.ALTER TABLE S ADD(CN CHAR(8)) D.ALTER TABLE S (ADD CN CHAR(8))

10. 学生关系模式 S( S#,Sname,Sex,Age),S的属性分别表示学生的学号,姓名,性别,年龄.要在表S中删除一个属性\年龄\可选用的SQL语句是( ).

A. DELETE Age from S B. ALTER TABLE S DROP Age C. UPDATE S Age D. ALTER TABLE S 'Age'

11. 有关系S(S#,SNAME,SAGE),C(C#,CNAME),SC(S#,C#,GRADE).其中S#是学生号,SNAME是学生姓名,SAGE是学生年龄, C#是课程号,CNAME是课程名称.要查询选修\课的年龄不小于20的全体学生姓名的SQL语句是SELECT SNAME FROM S,C,SC WHERE子句.这里的WHERE子句的内容是( ).

A. S.S# = SC.S# and C.C# = SC.C# and SAGE>=20 and CNAME='ACCESS' B. S.S# = SC.S# and C.C# = SC.C# and SAGE in>=20 and CNAME in 'ACCESS' C. SAGE in>=20 and CNAME in 'ACCESS' D. SAGE>=20 and CNAME=' ACCESS'

12. 设关系数据库中一个表S的结构为S(SN,CN,grade),其中SN为学生名,CN为课程名,二者均为字符型;grade为成绩,数值型,取值范围0-100.若要把\张二的化学成绩80分\插入S中,则可用( ).

A. ADD INTO S VALUES('张二','化学','80') B. INSERT NTO S VALUES('张二','化学','80') C. ADD INTO S VALUES('张二','化学',80) D. INSERT INTO S VALUES('张二','化学',80)

13. 设关系数据库中一个表S的结构为:S(SN,CN,grade),其中SN为学生名,CN为课程名,二者均为字符型;grade为成绩,数值型,取值范围0-100.若要更正王二的化学成绩为85分,则可用( ) .

A. UPDATE S SET grade=85 WHERE SN='王二' AND CN='化学' B. UPDATE S SET grade='85' WHERE SN='王二' AND CN='化学' C. UPDATE grade=85 WHERE SN='王二' AND CN='化学' D. UPDATE grade='85' WHERE SN='王二' AND CN='化学' 14. 在SQL语言中,子查询是( ) .

A. 返回单表中数据子集的查询语言 B. 选取多表中字段子集的查询语句

C. 选取单表中字段子集的查询语句 D. 嵌入到另一个查询语句之中的查询语句 15. SQL是一种( )语言.

A. 高级算法 B. 人工智能 C. 关系数据库 D. 函数型

16. 有关系S(S#,SNAME,SEX),C(C#,CNAME),SC(S#,C#,GRADE).其中S#是学生号,SNAME是学生姓名,SEX是性别, C#是课程号,CNAME是课程名称.要查询选修\数据库\课的全体男生姓名的SQL语句是SELECT SNAME FROM S,C,SC WHERE子句.这里的WHERE子句的内容是( ).

A.S.S# = SC.S# and C.C# = SC.C# and SEX='男' and CNAME='数据库' B.S.S# = SC.S# and C.C# = SC.C# and SEX in'男'and CNAME in'数据库' C.SEX '男' and CNAME ' 数据库' D.S.SEX='男' and CNAME=' 数据库' 17. 若用如下的SQL语句创建了一个表SC:

CREATE TABLE SC (S# CHAR(6) NOT NULL,C# CHAR(3) NOT NULL,SCORE INTEGER,NOTE CHAR(20));向SC表插入如下行时,( )行可以被插入 .

A.('201009','111',60,必修)

B.('200823','101',NULL,NULL) C.(NULL,'103',80,'选修') D.('201132',NULL,86,' ')

18. 假设学生关系S(S#,SNAME,SEX),课程关系C(C#,CNAME),学生选课关系SC(S#,C#,GRADE).要查询选修\课的男生姓名,将涉及到关系( ).

A. S B. S,SC C. C,SC D. S,C,SC

19.SQL Server2000的字符型系统数据类型主要包括( )。

A. int、money、char B. char、varchar、text C. datetime、binary、int D. char、varchar、int

20. 如果要在SQL Server2000中存储图形图像、Word文档文件,不可采用的数据类型是( )。

A. binary B. varbinary C. image D. text 21. 不属于SQL Server2000系统全局变量的是( )。 A. @@Error B. @@Connections C. @@Fetch_Status D. @Records

22.SQL Server2000提供的单行注释语句是使用( )开始的一行内容。 A. “/*” B. “--” C. “{” D. “/”

23. 下列标识符可以作为局部变量使用( )。

A. [@Myvar] B. My var C. @Myvar D. @My var 24.在SQL Server 中,WAITFOR 语句中的DELAY参数是指( )。 A. 要等待的时间 B. 指示SQL Server 一直等到指定的时间过去 C. 用于指示时间 D. 以上都不是

25.下面( )组命令,将变量count值赋值为1。

A.DECLARE @count SELECT @count=1 B.DIM count=1 C.DECLARE count SELECT count=1 D.DIM @count SELECT @count=1

26.下列( )赋值语句是错误的。

A.SELECT @C=1 B. SET @C=1 C.SELECT @DJ=单价 FROM book

ORDER BY 单价 DESC D.SET @DJ=单价 FROM book

ORDER BY 单价 DESC

27.在SQL Server 编程中,可使用( )将多个语句捆绑。

A.{ } B. BEGIN-END C.( ) D. [ ]

28.在SQL Server 2000中,下列变量名正确的是( )。

A.@sum B.j C.sum D.4kk 选择题答案:

(1) B (2) A (3) C (4) C (5) B (6) A (7) D (8) C (9) C (10) B

(11) A (12) D (13) A (14) D (15) C (16) A (17) B (18) D (19)B(20)D (21)D(22)B(23)C(24)A(25)A(26)D(27)B(28)A

二、填空题

1. 在T-SQL编程语句中,WHILE结构可以根据条件多次重复执行一条语句或一个语句块,还可以使用 ( ) 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

2. 在T-SQL编程语句中,( )用于使语句在某一时刻或在一段时间间隔后继续执行。

1.break 2.waitfor

三、简答题

1. 试述SQL语言的特点. 答:

(1)综合统一. SQL语言集数据定义语言DDL,数据操纵语言DML,数据控制语言DCL的功能于一体.

(2)高度非过程化.用SQL语言进行数据操作,只要提出\做什么\而无须指明\怎么做\因此无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成.

(3)面向集合的操作方式.SQL语言采用集合操作方式,不仅操作对象,查找结果可以是元组的集合,而且一次插入,删除,更新操作的对象也可以是元组的集合.

(4)以同一种语法结构提供两种使用方式.SQL语言既是自含式语言,又是嵌入式语言.作为自含式语言,它能够独立地用于联机交互的使用方式,也能够嵌入到高级语言程序中,供程序员设计程序时使用.

(5)语言简捷,易学易用. 2. 试述SQL的定义功能.

答: SQL的数据定义功能包括定义表,定义视图和定义索引.

SQL语言使用CREATE TABLE语句定义建立基本表,;ALTER TABLE语句修改基本表定义,DROP TABLE语句删除基本表;建立索引使用CREATE INDEX语句建立索引, DROP INDEX语句删除索引表;SQL语言使用CREATE VIEW命令建立视图,DROP VIEW语句删除视图.

3. 用SQL语句建立“关系数据库和关系代数 课堂练习和习题”中的四个表. 答: 对于S表:S( SNO,SNAME,STATUS,CITY); 建S表 :

CREATE TABLE S (SNO CHAR(3), SNAME CHAR(10), STATUS CHAR(2), CITY CHAR(10));

P(PNO,PNAME,COLOR,WEIGHT); 建P表 :

CREATE TABLE P (PNO CHAR(3), PNAME CHAR(10), COLOR CHAR(4), WEIGHT INT);

J(JNO,JNAME,CITY); 建J表 :

CREATE TABLE J (JNO CHAR(3), JNAME CHAR(10), CITY CHAR(10));

SPJ(SNO,PNO,JNO,QTY); 建SPJ表 :

CREATE TABLE SPJ (SNO CHAR(3), PNO CHAR(3), JNO CHAR(3), QTY INT);

4. 针对上题中建立的四个表试用SQL语言完成“关系数据库和关系代数 课堂练习和习题”的查询.

答: (1) 求供应工程J1零件的供应商号码SNO; SELECT SNO FROM SPJ

WHERE JNO='J1';

(2) 求供应工程J1零件P1的供应商号码SNO; SELECT SNO FROM SPJ

WHERE JNO='J1' AND PNO='P1';

(3) 求供应工程J1零件为红色的供应商号码SNO; SELECT SNO FROM SPJ

WHERE JNO='J1' AND PNO IN (SELECT PNO FROM P

WHERE COLOR='红'); 或

SELECT SNO FROM SPJ,P

WHERE JNO='J1' AND SPJ.PNO=P.PNO AND COLOR='红'; *(4) 求没有使用天津供应商生产的红色零件的工程号JNO; 解析:

用SQL语言表示如下: SELECT JNO FROM J

WHERE NOT EXISTS (SELECT * FROM SPJ

WHERE SPJ.JNO=J.JNO AND SNO IN (SELECT SNO FROM S

WHERE CITY='天津') AND PNO IN (SELECT PNO FROM P

WHERE COLOR='红')); 或

SELECT JNO FROM J

WHERE NOT EXISTS (SELECT *

(

@a char(8),@b varchar(10),@c numeric(5,2) ) as begin

insert into score

values(@a,@b,@c) end

15.create procedure xxk6 (

@a char(8),@b varchar(10) ) as begin

delete from score

where 学号=@a and 课程名=@b end

16.eclare @a char(8),@b varchar(10),@c numeric(5,2) declare @d int set @d=0

declare xxx cursor

for select 学号,课程名,成绩 from score open xxx

fetch xxx into @a,@b,@c while @@fetch_status=0 begin

set @d=@d+1

fetch from xxx into @a,@b,@c end close xxx deallocate xxx print @d

17.declare @a char(8),@b varchar(10),@c numeric(5,2) declare xxx cursor

for select 学号,课程名,成绩 from score open xxx

fetch xxx into @a,@b,@c while @@fetch_status=0 begin

print @a+replicate(' ',3)

+@b+str(@c)+replicate(' ',3) +(case

when @c>=90 then '优秀' when @c>=70 then '良好' when @c>=60 then '及格' else '不及格' end )

fetch from xxx into @a,@b,@c end close xxx deallocate xxx

18.declare @c numeric(5,2)

declare @c1 int, @c2 int, @c3 int, @c4 int set @c1=0; set @c2=0; set @c3=0; set @c4=0 declare xxx cursor

for select 成绩 from score open xxx

fetch xxx into @c

while @@fetch_status=0 begin

if(@c>=90) set @c1=@c1+1;

else if(@c>=70) set @c2=@c2+1; else if(@c>=60) set @c3=@c3+1; else set @c4=@c4+1 fetch from xxx into @c end close xxx deallocate xxx

print '优秀生人数:'+str(@c1,5); print '良好生人数:'+str(@c2,5); print '及格生人数:'+str(@c3,5); print '及格生人数:'+str(@c4,5)

19.declare @a char(8),@b varchar(10) declare @c numeric(5,2) declare @d int set @d=80

declare xxx cursor

for select 学号,课程名,成绩 from score open xxx

fetch xxx into @a,@b,@c while @@fetch_status=0 begin

if(@c>=@d) print @a+replicate(' ',3)+@b+str(@c,5) fetch from xxx into @a,@b,@c end close xxx deallocate xxx

20.declare @a char(8),@b varchar(10),@c numeric(5,2) declare @s char(8),@r varchar(10) set @s='20030001' set @r='数学' set @c=84

declare xxx cursor

for select 学号,课程名 from score open xxx

fetch xxx into @a,@b while @@fetch_status=0 begin

if(@a=@s and @b=@r) update score set 成绩=@c

where current of xxx

fetch from xxx into @a,@b end close xxx deallocate xxx 参考答案:

1. 从Students表中查询出所有当年(系统时间)入学的学生记录。

2. 首先定义一个名为@MyNo的局部变量,并给它赋初值,如果@MyNo属于计算机软件专业,则显示出平均成绩,否则显示“学号为@MyNo的学生不存在或不属于软件专业”。 3. 从score表中查询出大于等于平均成绩的所有记录。 4. 求出score表中最高成绩与最低成绩的分数之差。

5. 从students表中查询姓名为@a的值的同学是否存在,根据不同情况显示出相应信息。 6. 从students表中统计出专业名开头为@a的值(即“计算机”)的所有学生人数。 7. 从students表中分组统计出每个年份入学的学生人数。 8. 从students表中分组统计出每个月份入学的学生人数。 9. 从students表中分组统计出每个日号入学的学生人数。 10. 显示出AAA库中所有学生的记录信息及选课成绩

11. 显示出AAA库中每个学生的学号、姓名、专业等信息及选课门数 12. 显示出AAA库中每个学生的平均成绩

13. 修改score表中学号为@a的值、课程名为@b的值的学生的成绩为@c的值。

14. 向score表中插入学号为@a的值、课程名为@b的值、成绩为@c的值的学生成绩记

录。

15. 从score表中删除学号为@a的值、课程名为@b的值的学生成绩记录。 16. 从score表中统计并显示出记录总数

17. 显示出score表中每个成绩记录,并在每条记录最后给出优秀、良好、及格、不及格等相应等级。

18. 从score表中按成绩统计并显示出优秀、良好、及格、不及格各多少人。 19. 显示出score表中成绩大于等于@d值的所有记录。

20. 修改score表中学号为@a的值、课程名为@b的值的学生的成绩为@c的值。

五、问题描述:本题用到下面三个关系表:

CARD (CNO,NAME,CLASS) 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级 BOOKS(BNO,BNAME,AUTHOR,PRICE,QUANTITY ) 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数

BORROW( CNO,BNO ,RDATE ) 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

要求实现如下15个处理:

1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束。 2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。 3. 查询借阅了\水浒\一书的读者,输出姓名及班级。 4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期。 5. 查询书名包括\网络\关键词的图书,输出书号、书名、作者。 6. 查询现有图书中价格最高的图书,输出书名及作者。

7. 查询当前借了\计算方法\但没有借\计算方法习题集\的读者,输出其借书卡号,并按卡号降序排序输出。

8. 将\班同学所借图书的还期都延长一周。 9. 从BOOKS表中删除当前无人借阅的图书记录。 10.如果经常按书名查询图书信息,请建立合适的索引。

11.在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是\数据库技术及应用\,就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)。

12.建立一个视图,显示\力01\班学生的借书信息(只要求显示姓名和书名)。

13.查询当前同时借有\计算方法\和\组合数学\两本书的读者,输出其借书卡号,并按卡号升序排序输出。

14.假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句。 15.对CARD表做如下修改:

a. 将NAME最大列宽增加到10个字符(假定原为6个字符)。 b. 为该表增加1列NAME(系名),可变长,最大20个字符。

参考答案:(未上机验证)

1. 写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束 CREATE TABLE BORROW( CNO int FOREIGN KEY REFERENCES CARD(CNO), BNO int FOREIGN KEY REFERENCES BOOKS(BNO), RDATE datetime, PRIMARY KEY(CNO,BNO)) 2. 找出借书超过5本的读者,输出借书卡号及所借图书册数 SELECT CNO,借图书册数=COUNT(*) FROM BORROW GROUP BY CNO HAVING COUNT(*)>5 3. 查询借阅了\水浒\一书的读者,输出姓名及班级 SELECT * FROM CARD c WHERE EXISTS( SELECT * FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME=N'水浒' AND a.CNO=c.CNO) 4. 查询过期未还图书,输出借阅者(卡号)、书号及还书日期 SELECT * FROM BORROW WHERE RDATE

6. 查询现有图书中价格最高的图书,输出书名及作者 SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE PRICE=( SELECT MAX(PRICE) FROM BOOKS) 7. 查询当前借了\计算方法\但没有借\计算方法习题集\的读者,输出其借书卡号,并按卡号降序排序输出 SELECT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME=N'计算方法' AND NOT EXISTS( SELECT * FROM BORROW aa,BOOKS bb WHERE aa.BNO=bb.BNO AND bb.BNAME=N'计算方法习题集' AND aa.CNO=a.CNO) ORDER BY a.CNO DESC 8. 将\班同学所借图书的还期都延长一周 UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE) FROM CARD a,BORROW b WHERE a.CNO=b.CNO AND a.CLASS=N'C01' 9. 从BOOKS表中删除当前无人借阅的图书记录 DELETE A FROM BOOKS a WHERE NOT EXISTS( SELECT * FROM BORROW WHERE BNO=a.BNO) 10. 如果经常按书名查询图书信息,请建立合适的索引 CREATE CLUSTERED INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME) 11. 在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是\数据库技术及应用\,就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表) CREATE TRIGGER TR_SAVE ON BORROW FOR INSERT,UPDATE AS IF @@ROWCOUNT>0 INSERT BORROW_SAVE SELECT i.* FROM INSERTED i,BOOKS b WHERE i.BNO=b.BNO AND b.BNAME=N'数据库技术及应用' 12. 建立一个视图,显示\力01\班学生的借书信息(只要求显示姓名和书名) CREATE VIEW V_VIEW AS SELECT a.NAME,b.BNAME FROM BORROW ab,CARD a,BOOKS b WHERE ab.CNO=a.CNO AND ab.BNO=b.BNO AND a.CLASS=N'力01' 13. 查询当前同时借有\计算方法\和\组合数学\两本书的读者,输出其借书卡号,并按卡号升序排序输出 SELECT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME IN(N'计算方法',N'组合数学') GROUP BY a.CNO HAVING COUNT(*)=2 ORDER BY a.CNO DESC 14. 假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句 ALTER TABLE BOOKS ADD PRIMARY KEY(BNO) 15.1 将NAME最大列宽增加到10个字符(假定原为6个字符) ALTER TABLE CARD ALTER COLUMN NAME varchar(10) 15.2 为该表增加1列NAME(系名),可变长,最大20个字符 ALTER TABLE CARD ADD 系名 varchar(20)

六、综合操作题

1. 用SQL的有关语句定义 1) 学生关系Student,包括学号Sno、姓名SN、年龄SA; 2) 课程关系Course,包括课程号Cno、课程名CN、任课教师CT; 3) 学生选课关系,包括Sno、Cno和成绩G。 注意:说明主键码和外键码(如果有的话),并在键码属性上建立索引。 2. 按题1的学生关系模式,用SQL的有关语句 1) 授予赵华对学生关系Student的插入和修改权限; 2) 插入任意3个学生的完整信息; 3) 修改所有学生的年龄(加1)。 3. 结合题1定义的学生选课数据库,用SQL语句查询计算机系学生数据库课的成绩,输出学生姓名和成绩,按成绩排序(降序),若成绩相同,再按学号排序(升序)。 4. 按嵌入式SQL的格式插入任意一个学生的学号、姓名、系别和年龄。 5. 商店销售商品的数据库,涉及如下数据: 商店号、商店名、地址 商品号、商品名、单价。 某商店销售某商品的数量和日期。 1) 设计E/R图(属性名用中、英文均可); 2) 转换成关系模型(注明键码和函数依赖)。 6. 有关图书发行的关系模型如下: 书店S(书店号SNo,书店名SN,地址A) dngz.net您的电脑医生 图书B(书号BNo,书名BN,价格P) 图书馆L(馆号LNo,馆名LN,城市C) 图书发行LBS(LNo,BNo,SNo,发行量Q) 分别用关系代数和SQL语言表达如下查询: 图书馆L4(馆号)收藏图书的书名和出售该书的书店名。

本文来源:https://www.bwwdw.com/article/r8jr.html

Top