SQL语言习题及答案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“sql语言习题及答案”。
数据库原理之关系数据库SQL语言课后习题及答案
http://www.daodoc.comAME,TEACHER)
试用SQL的查询语句表达下列查询:
(1)检索LIU老师所授课程的课程号和课程名。
SELECT C#,CNAME
FROM C
WHERE TEACHER=„LIU‟
(2)检索年龄大于23岁的男学生的学号和姓名。
SELECT S#,SNAME
FROM S
WHERE(AGE>23)AND(SEX=„M‟)
(3)检索至少选修LIU老师所授课程中一门课程的女学生姓名。
SELECT SNAME
FROM S
WHERE SEX=„F‟ AND S# IN
(SELECT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER=„LIU‟)
NOTICE:有多种写法,比如联接查询写法:
SELECT SNAME
FROM S,SC,C
WHERE SEX=„F‟ AND SC.S#=S.S#
AND SC.C#=C.C#
AND TEACHER='LIU' 但上一种写法更好一些。
(4)检索WANG同学不学的课程的课程号。
SELECT C#
FROM C
WHERE C# NOT IN
(SELECT C#
FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG'))
(5)检索至少选修两门课程的学生学号。
SELECT DISTINCT X.SNO
FROM SC X,SC Y
WHERE X.SNO=Y.SNO AND X.CNOY.CNO Notice:对表SC进行自连接,X,Y是SC的两个别名。
(6)检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAME
FROM C
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#))
要从语义上分解:(1)选择课程的课程号与课程名,不存在不选这门课的同学。
其中,“不选这门课的同学”可以表示为:
或者
SELECT *
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE S.S#=C.S#
AND SC.C#=C.C#)
SELECT *
FROM S
WHERE S# NOT IN
(SELECT *
FROM SC
WHERE SC.C#=C.C#)
(7)检索选修课程包含LIU老师所授课的学生学号。
SELECT DISTINCT S#
FROM SC
WHERE C# IN
(SELECT C#
FROM C
WHERE TEACHER='LIU'))
3.3 设有两个基本表R(A,B,C)和S(D,E,F),试用SQL查询语句表达下列关系代数表达式:
(1)πA(R)
(2)σB='17'(R)
(3)R×S
(4))πA,F(σC=D(R×S))
(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B='17'(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D
3.4 3.4 设有两个基本表R(A,B,C)和S(A,B,C)试用SQL查询语句表达下列关系代数表达式:
(1)R∪S
(2)R∩S
(3)R-S
(4)πA,B(R)πB,C(S)
(1)SELECT A,B,C
FROM R
UNION
SELECT A,B,C
FROM S
(2)SELECT A,B,C
FROM R
INTERSECT
SELECT A,B,C
FROM S
(3)SELECT A,B,C
FROM R
WHERE NOT EXISTS
(SELECT A,B,C
FROM S
WHERE R.A=S.A AND R.B=S.B AND R.C=S.C)
(4)SELECT R.A,R.B,S.C
FROM R,S
WHERE R.B=S.B
3.5 试叙述SQL语言的关系代数特点和元组演算特点。
(P61-62)
3.6 试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:
(1)统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#)FROM SC
(2)求选修C4课程的学生的平均年龄。
SELECT AVG(AGE)
FROM S
WHERE S# IN
(SELECT S#
FROM SC
WHERE C#='C4')或者,SELECT AVG(AGE)
FROM S,SC
WHERE S.S#=SC.S# AND C#='004'
(3)求LIU老师所授课程的每门课程的学生平均成绩。
SELECT CNAME,AVG(GRADE)
FROM SC ,C
WHERE SC.C#=C.C# AND TEACHER='LIU'
GROUP BY C#
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT DISTINCT C#,COUNT(S#)
FROM SC
GROUP BY C#
HAVING COUNT(S#)>10
ORDER BY 2 DESC, C# ASC
(5)检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT X.SNAME
FROM S AS X, S AS Y
WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE
(6)检索姓名以WANG打头的所有学生的姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SNAME LIKE 'WANG%'
(7)在SC中检索成绩为空值的学生学号和课程号。
SELECT S#,C#
FROM SC
WHERE GRADE IS NULL
(8)求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')
(9)求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE X.SEX='男' AND X.AGE>ALL(SELECT AGE FROM S AS Y WHERE Y.SEX='女')
3.7 试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作:
(1)往基本表S中插入一个学生元组(„S9‟,„WU‟,18)。
INSERT INTO S(S#,SNAME,AGE)VALUES('59','WU',18)
(2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别,并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。
INSERT INTO STUDENT(S#,SNAME,SEX)
SELECT S#,SNAME,SEX
FROM S WHERE NOT EXISTS
(SELECT * FROM SC WHERE
GRADE
(3)在基本表SC中删除尚无成绩的选课元组。
DELETE FROM SC
WHERE GRADE IS NULL
(4)把WANG同学的学习选课和成绩全部删去。
DELETE FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG')
(5)把选修MATHS课不及格的成绩全改为空值。
UPDATE SC
SET GRADE=NULL
WHERE GRADE
(SELECT C#
FROM C
WHERE CNAME='MATHS')(6)把低于总平均成绩的女同学成绩提高5%。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE GRADE
(7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDATE语句实现)。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE C#='C4' AND GRADE
UPDATE SC
SET GRADE=GRADE*1.04
WHERE C#='C4' AND GRADE>75
3.8 在第1章例1.4中提到“仓库管理”关系模型有五个关系模式:
零件 PART(P#,PNAME,COLOR,WEIGHT)
项目 PROJECT(J#,JNAME,DATE)
供应商 SUPPLIER(S#,SNAME,SADDR)
供应 P_P(J#,P#,TOTOAL)
采购 P_S(P#,S#,QUANTITY)
(1)试用SQL DDL语句定义上述五个基本表,并说明主键和外键。
CREATE TABLE PART
(P# CHAR(4)NOT NULL,PNAME CHAR(12)NOT NULL,COLOR CHAR(10),WEIGHT REAL,PRIMARY KEY(P#))
CREATE TABLE PROJECT
(J# CHAR(4)NOT NULL,JNAME CHAR(12)NOT NULL,DATE DATE,PRIMARY KEY(J#))
CREATE TABLE SUPLIER
(S# CHAR(4)NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),PRIMARY KEY(S#))
CREATE TABLE P_P
(J# CHAR(4),P# CHAR(4),TOTAL INTEGER,PRIMARY KEY(J#,P#),FOREIGN KEY(J#)REFERENCE PROJECT(J#),FOREIGN KEY(P#)REFERENCE PART(P#))
CREATE TABLE P_S
(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,PRIMARY KEY(P#,S#),FOREIGN KEY(P#)REFERENCE PART(P#),FOREIGN KEY(S#)REFERENCE SUPLIER(S#))
(2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。
CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
FROM PROJECT,PART,P_P
WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J
#
CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)
AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
FROM PART,P_S,SUPPLIER
WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#
(3)试在上述两个视图的基础上进行数据查询:
1)检索上海的供应商所供应的零件的编号和名字。
SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'
2)检索项目J4所用零件的供应商编号和名字。
SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')
3.9 对于教学数据库中基本表SC,已建立下列视图:
CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)
AS SELECT S#,COUNT(C#),AVG(GRADE)
FROM SC
GROUP BY S#
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作。
(1)SELECT *
FROM S_GRADE
允许
SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#
(2)SELECT S#,C_NUM
FROM S_GRADE
WHERE AVG_GRADE>80
允许
SELECT S#,COUNT(C#)FROM SC WHERE AVG(GRADE)>80
(3)SELECT S#,AVG_GRADE
FROM S_GRADE
WHERE C_NUM>(SELECT C_NUM
FROM S_GRADE
WHERE S#=„S4‟)
允许
SELECT S#,AVG(GRADE)
FROM SC AS X
WHERE COUNT(X.C#)>(SELECT COUNT(Y.C#)FROM SC AS Y WHERE Y.S#='S4')
GROUP BY S#
(4)UPDATE S_GRADE
SET C_NUM=C_NUM+1
WHERE S#=„S4‟
不允许
(5)DELETE FROM S_GRADE
WHERE C_NUM>
4不允许
3.10 预处理方式对于嵌入式SQL的实现有什么重要意义? 预处理方式是先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成宿主语言的函数调用形式; 然后再用宿主语言的编译程序把源程序编译成目标程序。这样,不用扩充宿主语言的编译程序,就能处理SQL语句。
3.11 在宿主语言的程序中使用SQL语句有哪些规定?
在宿主语言的程序中使用SLQ语句有以下规定:
(1)在程序中要区分SQL语句与宿主语言语句
(2)允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定:
1)引用时,这些变量前必须加“:”作为前缀标识,以示与数据库中变量有区别。
2)这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。
(3)SQL的集合处理方式与宿主语言单记录处理方式之间要协调。需要采用游标机制,把集合操作转换成单记录处理方式。
3.12 SQL的集合处理方式与宿主语言单记录处理方式之间如何协调?
由于SQL语句处理的是记录集合,而宿主语言语句一次只能处理一个记录,因此需要用游标(cousor)机制,把集合操作转换成单记录处理方式。
2.13 嵌入式SQL语句何时不必涉及到游标?何时必须涉及到游标?
(1)INSERT、DELETE、UPDATE语句,查询结果肯定是单元组时的SELECT语句,都可直接嵌入在主程序中使用,不必涉及到游标。
(2)当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用,一定要用游标机制把多个元组一次一个地传送给宿主语言处理。