(4)查询“数据库原理”课程的最高分数。 (5)查询平均成绩80分以上的学生姓名。
(6)查询名称中包含“数据”的课程的详细信息。
(7)查询选修“数据库原理”课程成绩85分以上的学生的姓名和所在班级。 (8)查询没有选修“数据库原理”课程的学生姓名和所在班级。 (9)查询被所有“计算机091”班学生选修的课程的课程名称和学时。 (10)查询“计算机091”班“数据库原理”成绩最高的学生姓名。
(11)查询年龄超过其所在班级平均年龄的学生的姓名、性别、年龄和所在班级。 (12)向STUDENT表中插入一条新的学生记录(0905050105,周晓斌,19,男,计算机091)。
(13)所有“计算机091”班学生的“数据库原理”课程的成绩提高5%。 (14)删除“编译原理”课程的所有选课信息。
(15)向COURSE表中插入一条新的课程记录(050804,数字图像处理,48),暂不指定任课教师。
参考答按:
(1)SELECT CNO, CNAME, CHOUR
FROM COURSE
WHERE CTEACHER='刘晓莉';
(2)SELECT SNAME
FROM STUDENT
WHERE SNO IN (SELECT SNO FROM SC WHERE GRADE<60);
(3)SELECT SNO, SNAME, SAGE, SCLASS
FROM STUDENT
WHERE SSEX='男' AND SAGE BETWEEN 18 AND 20;
(4)SELECT MAX(GRADE) 最高分数
FROM SC
WHERE CNO IN (SELECT CNO FROM COURSE WHERE CNAME='数据库原理');
(5)SELECT SNAME FROM STUDENT
WHERE SNO IN (SELECT SNO FROM SC GROUP BY SNO
HAVING AVG(GRADE)>80);
(6)SELECT * FROM COURSE
WHERE CNAME LIKE '%数据%';
(7)SELECT SNAME, SCLASS
FROM STUDENT JOIN SC ON SC.SNO=STUDENT.SNO JOIN COURSE ON SC.CNO=COURSE.CNO WHERE CNAME='数据库原理' AND GRADE>85;
(8)SELECT SNAME, SCLASS FROM STUDENT
WHERE SNO NOT IN (SELECT SNO FROM SC
WHERE CNO IN (SELECT CNO FROM COURSE WHERE CNAME='数据库原理'));
(9)SELECT CNAME, CHOUR FROM COURSE
WHERE NOT EXISTS (SELECT * FROM STUDENT
WHERE SCLASS='计算机091' AND NOT EXISTS ( SELECT * FROM SC
WHERE SC.CNO=COURSE.CNO AND SC.SNO=STUDENT.SNO));
(10)SELECT SNAME FROM STUDENT
WHERE SCLASS='计算机091' AND SNO IN ( SELECT SNO FROM SC
WHERE CNO IN (SELECT CNO FROM COURSE WHERE CNAME='数据库原理') AND GRADE=(SELECT MAX(GRADE) FROM SC
WHERE CNO IN (SELECT CNO FROM COURSE WHERE CNAME='数据库原理') AND SNO IN (SELECT SNO FROM STUDENT WHERE SCLASS='计算机091')));
(11)SELECT SNAME, SSEX, SAGE, SCLASS
FROM STUDENT S1
WHERE SAGE>(SELECT AVG(SAGE) FROM STUDENT S2 WHERE S2.SCLASS=S1.SCLASS);
(12)INSERT INTO STUDENT
VALUES('0905050105', '周晓斌', 19, '男', '计算机091');
(13)UPDATE SC SET GRADE=GRADE*1.05
WHERE SNO IN (SELECT SNO FROM STUDENT
WHERE SCLASS='计算机091')
AND CNO IN (SELECT CNO FROM COURSE
WHERE CNAME='数据库原理');
(14)DELETE FROM SC
WHERE CNO IN (SELECT CNO FROM COURSE WHERE CNAME='编译原理');
(15)INSERT INTO COURSE(CNO, CNAME, CHOUR)
VALUES('050804', '数字图像处理', 48);
4.试说明视图的优点。
参考答案:(1)简化用户的操作;(2)使用户能够从不同角度看待同一数据;(3)提供一定程度的逻辑独立性;(4)有助于对数据提供安全保护。
5.根据第2题中的三个表,创建一个 “计算机091”班学生的选课视图V_Computer091,要求视图中包括学号、姓名、课程名称和成绩等属性。
参考答案:
CREATE VIEW V_Computer091(SNO, SNAME, CNAME, GRADE) AS
SELECT STUDENT.SNO, SNAME, CNAME, GRADE FROM STUDENT JOIN SC ON SC.SNO=STUDENT.SNO JOIN COURSE ON SC.CNO=COURSE.CNO WHERE SCLASS='计算机091';
6.利用第5题创建的视图,使用SQL完成如下查询。
(1)查询“计算机091”班选修“数据库原理”课程的学生姓名及该课程的成绩。 (2)查询“计算机091”班每个学生的学号、姓名和平均成绩。 (3)查询“计算机091”班选课超过3门的学生姓名。 参考答案:
(1)SELECT SNAME, GRADE FROM V_Computer091
WHERE CNAME='数据库原理';
(2)SELECT SNO, SNAME, AVG(GRADE) 平均成绩
FROM V_Computer091 GROUP BY SNO, SNAME;
(3)SELECT SNAME FROM V_Computer091
WHERE SNO IN (SELECT SNO FROM V_Computer091 GROUP BY SNO
HAVING COUNT(*)>3);
7.上机实践:在SQL Server 2008数据库引擎中创建一个包含第2题中三个表的数据库(要满足该题的所有要求),输入如图4-29所示的数据,在查询编辑器中,编写SQL语句完成第3题的所有操作,并查看运行结果。
答:本题的参考代码详见第3题答案。
第5章 T-SQL程序设计基础
1.T-SQL的常量有几种?变量有几种?分别如何表示? 参考答案:
常量包括:字符串常量,例如'China';二进制常量,例如0x12Ef;日期/时间常量,例如'2010-12-05 14:23:05';数值量常量,例如235,3.45,$12。
变量包括局部变量和全局变量,局部变量以@开头,例如@number;全局变量,以@@开头,例如@@rowcount。
2.编写程序,求5! 参考答案:
DECLARE @a INT,@b INT SET @a=1 SET @b=1 WHILE(@a<=5) BEGIN
SET @b=@a*@b SET @a=@a+1 END PRINT @b
3.编写一个函数,功能是:输入两个整数,输出其中较小的一个。 参考答案:
CREATE FUNCTION comparedTwo(@a INT, @b INT) RETURNS INT AS BEGIN
DECLARE @small INT IF(@a<@b) SET @small=@a ELSE
SET @small=@b RETURN @small END GO
DECLARE @smallone INT, @aa INT, @bb INT SET @aa=3 SET @bb=5
SET @smallone=[student].dbo.comparedTwo(@aa,@bb) PRINT @smallone
4.编写一个函数,功能是:输入一个字符串,将该字符串倒序输出,例如,输入字符串'happy',则输出字符串'yppah'。
参考答案:
CREATE FUNCTION reversion(@str VARCHAR(200)) RETURNS VARCHAR(200) AS BEGIN
DECLARE @ret varchar(200) DECLARE @i int SET @ret='' SET @i=LEN(@str) WHILE (@i>0) BEGIN
SET @ret=@ret+SUBSTRING(@str,@i,1) SET @i=@i-1 END
RETURN @ret END GO
SELECT dbo.reversion('OMG')
5.编写一个函数elimin(c1, c2),将字符串c1中所有出现在c2的字符删除并输出c1,例如,如果有elimin('student', 'ent'),则应输出字符串'sud'。
参考答案:
CREATE FUNCTION elimin(@c1 VARCHAR(200),@c2 VARCHAR(200)) RETURNS VARCHAR(200) AS BEGIN
DECLARE @i INT SET @i=1
WHILE(@i SET @c1=REPLACE(@c1,SUBSTRING(@c2,@i,1),'') SET @i=@i+1 END RETURN @c1 END GO SELECT dbo.elimin('student', 'ent') 6.编写一个函数,功能是将指定的时间显示为XX年XX月XX日。 参考答案: CREATE FUNCTION formatdate(@date DATETIME)