T-SQL 语句练习:学生信息管理系统
T-SQL 语句练习:学生信息管理系统
本练习使用 T-SQL 语句对学生信息进行操作,涵盖了内连接、外连接、派生表、子查询、分组统计、排序、分页等 SQL 语句知识点。
数据库表结构:
- STUDENT 表:存储学生信息,包含学号 (sno)、姓名 (sname)、性别 (ssex)、年龄 (sage)、所在系 (sdept)
- COURSE 表:存储课程信息,包含课程号 (cno)、课程名 (cname)、学分 (ccredit)
- SC 表:存储学生选课信息,包含学号 (sno)、课程号 (cno)、成绩 (grade)
练习题目:
-
在 STUDENTSCORE 数据库下,将 STUDENT 表中计算机系的学生信息放入一张名为 JSJSTUDENT 的新表中,新表中的属性包含(学号,姓名,性别,年龄)。 提示:请使用 INTO 子句实现该操作。 正确语句:
INSERT INTO JSJSTUDENT (学号, 姓名, 性别, 年龄) SELECT 学号, 姓名, 性别, 年龄 FROM STUDENT WHERE 所在系 = '计算机系'; -
查询 JSJSTUDENT 表,将年龄最大的 3 位学生的信息放入一张本地临时表中(临时表名可与基本表名相同)。查询临时表,查看年龄最大的 3 位学生信息。 正确语句:
SELECT TOP 3 学号, 姓名, 性别, 年龄 INTO #JSJSTUDENT FROM JSJSTUDENT ORDER BY 年龄 DESC; SELECT 学号, 姓名, 性别, 年龄 FROM #JSJSTUDENT ORDER BY 年龄 DESC; -
查询计算机系学生选修课程的信息。结果显示学号,姓名,性别,选修课程名和成绩。(请使用显式内连接和派生表查询两种方式完成) 正确语句:
- 显式内连接:
SELECT S.学号, S.姓名, S.性别, C.课程名, SC.成绩 FROM STUDENT AS S INNER JOIN SC ON S.学号 = SC.学号 INNER JOIN COURSE AS C ON SC.课程号 = C.课程号 WHERE S.所在系 = '计算机系';- 派生表查询:
SELECT S.学号, S.姓名, S.性别, C.课程名, SC.成绩 FROM (SELECT 学号, 姓名, 性别 FROM STUDENT WHERE 所在系 = '计算机系') AS S INNER JOIN SC ON S.学号 = SC.学号 INNER JOIN COURSE AS C ON SC.课程号 = C.课程号; -
查询没有选修课程的学生学号,姓名和所在系。(请使用外连接方式完成) 正确语句:
- 左连接:
SELECT S.学号, S.姓名, S.所在系 FROM STUDENT AS S LEFT JOIN SC ON S.学号 = SC.学号 WHERE SC.学号 IS NULL;- 子查询:
SELECT S.学号, S.姓名, S.所在系 FROM STUDENT AS S WHERE NOT EXISTS (SELECT 1 FROM SC WHERE S.学号 = SC.学号); -
查询有哪些课程没有人选修,结果显示课程号,课程名和学分。(请使用外连接和嵌套查询两种方式完成) 正确语句:
- 左连接:
SELECT C.课程号, C.课程名, C.学分 FROM COURSE AS C LEFT JOIN SC ON C.课程号 = SC.课程号 WHERE SC.学号 IS NULL;- 子查询:
SELECT C.课程号, C.课程名, C.学分 FROM COURSE AS C WHERE NOT EXISTS (SELECT 1 FROM SC WHERE C.课程号 = SC.课程号); -
统计每名学生选修课程的门数和平均分,显示学生学号,姓名,所在系和选课门数及课程平均分。结果显示选课门数排名前 3 的学生信息。 正确语句:
SELECT S.学号, S.姓名, S.所在系, COUNT(SC.课程号) AS 选课门数, AVG(SC.成绩) AS 平均分 FROM STUDENT AS S LEFT JOIN SC ON S.学号 = SC.学号 GROUP BY S.学号, S.姓名, S.所在系 ORDER BY 选课门数 DESC OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY; -
统计除 2 号课程外的其它课程的选课人数和平均分,显示课程号,课程名,学分,选课人数及平均分。最后结果中要包含 2 号课程的信息。 正确语句:
SELECT SC.课程号, C.课程名, C.学分, COUNT(SC.学号) AS 选课人数, AVG(SC.成绩) AS 平均分 FROM SC INNER JOIN COURSE AS C ON SC.课程号 = C.课程号 WHERE SC.课程号 <> '2号课程' GROUP BY SC.课程号, C.课程名, C.学分 UNION ALL SELECT C.课程号, C.课程名, C.学分, 0 AS 选课人数, 0 AS 平均分 FROM COURSE AS C WHERE C.课程号 = '2号课程'; -
查询选修每门课程的男女生人数和平均分,结果显示课程号、性别、选课人数和平均分。(在 GROUP BY 子句中使用 WITH ROLLUP 和 WITH CUBE 短语,比较结果) 正确语句:
- WITH ROLLUP:
SELECT SC.课程号, S.性别, COUNT(SC.学号) AS 选课人数, AVG(SC.成绩) AS 平均分 FROM SC INNER JOIN STUDENT AS S ON SC.学号 = S.学号 GROUP BY SC.课程号, S.性别 WITH ROLLUP;- WITH CUBE:
SELECT SC.课程号, S.性别, COUNT(SC.学号) AS 选课人数, AVG(SC.成绩) AS 平均分 FROM SC INNER JOIN STUDENT AS S ON SC.学号 = S.学号 GROUP BY SC.课程号, S.性别 WITH CUBE; -
查询所有学生的信息,结果统计总人数和平均年龄。(可使用 COMPUTE 子句或使用批处理) 正确语句:
- COMPUTE 子句:
SELECT COUNT(*) AS 总人数, AVG(年龄) AS 平均年龄 FROM STUDENT COMPUTE SUM(COUNT(*)), AVG(年龄);- 批处理:
SELECT COUNT(*) AS 总人数, AVG(年龄) AS 平均年龄 FROM STUDENT GROUP BY () WITH ROLLUP; -
查询每个学生选修课程的信息(学号、姓名、课程号、成绩),并统计每个学生选修的课程数和平均分。(可使用 COMPUTE BY 子句或使用批处理) 正确语句:
- COMPUTE BY 子句:
SELECT S.学号, S.姓名, SC.课程号, SC.成绩, COUNT(SC.课程号) AS 选修课程数, AVG(SC.成绩) AS 平均分 FROM STUDENT AS S INNER JOIN SC ON S.学号 = SC.学号 GROUP BY S.学号, S.姓名, SC.课程号, SC.成绩 WITH ROLLUP;- 批处理:
SELECT S.学号, S.姓名, SC.课程号, SC.成绩, COUNT(SC.课程号) AS 选修课程数, AVG(SC.成绩) AS 平均分 FROM STUDENT AS S INNER JOIN SC ON S.学号 = SC.学号 GROUP BY S.学号, S.姓名, SC.课程号, SC.成绩 WITH COMPUTE BY SC.课程号, S.学号, S.姓名; -
查询选修了 '数据库' 课程的计算机系学生信息,显示学生学号,姓名和成绩。要求最后结果中成绩以等级制显示。(90 分以上为'优秀',80-90 分为'良好',70-80 分为'中等',60-70 分为'及格',60 分以下为'不及格') 正确语句:
SELECT S.学号, S.姓名, CASE WHEN SC.成绩 >= 90 THEN '优秀' WHEN SC.成绩 >= 80 THEN '良好' WHEN SC.成绩 >= 70 THEN '中等' WHEN SC.成绩 >= 60 THEN '及格' ELSE '不及格' END AS 成绩等级 FROM STUDENT AS S INNER JOIN SC ON S.学号 = SC.学号 INNER JOIN COURSE AS C ON SC.课程号 = C.课程号 WHERE S.所在系 = '计算机系' AND C.课程名 = '数据库'; -
将计算机系学生的所有成绩都降低 5 分。(请在更新语句中使用子查询和 FROM 子句两种方式实现) 正确语句:
- 子查询:
UPDATE SC SET 成绩 = (SELECT 成绩 - 5 FROM SC AS SC2 WHERE SC.学号 = SC2.学号) WHERE 学号 IN (SELECT 学号 FROM STUDENT WHERE 所在系 = '计算机系');- FROM 子句:
UPDATE SC SET 成绩 = SC.成绩 - 5 FROM SC WHERE 学号 IN (SELECT 学号 FROM STUDENT WHERE 所在系 = '计算机系'); -
删除计算机系成绩不及格学生的选课记录。(请在删除语句中使用子查询和 FROM 子句两种方式实现) 正确语句:
- 子查询:
DELETE FROM SC WHERE 学号 IN (SELECT 学号 FROM STUDENT WHERE 所在系 = '计算机系' AND 成绩 < 60);- FROM 子句:
DELETE SC FROM SC WHERE 学号 IN (SELECT 学号 FROM STUDENT WHERE 所在系 = '计算机系' AND 成绩 < 60);
说明:
- 以上代码示例中,将 '2 号课程'、'数据库' 等内容替换为实际的课程名称或课程号。
- 使用 SQL Server Management Studio 等工具进行测试,并根据实际情况修改代码。
- 注意:在实际应用中,建议使用参数化查询,提高安全性并避免 SQL 注入攻击。
原文地址: https://www.cveoy.top/t/topic/ph8E 著作权归作者所有。请勿转载和采集!