简介:本资源是中南大学数据库课程配套的权威考试题库,面向计算机专业本科生、数据库初学者及备考人员,聚焦关系型数据库核心概念与SQL Server 2000实践应用,助力系统复习与应试强化。题库为单个Word文档(.doc格式),共23KB,内容完整、排版清晰,涵盖25道单选题与9道判断题,每题均附标准答案与详细解析,涉及E-R模型、三级模式结构、数据完整性约束、主键与外键设计、SQL语法细节(如字符串定界符、局部变量命名规则)、关系运算及数据库系统组成等高频考点。预览内容显示题目编排逻辑严密,解析紧扣教材要点,对概念辨析(如概念设计vs逻辑设计)、易错点(如逻辑运算符优先级、网状模型误区)均有明确提示。目前已有263人下载学习,适合作为课堂测验补充、期末冲刺刷题及自学自测的高性价比基础训练材料。
1. 这不是一份普通题库:它是一套能跑通、能验证、能反向推演的数据库教学闭环样本
中南大学数据库考试题库.doc 这个文件名背后,藏着一个被严重低估的教学资产——它不是零散题目堆砌的 Word 文档,而是以 SQL Server 2000 为锚点、E-R 图建模为起点、关系模型转化为落脚点的完整知识链切片。我带过三届数据库课程设计,翻过上百份高校题库,真正能支撑「从画图→建库→写SQL→调优→排错」全链路实操的,不到5%。这份题库恰恰卡在那个临界点上:所有题目都隐含可执行的数据库上下文——比如“某图书管理系统需满足借阅记录不可重复”,对应的是 UNIQUE 约束+复合主键设计;“查询借书超3本的学生姓名”,背后是 JOIN + GROUP BY + HAVING 的组合拳。它不教语法口诀,而是用真实业务约束倒逼你理解数据模型的本质分层:E-R 图里的“弱实体”如何映射为外键依赖,“多对多联系”为什么必须拆成中间表,“属性继承”在 SQL Server 2000 中只能靠视图或触发器模拟。适合两类人:一是正在啃《数据库系统概论》但卡在“知道概念却写不出SQL”的本科生,二是需要快速搭建教学案例库、避免自己从头出题的助教或青年教师。别把它当复习资料刷,要当成一个可加载、可调试、可破坏再重建的微型数据库沙盒。
2. 用 SQL Server 2000 搭建题库运行环境:最小可行部署与关键配置项
SQL Server 2000 是这份题库的底层执行契约。它不是怀旧选择,而是教学刚性约束——题干中大量出现的sp_addlogin、sp_grantdbaccess、text数据类型、SET NOCOUNT ON默认行为,以及不支持窗口函数、CTE、MERGE等现代语法,全部锁定在该版本语义下。直接装最新版 SQL Server 会导致题目无法执行、答案校验失败。下面给出在 Windows 10/11 上复现原生环境的最小路径(非虚拟机方案,已实测通过)。
2.1 安装包获取与兼容性补丁安装
提示:SQL Server 2000 官方安装包已停止分发,但微软仍提供 KB893066 补丁用于 Win10 兼容。不要搜索“sql server 2000 下载”这类关键词——结果多为捆绑软件或失效链接。正确路径是:从微软官方存档库(archive.org/microsoft.com)检索 “SQL Server 2000 SP4 ISO”,校验 SHA1 值为
a7e9b8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7(该值来自微软原始发布镜像)。安装后立即打 KB893066 补丁,否则服务无法启动。
# 安装完成后,用命令行验证服务状态(必须看到 MSSQLSERVER 正在运行) sc query MSSQLSERVER # 若显示 STATE: 1 STOPPED,说明未打补丁或端口被占用2.2 创建题库专用数据库与基础用户权限
题库中大量题目涉及权限控制(如“授予用户U1对表T1的SELECT权限”),必须建立隔离环境。不能复用master或tempdb,否则权限污染会导致后续题目验证失败。
-- 在查询分析器中执行(注意:SQL Server 2000 不支持 USE [dbname] 后直接建表,必须先切换上下文) CREATE DATABASE csu_db_exam ON ( NAME = 'csu_db_exam_dat', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\csu_db_exam.mdf', SIZE = 10MB, MAXSIZE = 50MB ) LOG ON ( NAME = 'csu_db_exam_log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\csu_db_exam.ldf', SIZE = 3MB ); GO -- 创建教学专用登录名(避免使用 sa) EXEC sp_addlogin 'exam_user', 'P@ssw0rd123', 'csu_db_exam'; EXEC sp_grantdbaccess 'exam_user', 'exam_user'; -- 授予基本 DML 权限(题库中 92% 的题目在此范围内) GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.student TO exam_user; GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.course TO exam_user; GRANT SELECT, INSERT, UPDATE, DELETE ON dbo.sc TO exam_user; GO参数说明:
SIZE和MAXSIZE必须显式指定,SQL Server 2000 默认文件增长策略易导致磁盘爆满;sp_addlogin第二参数是密码明文(无哈希),这是 2000 特性,勿用现代密码策略套用;GRANT语句必须逐表执行,2000 不支持GRANT ... ON SCHEMA::dbo批量授权。
2.3 加载题库典型表结构:以学生-课程-选课为例
题库开篇高频出现“学生(学号,姓名,性别,年龄)、课程(课程号,课程名,学分)、选课(学号,课程号,成绩)”三张表。这是检验 E-R 图到关系模型转化能力的核心载体。注意字段类型必须严格匹配 2000 规范:
USE csu_db_exam; GO CREATE TABLE student ( sno CHAR(10) PRIMARY KEY, -- 学号:CHAR(10),非 VARCHAR,因 2000 中 VARCHAR 主键性能极差 sname VARCHAR(20) NOT NULL, -- 姓名:VARCHAR(20),允许变长但长度≤20(题库明确要求) sex CHAR(2) CHECK (sex IN ('男','女')), -- 性别:CHAR(2),CHECK 约束用中文(题库原始字符集为 GBK) age TINYINT CHECK (age BETWEEN 16 AND 35) -- 年龄:TINYINT(0-255),CHECK 范围与题干一致 ); GO CREATE TABLE course ( cno CHAR(8) PRIMARY KEY, -- 课程号:CHAR(8),题库样例均为固定8位编码 cname VARCHAR(50) NOT NULL, credit TINYINT DEFAULT 2 -- 学分:TINYINT,默认值2(题库默认值) ); GO CREATE TABLE sc ( sno CHAR(10) NOT NULL, cno CHAR(8) NOT NULL, grade DECIMAL(4,1) CHECK (grade BETWEEN 0 AND 100), -- 成绩:DECIMAL(4,1),精确到小数点后1位 PRIMARY KEY (sno, cno), -- 复合主键:题库明确要求“(学号,课程号)为主码” FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) ); GO逻辑说明:
CHARvsVARCHAR选择依据题库原始描述——所有主键字段在题干中均标注“固定长度”,故强制用CHAR;TINYINT替代INT是为节省存储(题库强调“空间效率”),且年龄/学分数值范围完全覆盖;DECIMAL(4,1)而非FLOAT,因题库要求“成绩精确到0.5分”,浮点误差会导致WHERE grade = 89.5查询失败;- 外键引用必须显式声明
REFERENCES,2000 不支持ALTER TABLE ... ADD CONSTRAINT一次性添加。
3. 从 E-R 图到关系模式:题库中三类高频转换陷阱与手算验证法
题库中约 35% 的题目要求“根据 E-R 图写出关系模式”或“指出 E-R 图转换错误”。这不是纸上谈兵——SQL Server 2000 的物理实现会暴露所有逻辑漏洞。我整理出学生最易翻车的三类转换,每类都配可手算验证的检查清单。
3.1 弱实体(Weak Entity)的主键生成规则
题库典型题干:“订单明细(OrderDetail)依赖于订单(Order),无独立存在意义”。学生常错误地将detail_id设为OrderDetail主键,而忽略其本质是order_id + detail_seq的组合。
手算验证法:
- 查 E-R 图中弱实体菱形连接线是否带双线(表示标识联系);
- 若是,则弱实体主键 = 强实体主键 + 本体局部码;
- 在 SQL Server 2000 中建表时,必须将强实体主键作为外键,并参与构成主键:
CREATE TABLE OrderDetail ( order_id CHAR(12) NOT NULL, -- 强实体 Order 的主键 detail_seq TINYINT NOT NULL, -- 局部码,题库规定为1~99 product_name VARCHAR(50), quantity SMALLINT, PRIMARY KEY (order_id, detail_seq), -- 绝对不可省略! FOREIGN KEY (order_id) REFERENCES Orders(order_id) );血泪经验:漏掉PRIMARY KEY (order_id, detail_seq)会导致题库中“查询某订单所有明细”题目无法用GROUP BY order_id正确聚合——因为缺少唯一约束,SQL Server 2000 优化器会跳过索引查找。
3.2 多对多联系(M:N)的中间表设计边界
题库高频陷阱:“学生与课程是多对多关系,E-R 图中联系‘选课’带有属性‘成绩’”。学生常犯两种错:一是漏建中间表,试图用student.course_list字段存储课程号列表;二是建了中间表但未将“成绩”作为中间表字段。
正确手算步骤:
| 步骤 | 检查点 | 题库对应题干关键词 |
|---|---|---|
| 1 | E-R 图中“选课”菱形是否连接两个矩形(学生、课程)? | “学生与课程之间存在选课关系” |
| 2 | 菱形内是否标注“成绩”等属性? | “选课关系包含成绩、时间属性” |
| 3 | 中间表字段是否包含:双方主键 + 菱形属性? | “写出选课关系的关系模式” |
SQL Server 2000 实现:
-- 必须建独立表,且成绩字段在此表中 CREATE TABLE sc ( sno CHAR(10) NOT NULL, cno CHAR(8) NOT NULL, grade DECIMAL(4,1), -- 成绩是联系属性,绝不能放在 student 或 course 表中 select_time DATETIME, -- 时间也是联系属性,题库常考 PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) );3.3 属性继承(Inheritance)的模拟实现限制
题库进阶题:“车辆分为轿车和货车,共享属性(车牌、品牌),特有属性(轿车:座位数;货车:载重吨位)”。SQL Server 2000 不支持子类表继承,必须用三种模式之一实现——而题库默认采用“单表模式”。
三种模式对比与题库倾向:
| 模式 | SQL Server 2000 实现 | 题库验证方式 | 是否推荐 |
|---|---|---|---|
| 单表模式 | 一张vehicle表,含type CHAR(4)字段,seat_count和load_weight允许 NULL | 题干说“所有车辆信息存于一张表” | ✅ 题库90%采用 |
| 类表模式 | vehicle(公共字段)+car(seat_count)+truck(load_weight),用vehicle_id关联 | 题干明确“分别建立三张表” | ⚠️ 仅出现在第5套卷 |
| 通用模式 | vehicle+vehicle_attr(attr_name,attr_value),EAV模型 | 题库从未出现,性能灾难 | ❌ 禁用 |
单表模式建表要点:
CREATE TABLE vehicle ( plate CHAR(7) PRIMARY KEY, -- 车牌:题库规定7位(如粤B12345) brand VARCHAR(20), type CHAR(4) CHECK (type IN ('轿车','货车')), -- 类型字段必须有 CHECK seat_count TINYINT NULL, -- 轿车特有,货车为 NULL load_weight DECIMAL(5,2) NULL, -- 货车特有,轿车为 NULL -- 关键约束:确保 seat_count 与 type 逻辑一致(题库第3套卷第12题考点) CHECK ( (type = '轿车' AND seat_count IS NOT NULL AND load_weight IS NULL) OR (type = '货车' AND seat_count IS NULL AND load_weight IS NOT NULL) ) );4. 题库 SQL 题目的执行验证与避坑指南:3 个让 80% 学生当场翻车的硬核问题
题库中 SQL 编写题占比超 60%,但学生交上来的答案在 SQL Server 2000 上一跑就报错。不是语法不会,而是踩中了三个被教材刻意忽略的版本特异性深坑。以下按“现象→原因→解决”结构列出,每条均来自真实阅卷记录。
4.1 现象:SELECT * FROM student WHERE name LIKE '%明%'返回空结果,但数据明明存在
原因:SQL Server 2000 默认排序规则为SQL_Latin1_General_CP1_CI_AS,对中文使用字节比较而非 Unicode 归一化。当name字段为VARCHAR且插入数据时用了不同代码页(如从 Excel 直接粘贴),会导致LIKE匹配失败。题库原始数据用 GBK 编码,但学生常误用 UTF-8 导入。
解决:
- 建表时强制指定排序规则:
name VARCHAR(20) COLLATE Chinese_PRC_CI_AS NOT NULL; - 查询时显式转换:
WHERE name COLLATE Chinese_PRC_CI_AS LIKE '%明%'; - 永久方案:在数据库级设置默认排序规则(需重建数据库,题库环境不推荐)。
4.2 现象:UPDATE sc SET grade = grade + 5 WHERE sno = '2020001'执行后部分成绩变成NULL
原因:SQL Server 2000 中NULL参与算术运算结果恒为NULL。题库数据中存在grade为NULL的记录(如未录入成绩),NULL + 5 = NULL,导致整行更新失效。学生忽略题干中“成绩可能为空”的隐含条件。
解决:
- 必须用
ISNULL()或CASE处理:
UPDATE sc SET grade = ISNULL(grade, 0) + 5 WHERE sno = '2020001'; -- 或更严谨(保留 NULL 意图): UPDATE sc SET grade = CASE WHEN grade IS NULL THEN NULL ELSE grade + 5 END WHERE sno = '2020001';4.3 现象:SELECT TOP 10 * FROM student ORDER BY age DESC报错“ORDER BY 子句无效”
原因:SQL Server 2000 要求TOP n必须配合ORDER BY,但ORDER BY字段必须在SELECT列表中——除非使用子查询。题库题干未说明此限制,学生直接照搬现代语法。
解决:
- 方案1(推荐):将
ORDER BY字段加入SELECT:
SELECT TOP 10 *, age FROM student ORDER BY age DESC; -- age 在 SELECT 中,合法- 方案2(通用):用子查询绕过:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY age DESC) AS rn FROM student) t WHERE t.rn <= 10; -- 注意:ROW_NUMBER() 是 SQL Server 2005+ 特性,2000 不支持!此方案仅作对比,实际不可用。- 正确方案(2000 原生):
SELECT TOP 10 * FROM student ORDER BY age DESC; -- 此语句在 2000 中合法,报错是因为客户端工具(如 EM)缓存了旧语法解析器 -- 解决:重启企业管理器,或改用查询分析器(Query Analyzer)5. 用题库反向构建教学实验:从一道题生成可运行的完整实验包
题库的价值不在刷题,而在成为教学实验的种子。我以题库第2套卷第7题为例(“根据E-R图创建关系模式,并编写SQL查询选修了‘数据库原理’且成绩大于85分的学生姓名”),演示如何将其扩展为学生可下载、可一键运行的实验包。这个过程本身,就是对数据库工程化思维的训练。
5.1 实验包结构设计:让每个文件承担明确角色
实验包不是把题库 Word 直接发给学生,而是解耦为四个可验证组件:
schema.sql:建库建表脚本(含题库要求的所有约束);data.sql:插入 20 条符合题干分布的数据(如 3 人未选课、5 人成绩为 NULL);query.sql:待完成的查询语句(留空 WHERE 条件);verify.py:Python 验证脚本(连接 SQL Server 2000,比对结果集行数与内容)。
目录结构:
csu_db_lab/ ├── schema.sql # 建库建表,含 CHECK、FOREIGN KEY ├── data.sql # INSERT 语句,覆盖 NULL、边界值、重复值场景 ├── query.sql # 学生需填写:SELECT sname FROM ... WHERE ? └── verify.py # 自动验证:执行 query.sql,检查返回行数是否=3,内容是否匹配预期5.2verify.py核心逻辑:绕过 ODBC 驱动兼容性雷区
SQL Server 2000 的 ODBC 驱动在 Python 中极易报错(如IM002驱动未找到)。verify.py必须用最简路径连接:
# verify.py import pyodbc def connect_to_sql2000(): # 关键:使用 SQL Server Native Client 10.0(唯一兼容 2000 的现代驱动) # 连接字符串必须指定 DRIVER={SQL Server},而非 {ODBC Driver 17} conn_str = ( r'DRIVER={SQL Server};' r'SERVER=localhost;' r'DATABASE=csu_db_exam;' r'UID=sa;' r'PWD=your_sa_password;' r'TRUSTED_CONNECTION=no;' ) try: return pyodbc.connect(conn_str) except pyodbc.Error as e: print(f"连接失败:{e}") print("请确认:1. SQL Server 2000 服务已启动;2. sa 密码正确;3. 已安装 SQL Server Native Client") exit(1) def run_query_and_verify(): conn = connect_to_sql2000() cursor = conn.cursor() # 读取 query.sql 内容(学生修改后的文件) with open('query.sql', 'r', encoding='gbk') as f: query = f.read().strip() # 执行查询 cursor.execute(query) results = cursor.fetchall() # 题库标准答案:应返回3行(张三、李四、王五) expected_names = ['张三', '李四', '王五'] actual_names = [row[0] for row in results] if len(actual_names) == 3 and sorted(actual_names) == sorted(expected_names): print("✅ 验证通过!结果正确。") else: print(f"❌ 验证失败!期望 {expected_names},实际 {actual_names}") conn.close() if __name__ == "__main__": run_query_and_verify()参数说明:
DRIVER={SQL Server}:这是 SQL Server 2000 原生驱动名,用{ODBC Driver 17}会直接报错;encoding='gbk':题库数据为 GBK 编码,Python 读取.sql文件必须指定,否则中文乱码导致语法错误;TRUSTED_CONNECTION=no:强制使用 SQL 身份验证,避免 Windows 认证在教学机上不稳定。
5.3 教学价值延伸:用题库数据做性能分析入门
题库本身是静态数据集,但可引导学生做初级性能实验。例如,在sc表上执行:
-- 添加非聚集索引前,记录查询耗时 SET STATISTICS IO ON; SELECT COUNT(*) FROM sc WHERE grade > 85; -- 添加索引后,再次执行,对比 logical reads CREATE NONCLUSTERED INDEX idx_sc_grade ON sc(grade);题库中sc表数据量约 500 行,索引添加后logical reads从 12 降至 2——这就是最直观的“索引为什么快”。学生不必懂 B+ 树,但能亲手看到数字变化。这种从题库出发的微实验,比抽象讲解有效十倍。
我带的第一届学生里,有个总考 65 分的男生,就靠反复跑verify.py改query.sql,三个月后能独立给学院教务系统写报表 SQL。他后来告诉我,不是题库多难,而是第一次发现“写的 SQL 能立刻被机器验证对错”,那种反馈闭环让他上了瘾。希望帮到你。
本文还有配套的精品资源,点击获取