要有效备考SQL语言期末考试需要系统性地练习不同类型的题目覆盖从基础概念到复杂应用的各个层面。以下是一套综合性的SQL期末考试练习题题目设计遵循由浅入深的原则并附有详细的答案解析和核心知识点剖析旨在帮助你巩固数据库原理与应用的核心技能。一、 基础概念与DDL操作题题目1数据库与表结构定义假设需要为一个“学生选课系统”设计数据库请完成以下SQL语句创建一个名为Student_Course的数据库。在该数据库中创建三张表Students表包含学号 (SID主键)、姓名 (SName)、性别 (Gender)、年龄 (Age)、所在系 (Dept)。Courses表包含课程号 (CID主键)、课程名 (CName)、学分 (Credit)。SC(选课) 表包含学号 (SID)、课程号 (CID)、成绩 (Grade)。其中(SID, CID)联合作为主键并分别设置参照Students和Courses表的外键约束。参考答案与解析-- 1. 创建数据库 CREATE DATABASE Student_Course; USE Student_Course; -- 切换到该数据库具体语法可能因DBMS而异 -- 2. 创建Students表 CREATE TABLE Students ( SID CHAR(10) PRIMARY KEY, -- 学号设为主键 SName VARCHAR(50) NOT NULL, -- 姓名非空 Gender CHAR(2), -- 性别 Age INT CHECK (Age 0), -- 年龄添加检查约束 Dept VARCHAR(50) -- 所在系 ); -- 3. 创建Courses表 CREATE TABLE Courses ( CID CHAR(6) PRIMARY KEY, -- 课程号设为主键 CName VARCHAR(100) NOT NULL UNIQUE, -- 课程名非空且唯一 Credit DECIMAL(3,1) CHECK (Credit 0) -- 学分正数 ); -- 4. 创建选课SC表 CREATE TABLE SC ( SID CHAR(10), CID CHAR(6), Grade DECIMAL(5,2) CHECK (Grade BETWEEN 0 AND 100), -- 成绩约束在0-100 PRIMARY KEY (SID, CID), -- 联合主键 FOREIGN KEY (SID) REFERENCES Students(SID) ON DELETE CASCADE, -- 外键级联删除 FOREIGN KEY (CID) REFERENCES Courses(CID) ON UPDATE NO ACTION -- 外键禁止更新 );核心考点CREATE DATABASE/TABLE、PRIMARY KEY、FOREIGN KEY、CHECK约束、NOT NULL、UNIQUE等数据定义与完整性约束的使用。题目2数据修改与完整性向Students表插入一条记录学号‘2024001’姓名‘张三’性别‘男’年龄20计算机系。随后将‘张三’的年龄修改为21。最后尝试删除Courses表中某门正在被SC表引用的课程观察并解释会发生什么。参考答案与解析-- 插入数据 INSERT INTO Students (SID, SName, Gender, Age, Dept) VALUES (2024001, 张三, 男, 20, 计算机系); -- 更新数据 UPDATE Students SET Age 21 WHERE SName 张三; -- 使用WHERE子句精确指定要更新的行 -- 尝试删除被引用的课程假设CIDCS101在SC表中存在记录 DELETE FROM Courses WHERE CID CS101; -- 执行结果此语句将失败并返回外键约束冲突错误。 -- 解析由于SC表通过外键引用了Courses表的CID默认情况下除非定义外键时指定了CASCADE数据库管理系统(DBMS)会阻止这种破坏参照完整性的删除操作。核心考点INSERT、UPDATE、DELETE语句以及参照完整性的实践体现。二、 核心查询DQL应用题题目3基本查询与过滤基于上述表结构假设已填充数据写出SQL语句查询所有学生的学号和姓名。查询‘计算机系’所有女生的姓名和年龄。查询选修了‘CS101’课程的学生学号并去重。查询年龄在18到22岁之间含的学生信息按年龄降序排列。参考答案与解析-- 1. 投影查询 SELECT SID, SName FROM Students; -- 2. 带条件的查询 SELECT SName, Age FROM Students WHERE Dept 计算机系 AND Gender 女; -- 3. 去重查询 SELECT DISTINCT SID FROM SC WHERE CID CS101; -- DISTINCT用于消除重复行 -- 4. 范围查询与排序 SELECT * FROM Students WHERE Age BETWEEN 18 AND 22 -- BETWEEN...AND...包含边界值 ORDER BY Age DESC; -- DESC表示降序ASC为升序默认核心考点SELECT、FROM、WHERE、DISTINCT、BETWEEN、ORDER BY等子句的基本用法。题目4聚合函数与分组统计统计学生总人数。计算‘软件工程’课程的平均成绩。查询每门课程的课程号、选课人数及平均成绩。查询平均成绩大于85分的课程号及平均成绩。找出选修课程超过3门的学生学号。参考答案与解析-- 1. 计数 SELECT COUNT(*) AS Total_Students FROM Students; -- COUNT(*)统计所有行 -- 2. 带条件的聚合 SELECT AVG(Grade) AS Avg_Grade FROM SC WHERE CID (SELECT CID FROM Courses WHERE CName 软件工程); -- 使用了子查询 -- 3. 分组聚合 SELECT CID, COUNT(SID) AS Enroll_Count, AVG(Grade) AS Avg_Grade FROM SC GROUP BY CID; -- 按课程号分组 -- 4. 分组后过滤 (HAVING子句) SELECT CID, AVG(Grade) AS Avg_Grade FROM SC GROUP BY CID HAVING AVG(Grade) 85; -- HAVING用于对分组结果进行过滤WHERE用于分组前过滤 -- 5. 分组计数过滤 SELECT SID FROM SC GROUP BY SID HAVING COUNT(CID) 3;核心考点聚合函数COUNT,AVG,SUM,MAX,MIN、GROUP BY分组、HAVING与WHERE的区别。题目5多表连接与子查询查询所有学生的选课情况要求显示学生姓名、课程名和成绩。查询没有选修任何课程的学生姓名。查询选修了‘数据库原理’且成绩高于该课程平均分的学生姓名和成绩。参考答案与解析-- 1. 多表连接内连接 SELECT S.SName, C.CName, SC.Grade FROM Students S INNER JOIN SC ON S.SID SC.SID INNER JOIN Courses C ON SC.CID C.CID; -- 也可以使用WHERE进行等值连接FROM Students S, SC, Courses C WHERE S.SIDSC.SID AND SC.CIDC.CID -- 2. 使用子查询NOT EXISTS SELECT SName FROM Students S WHERE NOT EXISTS ( SELECT 1 FROM SC WHERE SC.SID S.SID ); -- 也可用左连接判断SELECT S.SName FROM Students S LEFT JOIN SC ON S.SIDSC.SID WHERE SC.SID IS NULL -- 3. 复杂子查询 SELECT S.SName, SC.Grade FROM Students S INNER JOIN SC ON S.SID SC.SID INNER JOIN Courses C ON SC.CID C.CID WHERE C.CName 数据库原理 AND SC.Grade ( SELECT AVG(Grade) FROM SC SC2 INNER JOIN Courses C2 ON SC2.CID C2.CID WHERE C2.CName 数据库原理 );核心考点JOIN特别是INNER JOIN、LEFT JOIN的使用、相关子查询与非相关子查询、EXISTS/NOT EXISTS运算符。三、 高级概念与综合题题目6视图与索引创建一个视图V_CS_Student显示‘计算机系’学生的学号、姓名和总学分假设通过SC和Courses表计算。为什么需要在SC表的SID和CID列上创建索引请写出创建索引的语句。参考答案与解析-- 1. 创建视图 CREATE VIEW V_CS_Student AS SELECT S.SID, S.SName, SUM(C.Credit) AS Total_Credit FROM Students S LEFT JOIN SC ON S.SID SC.SID LEFT JOIN Courses C ON SC.CID C.CID WHERE S.Dept 计算机系 GROUP BY S.SID, S.SName; -- 视图是一个虚拟表简化复杂查询提供逻辑数据独立性。 -- 2. 创建索引 CREATE INDEX idx_sc_sid ON SC(SID); CREATE INDEX idx_sc_cid ON SC(CID); -- 或创建复合索引CREATE INDEX idx_sc_sid_cid ON SC(SID, CID); -- 解析SC表是连接Students和Courses的核心表且经常按SID或CID进行查询、连接和分组。在这些列上创建索引可以显著加快查询速度尤其是当表数据量很大时。主键会自动创建索引。题目7事务与存储过程简述数据库事务的ACID特性。编写一个存储过程AddStudent用于向Students表添加新学生并在添加失败时回滚。存储过程接收学号、姓名等参数。参考答案与解析-- 1. ACID特性简述非SQL语句 -- **原子性 (Atomicity)**事务内的所有操作要么全部完成要么全部不完成。 -- **一致性 (Consistency)**事务执行前后数据库必须保持一致状态满足所有完整性约束。 -- **隔离性 (Isolation)**并发事务的执行互不干扰。 -- **持久性 (Durability)**事务一旦提交其结果就是永久性的。 -- 2. 存储过程示例以SQL Server语法为例 CREATE PROCEDURE AddStudent SID CHAR(10), SName VARCHAR(50), Gender CHAR(2), Age INT, Dept VARCHAR(50) AS BEGIN SET NOCOUNT ON; BEGIN TRANSACTION; -- 开始事务 BEGIN TRY INSERT INTO Students (SID, SName, Gender, Age, Dept) VALUES (SID, SName, Gender, Age, Dept); COMMIT TRANSACTION; -- 提交事务 PRINT 学生添加成功; END TRY BEGIN CATCH ROLLBACK TRANSACTION; -- 回滚事务 PRINT 添加失败 ERROR_MESSAGE(); END CATCH END; GO -- 调用存储过程EXEC AddStudent 2024002, 李四, 女, 19, 数学系;核心考点事务的概念、存储过程的编写包含事务控制BEGIN TRANSACTION/COMMIT/ROLLBACK和错误处理TRY...CATCH。通过系统练习以上题目你能够全面覆盖SQL期末考试中关于数据定义、数据操纵、数据查询、数据控制以及高级特性的主要考点。务必在真实的数据库管理系统中如MySQL, SQL Server, PostgreSQL等动手实践这些SQL语句以加深理解并排查语法细节上的差异。参考来源《JAVA语言程序设计》期末考试试题及答案SQL Server 练习题及答案1《JAVA语言程序设计》期末考试试题及答案小白收藏这篇就够了Java期末考试复习资料试卷与答案解析数据库原理-期末考试试题及答案c语言期末考试及答案江西农业大学,数据库期末试卷A(含答案)
SQL期末必练:建库建表实战题[数据库原理]
要有效备考SQL语言期末考试需要系统性地练习不同类型的题目覆盖从基础概念到复杂应用的各个层面。以下是一套综合性的SQL期末考试练习题题目设计遵循由浅入深的原则并附有详细的答案解析和核心知识点剖析旨在帮助你巩固数据库原理与应用的核心技能。一、 基础概念与DDL操作题题目1数据库与表结构定义假设需要为一个“学生选课系统”设计数据库请完成以下SQL语句创建一个名为Student_Course的数据库。在该数据库中创建三张表Students表包含学号 (SID主键)、姓名 (SName)、性别 (Gender)、年龄 (Age)、所在系 (Dept)。Courses表包含课程号 (CID主键)、课程名 (CName)、学分 (Credit)。SC(选课) 表包含学号 (SID)、课程号 (CID)、成绩 (Grade)。其中(SID, CID)联合作为主键并分别设置参照Students和Courses表的外键约束。参考答案与解析-- 1. 创建数据库 CREATE DATABASE Student_Course; USE Student_Course; -- 切换到该数据库具体语法可能因DBMS而异 -- 2. 创建Students表 CREATE TABLE Students ( SID CHAR(10) PRIMARY KEY, -- 学号设为主键 SName VARCHAR(50) NOT NULL, -- 姓名非空 Gender CHAR(2), -- 性别 Age INT CHECK (Age 0), -- 年龄添加检查约束 Dept VARCHAR(50) -- 所在系 ); -- 3. 创建Courses表 CREATE TABLE Courses ( CID CHAR(6) PRIMARY KEY, -- 课程号设为主键 CName VARCHAR(100) NOT NULL UNIQUE, -- 课程名非空且唯一 Credit DECIMAL(3,1) CHECK (Credit 0) -- 学分正数 ); -- 4. 创建选课SC表 CREATE TABLE SC ( SID CHAR(10), CID CHAR(6), Grade DECIMAL(5,2) CHECK (Grade BETWEEN 0 AND 100), -- 成绩约束在0-100 PRIMARY KEY (SID, CID), -- 联合主键 FOREIGN KEY (SID) REFERENCES Students(SID) ON DELETE CASCADE, -- 外键级联删除 FOREIGN KEY (CID) REFERENCES Courses(CID) ON UPDATE NO ACTION -- 外键禁止更新 );核心考点CREATE DATABASE/TABLE、PRIMARY KEY、FOREIGN KEY、CHECK约束、NOT NULL、UNIQUE等数据定义与完整性约束的使用。题目2数据修改与完整性向Students表插入一条记录学号‘2024001’姓名‘张三’性别‘男’年龄20计算机系。随后将‘张三’的年龄修改为21。最后尝试删除Courses表中某门正在被SC表引用的课程观察并解释会发生什么。参考答案与解析-- 插入数据 INSERT INTO Students (SID, SName, Gender, Age, Dept) VALUES (2024001, 张三, 男, 20, 计算机系); -- 更新数据 UPDATE Students SET Age 21 WHERE SName 张三; -- 使用WHERE子句精确指定要更新的行 -- 尝试删除被引用的课程假设CIDCS101在SC表中存在记录 DELETE FROM Courses WHERE CID CS101; -- 执行结果此语句将失败并返回外键约束冲突错误。 -- 解析由于SC表通过外键引用了Courses表的CID默认情况下除非定义外键时指定了CASCADE数据库管理系统(DBMS)会阻止这种破坏参照完整性的删除操作。核心考点INSERT、UPDATE、DELETE语句以及参照完整性的实践体现。二、 核心查询DQL应用题题目3基本查询与过滤基于上述表结构假设已填充数据写出SQL语句查询所有学生的学号和姓名。查询‘计算机系’所有女生的姓名和年龄。查询选修了‘CS101’课程的学生学号并去重。查询年龄在18到22岁之间含的学生信息按年龄降序排列。参考答案与解析-- 1. 投影查询 SELECT SID, SName FROM Students; -- 2. 带条件的查询 SELECT SName, Age FROM Students WHERE Dept 计算机系 AND Gender 女; -- 3. 去重查询 SELECT DISTINCT SID FROM SC WHERE CID CS101; -- DISTINCT用于消除重复行 -- 4. 范围查询与排序 SELECT * FROM Students WHERE Age BETWEEN 18 AND 22 -- BETWEEN...AND...包含边界值 ORDER BY Age DESC; -- DESC表示降序ASC为升序默认核心考点SELECT、FROM、WHERE、DISTINCT、BETWEEN、ORDER BY等子句的基本用法。题目4聚合函数与分组统计统计学生总人数。计算‘软件工程’课程的平均成绩。查询每门课程的课程号、选课人数及平均成绩。查询平均成绩大于85分的课程号及平均成绩。找出选修课程超过3门的学生学号。参考答案与解析-- 1. 计数 SELECT COUNT(*) AS Total_Students FROM Students; -- COUNT(*)统计所有行 -- 2. 带条件的聚合 SELECT AVG(Grade) AS Avg_Grade FROM SC WHERE CID (SELECT CID FROM Courses WHERE CName 软件工程); -- 使用了子查询 -- 3. 分组聚合 SELECT CID, COUNT(SID) AS Enroll_Count, AVG(Grade) AS Avg_Grade FROM SC GROUP BY CID; -- 按课程号分组 -- 4. 分组后过滤 (HAVING子句) SELECT CID, AVG(Grade) AS Avg_Grade FROM SC GROUP BY CID HAVING AVG(Grade) 85; -- HAVING用于对分组结果进行过滤WHERE用于分组前过滤 -- 5. 分组计数过滤 SELECT SID FROM SC GROUP BY SID HAVING COUNT(CID) 3;核心考点聚合函数COUNT,AVG,SUM,MAX,MIN、GROUP BY分组、HAVING与WHERE的区别。题目5多表连接与子查询查询所有学生的选课情况要求显示学生姓名、课程名和成绩。查询没有选修任何课程的学生姓名。查询选修了‘数据库原理’且成绩高于该课程平均分的学生姓名和成绩。参考答案与解析-- 1. 多表连接内连接 SELECT S.SName, C.CName, SC.Grade FROM Students S INNER JOIN SC ON S.SID SC.SID INNER JOIN Courses C ON SC.CID C.CID; -- 也可以使用WHERE进行等值连接FROM Students S, SC, Courses C WHERE S.SIDSC.SID AND SC.CIDC.CID -- 2. 使用子查询NOT EXISTS SELECT SName FROM Students S WHERE NOT EXISTS ( SELECT 1 FROM SC WHERE SC.SID S.SID ); -- 也可用左连接判断SELECT S.SName FROM Students S LEFT JOIN SC ON S.SIDSC.SID WHERE SC.SID IS NULL -- 3. 复杂子查询 SELECT S.SName, SC.Grade FROM Students S INNER JOIN SC ON S.SID SC.SID INNER JOIN Courses C ON SC.CID C.CID WHERE C.CName 数据库原理 AND SC.Grade ( SELECT AVG(Grade) FROM SC SC2 INNER JOIN Courses C2 ON SC2.CID C2.CID WHERE C2.CName 数据库原理 );核心考点JOIN特别是INNER JOIN、LEFT JOIN的使用、相关子查询与非相关子查询、EXISTS/NOT EXISTS运算符。三、 高级概念与综合题题目6视图与索引创建一个视图V_CS_Student显示‘计算机系’学生的学号、姓名和总学分假设通过SC和Courses表计算。为什么需要在SC表的SID和CID列上创建索引请写出创建索引的语句。参考答案与解析-- 1. 创建视图 CREATE VIEW V_CS_Student AS SELECT S.SID, S.SName, SUM(C.Credit) AS Total_Credit FROM Students S LEFT JOIN SC ON S.SID SC.SID LEFT JOIN Courses C ON SC.CID C.CID WHERE S.Dept 计算机系 GROUP BY S.SID, S.SName; -- 视图是一个虚拟表简化复杂查询提供逻辑数据独立性。 -- 2. 创建索引 CREATE INDEX idx_sc_sid ON SC(SID); CREATE INDEX idx_sc_cid ON SC(CID); -- 或创建复合索引CREATE INDEX idx_sc_sid_cid ON SC(SID, CID); -- 解析SC表是连接Students和Courses的核心表且经常按SID或CID进行查询、连接和分组。在这些列上创建索引可以显著加快查询速度尤其是当表数据量很大时。主键会自动创建索引。题目7事务与存储过程简述数据库事务的ACID特性。编写一个存储过程AddStudent用于向Students表添加新学生并在添加失败时回滚。存储过程接收学号、姓名等参数。参考答案与解析-- 1. ACID特性简述非SQL语句 -- **原子性 (Atomicity)**事务内的所有操作要么全部完成要么全部不完成。 -- **一致性 (Consistency)**事务执行前后数据库必须保持一致状态满足所有完整性约束。 -- **隔离性 (Isolation)**并发事务的执行互不干扰。 -- **持久性 (Durability)**事务一旦提交其结果就是永久性的。 -- 2. 存储过程示例以SQL Server语法为例 CREATE PROCEDURE AddStudent SID CHAR(10), SName VARCHAR(50), Gender CHAR(2), Age INT, Dept VARCHAR(50) AS BEGIN SET NOCOUNT ON; BEGIN TRANSACTION; -- 开始事务 BEGIN TRY INSERT INTO Students (SID, SName, Gender, Age, Dept) VALUES (SID, SName, Gender, Age, Dept); COMMIT TRANSACTION; -- 提交事务 PRINT 学生添加成功; END TRY BEGIN CATCH ROLLBACK TRANSACTION; -- 回滚事务 PRINT 添加失败 ERROR_MESSAGE(); END CATCH END; GO -- 调用存储过程EXEC AddStudent 2024002, 李四, 女, 19, 数学系;核心考点事务的概念、存储过程的编写包含事务控制BEGIN TRANSACTION/COMMIT/ROLLBACK和错误处理TRY...CATCH。通过系统练习以上题目你能够全面覆盖SQL期末考试中关于数据定义、数据操纵、数据查询、数据控制以及高级特性的主要考点。务必在真实的数据库管理系统中如MySQL, SQL Server, PostgreSQL等动手实践这些SQL语句以加深理解并排查语法细节上的差异。参考来源《JAVA语言程序设计》期末考试试题及答案SQL Server 练习题及答案1《JAVA语言程序设计》期末考试试题及答案小白收藏这篇就够了Java期末考试复习资料试卷与答案解析数据库原理-期末考试试题及答案c语言期末考试及答案江西农业大学,数据库期末试卷A(含答案)