ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

数据库系统Lab作业全流程指南:从Zip解压、MySQL环境到SQL优化

数据库系统Lab作业全流程指南:从Zip解压、MySQL环境到SQL优化 简介本资源是西安交通大学计算机专业《数据库系统》课程配套的完整实验作业包面向高校数据库初学者与实践者聚焦数据库设计、SQL编程及应用集成三大核心能力训练。压缩包共37个文件含11个Python脚本涵盖连接管理、批量插入、冲突处理、视图操作等、12张PNG/JPG实验截图如E-R建模、终端初始化、备份恢复界面、2份Markdown实验报告与README文档、配置文件及LICENSE等整体5.86MB结构清晰便于按模块复现实验流程。已有55人学习下载内容覆盖从概念模型设计、规范化分析到JDBC集成、触发器与存储过程开发的全链路实践包含典型错误场景截图与调试线索可直接用于课程实验复现、期末复习或数据库工程能力强化训练。 课程群里忽然多了一个文件西安交大计算机数据库系统的lab作业.zip。光看这个名字很多人会以为它只是个待解压的普通压缩包但实际上从解压到提交中间能踩的坑足够让人怀疑人生。我帮学弟处理这个包的时候光是拿到的报错就有 file is not a zip file、could not find EOCD、MySQL 认证插件加载失败、中文乱码……最后总算从“打不开”一路推到“能提交”。这篇文章不是某个学期的标准答案而是一套处理这类数据库系统Lab的通用流程。不管你是西安交大的学生还是从其他地方下载了类似实验包都建议照这个顺序走先审包、再搭环境、然后做题、最后自查提交。全文涉及的命令我都给出来了照着敲即可。1. 先搞明白这个Zip包到底想让你做什么1.1 打开之前先审题用命令看而不是双击我拿到学弟转过来的 zip 后第一件事不是解压而是先列目录。为什么要先列因为很多“解压失败”根本是文件本身出了问题先看目录能省掉大量盲目尝试。Windows 下可以装 7-ZipLinux/macOS 直接用 unzip 就行7z l 西安交大计算机数据库系统的lab作业.zip # 或者 unzip -l 西安交大计算机数据库系统的lab作业.zip如果输出里出现乱码说明压缩包内文件名用的是 GBK 编码Linux 下可以用unzip -O GBK -l查看。注意-O参数并不是所有 unzip 版本都支持某些发行版需要安装 unzip 的补丁版或者用7z x -mcp936来解决。这一步的目标是确认压缩包里确实有正常的目录结构而不是一个伪装成 zip 的 HTML 错误页。1.2 三类实验形态决定你接下来是“写SQL”还是“写代码”数据库系统概论的 Lab我见过的实验包基本逃不出三种形态纯 SQL 脚本题压缩包里有 schema.sql 和题目文档要求补全一系列查询文件比如 q1.sql、q2.sql。这类最好办你只需要把 SQL 写对。设计题给一段业务需求要求画 ER 图、转关系模式、再写建表语句。这类重点在规范化理论和主外键设计SQL 本身不难。应用代码题提供一个 Python/Java 骨架要求连接数据库实现导入、查询、导出或者一个简单的命令行应用。这类需要同时会数据库和代码。先看压缩包内有没有 README 或实验指导书。如果 README 里明确写了“本次实验只需要提交 q1.sql 到 q5.sql”你就不要花大量时间去做前端界面那属于自我感动。1.3 Zip包常见目录结构与命名规律一个典型的 Lab 压缩包解压后大概长这样. ├── README.md ├── 实验指导书.pdf ├── schema.sql ├── data/ │ ├── student.csv │ ├── course.csv │ └── sc.csv ├── queries/ │ ├── q1.sql │ ├── q2.sql │ └── q5.sql └── report_template.md看到这个结构应该立刻意识到schema.sql 是全实验的地基不要随意改表结构除非题目明确要求data 目录是原始数据不要手动在 Excel 里改否则导入后和批改数据对不上queries 目录是你要填写的答案。如果遇到 README 里没提到的文件先记录下来不要轻易删除也尽量不要从网上找一个版本直接替换。数据库课程作业的 schema 细节经常有差异只有指导书里的版本才是可靠的。2. 环境搭建MySQL 8 zip版 Jupyter Lab 半小时跑通2.1 为什么选 MySQL zip 手动安装而不是一键安装数据库实验环境我向来推荐 MySQL Community Server 的 zip 二进制包而不是 installer。原因很简单实验课可能要装多个版本或者课程用 MySQL 5.7 而你自己想体验 8.0zip 包解压到不同目录就能并行存在。installer 虽然下一步下一步很方便但它会写注册表、装服务、绑定启动卸载时还可能留下一堆残留。zip 包反而更可控。这里以 mysql-8.0.46-winx64.zip 为例5.7 的步骤类似。2.2 初始化数据库的五个步骤先把 zip 解压到没有中文和空格的路径比如D:\mysql-8.0.46-winx64。然后在根目录新建my.ini注意datadir指向的 data 目录不需要手动创建mysqld 会自动生成[mysqld] basedirD:/mysql-8.0.46-winx64 datadirD:/mysql-8.0.46-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections100写文件时不要把路径里的反斜杠直接丢进去MySQL 解析 my.ini 时会对转义符做处理导致初始化失败。统一用正斜杠/是更稳妥的写法。接下来以管理员身份打开命令提示符依次执行cd /d D:\mysql-8.0.46-winx64\bin mysqld --initialize-insecure mysqld --install MySQL80 net start mysql--initialize-insecure会创建一个 root 密码为空的实例适合本地开发。如果你的老师要求必须设密码就改成mysqld --initialize --console初始化完成后输出里会有一行临时密码。装完服务后执行mysql -uroot -p进入再执行ALTER USER rootlocalhost IDENTIFIED BY 123456;把密码改成自己记得住的。注意 MySQL 8.0 默认认证插件是 caching_sha2_password后面如果用 Python 连不上多半是缺 cryptography 包不是密码输错了。2.3 导入课程提供的 schema 和 seed 数据建一个专门给 Lab 用的数据库别什么数据都往 root 下塞mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS lab_db DEFAULT CHARACTER SET utf8mb4; mysql -uroot -p lab_db schema.sql mysql -uroot -p lab_db data.sql如果实验包只给了 CSV没有 data.sql可以用LOAD DATA LOCAL INFILE导入。但需要注意MySQL 8.0 默认可能没有开启 local_infile会报错。临时开启的简单方式是连接时加--local-infile1参数。导入前先看 schema.sql 里的表结构确认字段顺序和 CSV 列顺序一致不一致会导致数据错位。2.4 Jupyter Lab 如何切到作业目录很多同学在 Anaconda Navigator 里点击 Jupyter Lab 启动结果打开后找不到作业目录于是一个文件夹一个文件夹地找。最稳的方法是在终端里自己先 cd 到目标目录再启动cd D:\数据库Lab jupyter lab如果希望以后打开 Jupyter 就固定在某个目录执行jupyter lab --generate-config然后编辑生成的配置文件找到c.ServerApp.root_dir设成作业目录的绝对路径。旧版本写的是c.NotebookApp.notebook_dir要看自己的版本。Jupyter Lab 和 Jupyter Notebook 的区别简单说Notebook 一次只开一个文档Lab 是集成工作台可以同屏打开 notebook、SQL 脚本、终端和输出面板。数据库实验里你会经常在 SQL 文件、Python 脚本和结果之间切换用 Lab 会舒服很多。2.5 Python 操作 MySQL 的驱动选择Lab 里如果要用 Python 连接数据库先装依赖pip install pymysql cryptographyPyMySQL 是纯 Python 驱动轻量简单想用 MySQL 官方驱动就装mysql-connector-python。连接示例import pymysql conn pymysql.connect( host127.0.0.1, userroot, password123456, databaselab_db, charsetutf8mb4 ) with conn.cursor() as cur: cur.execute(SELECT * FROM student LIMIT 5;) for row in cur.fetchall(): print(row)注意 host 写成127.0.0.1而不是localhost在 PyMySQL 里两者行为可能有差异。端口默认 3306如果本机 3306 被占用你要在 my.ini 里换一个端口同时所有连接参数都要跟着改。3. Lab 里最高频的四种 SQL 任务与做题思路3.1 建表、主外键、约束从设计层面理解student/course/sc 是很多数据库教材的经典表不一定每个 Lab 都用但它的建表思路代表了一类题CREATE TABLE student ( sno CHAR(9) PRIMARY KEY, sname VARCHAR(20) NOT NULL, ssex CHAR(2) CHECK (ssex IN (男, 女)), sage SMALLINT, sdept VARCHAR(20) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE course ( cno CHAR(4) PRIMARY KEY, cname VARCHAR(40) NOT NULL, credit SMALLINT ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE sc ( sno CHAR(9), cno CHAR(4), grade DECIMAL(5, 2), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;外键最容易出错的地方是类型不一致。比如 student 表的 sno 是 CHAR(9)sc 表的 sno 如果写成 INT外键一定建失败报错信息通常是 “foreign key constraint is incorrectly formed”。另一个坑是存储引擎只有 InnoDB 支持外键如果建表时用了 MyISAM外键会被静默忽略。MySQL 8.0.16 之后 CHECK 约束才真正强制执行所以别以为写了 CHECK 就一定能拦住非法数据实验前先确认自己用的 MySQL 版本。3.2 多表查询与子查询先想结果集再写 SQL拿到一道查询题先不要急着敲 SQL。先用中文描述结果集长什么样包含哪些列、要不要去重、排序规则是什么然后想清楚表之间的连接方式。举例“查询每个系每个学生的选课数输出系名、学号、姓名、选课数按系名升序、选课数降序排。”SELECT s.sdept, s.sno, s.sname, COUNT(sc.cno) AS course_cnt FROM student s LEFT JOIN sc ON s.sno sc.sno GROUP BY s.sdept, s.sno, s.sname ORDER BY s.sdept ASC, course_cnt DESC;这里用 LEFT JOIN 而不是 INNER JOIN是因为“每个学生的选课数”要包含那些一门课都没选的学生。如果写成 INNER JOIN没选课的学生会被过滤掉这就是一个典型的扣分点。另外 MySQL 默认 sql_mode 带ONLY_FULL_GROUP_BYSELECT 后的非聚合列必须出现在 GROUP BY 里所以我干脆把部门、学号、姓名全部加进了 GROUP BY这不算错只是查询更严谨。3.3 索引与 EXPLAIN判断你的慢查询如果实验题给了大表和相应的查询场景多半会涉及索引优化。常见套路是给你一张几十万行记录的 orders 表要求统计某个用户的订单。没有索引时EXPLAIN SELECT * FROM orders WHERE user_id 12345;输出里 type 通常是 ALLrows 接近全表行数。创建索引后CREATE INDEX idx_user_id ON orders(user_id);再跑同样的 EXPLAINtype 变成 refrows 变成 1效果立竿见影。老师要看的不是能不能跑出结果而是你有没有真正理解索引为什么有效。B 树索引能让等值查询从全表扫描变成树路径查找查询代价从 O(n) 降到 O(log n)。但索引也不是越多越好数据库每次写入都要维护索引过多反而拖慢写入。实验里只要你能用 EXPLAIN 证明优化思路就已经达标了。3.4 事务与隔离级别用两个连接演示事务是数据库系统概论的绝对重点Lab 里经常要求模拟转账或订单操作。最基础的转账例子START TRANSACTION; UPDATE account SET balance balance - 100 WHERE id 1; UPDATE account SET balance balance 100 WHERE id 2; COMMIT;你可以开两个 MySQL 会话来观察隔离性。一个会话执行 UPDATE 但不 COMMIT另一个会话去 SELECT默认 REPEATABLE READ 下看不到未提交的修改。如果改成SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;你就能在第二个会话里读到脏数据。做实验报告时把四种隔离级别的对比表放进去非常加分隔离级别脏读不可重复读幻读READ UNCOMMITTED可能可能可能READ COMMITTED避免可能可能REPEATABLE READ避免避免可能InnoDB 已基本规避SERIALIZABLE避免避免避免MySQL 默认是 REPEATABLE READOracle 默认是 READ COMMITTED这个区别也是面试常考的点。4. 压缩包与文件层的高频坑完整排错链路4.1 “file is not a本文还有配套的精品资源点击获取
返回列表