T-SQL 语句练习:学生信息管理系统

本练习使用 T-SQL 语句对学生信息进行操作,涵盖了内连接、外连接、派生表、子查询、分组统计、排序、分页等 SQL 语句知识点。

数据库表结构:

  • STUDENT 表:存储学生信息,包含学号 (sno)、姓名 (sname)、性别 (ssex)、年龄 (sage)、所在系 (sdept)
  • COURSE 表:存储课程信息,包含课程号 (cno)、课程名 (cname)、学分 (ccredit)
  • SC 表:存储学生选课信息,包含学号 (sno)、课程号 (cno)、成绩 (grade)

练习题目:

  1. 在 STUDENTSCORE 数据库下,将 STUDENT 表中计算机系的学生信息放入一张名为 JSJSTUDENT 的新表中,新表中的属性包含(学号,姓名,性别,年龄)。 提示:请使用 INTO 子句实现该操作。 正确语句:

    	INSERT INTO JSJSTUDENT (学号, 姓名, 性别, 年龄)
    	   SELECT 学号, 姓名, 性别, 年龄
    	   FROM STUDENT
    	   WHERE 所在系 = '计算机系';
    
  2. 查询 JSJSTUDENT 表,将年龄最大的 3 位学生的信息放入一张本地临时表中(临时表名可与基本表名相同)。查询临时表,查看年龄最大的 3 位学生信息。 正确语句:

    	SELECT TOP 3 学号, 姓名, 性别, 年龄
    	   INTO #JSJSTUDENT
    	   FROM JSJSTUDENT
    	   ORDER BY 年龄 DESC;
    
    	SELECT 学号, 姓名, 性别, 年龄
    	FROM #JSJSTUDENT
    	ORDER BY 年龄 DESC;
    
  3. 查询计算机系学生选修课程的信息。结果显示学号,姓名,性别,选修课程名和成绩。(请使用显式内连接和派生表查询两种方式完成) 正确语句:

    • 显式内连接:
    	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.课程号;
    
  4. 查询没有选修课程的学生学号,姓名和所在系。(请使用外连接方式完成) 正确语句:

    • 左连接:
    	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.学号);
    
  5. 查询有哪些课程没有人选修,结果显示课程号,课程名和学分。(请使用外连接和嵌套查询两种方式完成) 正确语句:

    • 左连接:
    	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.课程号);
    
  6. 统计每名学生选修课程的门数和平均分,显示学生学号,姓名,所在系和选课门数及课程平均分。结果显示选课门数排名前 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;
    
  7. 统计除 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号课程';
    
  8. 查询选修每门课程的男女生人数和平均分,结果显示课程号、性别、选课人数和平均分。(在 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;
    
  9. 查询所有学生的信息,结果统计总人数和平均年龄。(可使用 COMPUTE 子句或使用批处理) 正确语句:

    • COMPUTE 子句:
    	SELECT COUNT(*) AS 总人数, AVG(年龄) AS 平均年龄
    	   FROM STUDENT
    	   COMPUTE SUM(COUNT(*)), AVG(年龄);
    
    • 批处理:
    	SELECT COUNT(*) AS 总人数, AVG(年龄) AS 平均年龄
    	   FROM STUDENT
    	   GROUP BY () WITH ROLLUP;
    
  10. 查询每个学生选修课程的信息(学号、姓名、课程号、成绩),并统计每个学生选修的课程数和平均分。(可使用 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.姓名;
    
  11. 查询选修了 '数据库' 课程的计算机系学生信息,显示学生学号,姓名和成绩。要求最后结果中成绩以等级制显示。(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.课程名 = '数据库';
    
  12. 将计算机系学生的所有成绩都降低 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 所在系 = '计算机系');
    
  13. 删除计算机系成绩不及格学生的选课记录。(请在删除语句中使用子查询和 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 注入攻击。
T-SQL 语句练习:学生信息管理系统

原文地址: https://www.cveoy.top/t/topic/ph8E 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录