简介:这份《数据库及其应用实践报告》PDF面向高校数据库课程学习者与实验备考学生,围绕Access 2003环境下的数据库设计、创建、查询与数据交换展开,帮助读者系统梳理实验操作要点与理论概念。资源包共1个PDF文件,大小约342KB,内容以实验报告形式组织,涵盖数据库与表的基础概念、关系完整性设置、字段属性定义、选择/交叉/参数查询及SQL的SELECT、INSERT、UPDATE、DELETE语句应用,并延伸至Access与文本文件、Excel之间的链接、导入与导出操作。报告以学生教学管理系统为案例,完整呈现E-R模型到关系模型的转换、学院/专业/学生/课程/成绩单五表结构设计、主外键关系建立及记录输入顺序等实践环节,同时列出实验设备与教材要求。已有77人学习,适合需要对照实验步骤、理解数据库完整性规则或完成课程报告的学习者参考,可帮助快速掌握Access数据库管理与应用的核心技能。
1. 数据库及其应用实践报告:从一份 PDF 到能跑起来的增删改查
很多人看到「数据库及其应用实践报告.pdf」这个标题,第一反应是去搜一份现成的 Word 模板,改改封面就交差。但真正做过课程设计或者带过实习生的人都知道,这类报告的核心从来不是排版,而是你能不能把「数据库」这三个字从抽象概念落到一张具体的表、一条能执行的 SQL 语句、一个能复现的查询结果上。热搜里「数据库增删改查」「SQL 语句」「Access 数据库」这些词反复出现,说明大家卡住的点很一致:知道要建库建表,但不知道从哪下手、参数怎么定、报错了怎么查。这篇内容面向的是需要独立完成一份数据库实践报告的学生,以及刚接手小型数据管理任务的工程师,目标是把「建库—建表—增删改查—查询优化—报告成文」这条链路走通,每一步都给到能直接抄的代码和参数说明,而不是停留在概念复述。
2. 选型先定死:Access、SQL Server 还是 MySQL
2.1 三种常见数据库在实践报告里的真实定位
「数据库及其应用实践报告」这个标题没有指定数据库产品,这恰恰是第一个要做的决策。热搜词里同时出现了 Access、SQL Server 2022 下载、MySQL 创建多个数据表的格式,说明选型本身就是高频困惑点。我的建议是按报告的使用场景来定,而不是按「哪个更高级」来定。
Access 数据库的优势是零配置、单文件、自带图形化查询界面,适合数据量在几万条以内、只需要本机演示的场景。它的 .accdb 文件可以直接拷贝,答辩时换台电脑也能打开。缺点是并发能力弱,SQL 方言和标准 SQL 有差异,比如日期函数用Date()而不是NOW()。如果你的实践报告要求「设计一个学生信息管理系统」且不涉及网络访问,Access 完全够用,而且能省掉装数据库服务的时间。
SQL Server 和 MySQL 属于客户端-服务端架构,需要先装服务、再建连接。SQL Server 2022 和 2019 的安装教程是热搜常客,说明安装环节本身就容易翻车。MySQL 的优势是跨平台、社区资料多、语法接近标准 SQL,适合报告里需要体现「数据库连接」「用户权限」「事务」这些概念的场景。如果你后续想把报告里的系统真正部署起来给别人访问,直接选 MySQL,别用 Access 绕一圈再迁移。
提示:选型一旦确定,报告里的所有 SQL 语句、连接字符串、截图都要统一,不要出现「建表用 MySQL、查询截图是 Access」这种混搭,答辩时会被追问。
2.2 用 MySQL 建库建表的最小可复现命令
下面这段代码是我带学生做实践报告时最常用的起步模板,建一个「图书管理」库和两张表,字段类型和约束都按报告里需要体现的知识点来设计。
-- 创建数据库,字符集用 utf8mb4 避免中文乱码 CREATE DATABASE library_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE library_db; -- 图书表:主键自增,ISBN 唯一,库存默认 0 CREATE TABLE books ( book_id INT AUTO_INCREMENT PRIMARY KEY, isbn VARCHAR(20) NOT NULL UNIQUE, title VARCHAR(100) NOT NULL, author VARCHAR(50) DEFAULT '未知', price DECIMAL(8,2) CHECK (price >= 0), stock INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 借阅记录表:外键关联图书表,状态用枚举限制取值 CREATE TABLE borrow_records ( record_id INT AUTO_INCREMENT PRIMARY KEY, book_id INT NOT NULL, borrower VARCHAR(30) NOT NULL, borrow_date DATE NOT NULL, return_date DATE, status ENUM('borrowed','returned','overdue') DEFAULT 'borrowed', CONSTRAINT fk_book FOREIGN KEY (book_id) REFERENCES books(book_id) );这段代码的逻辑说明:utf8mb4是必须的,热搜里「mysql 创建多个数据表的格式」背后最常见的翻车就是中文变成问号。AUTO_INCREMENT让主键自动生成,报告里插入数据时不用手写 ID。CHECK (price >= 0)是约束,答辩时能体现「数据完整性」这个知识点。ENUM把状态限定在三个值,比用 VARCHAR 更严谨。外键fk_book保证借阅记录不会指向不存在的书。
参数说明:DECIMAL(8,2)表示总共 8 位、小数 2 位,最大 999999.99,足够图书定价。VARCHAR(100)对书名够用,如果报告涉及外文书名可以放到 200。DEFAULT CURRENT_TIMESTAMP让创建时间自动填充,省去手动写时间的麻烦。
2.3 连接数据库时 error 1045 的排查顺序
热搜里「error 1045 (28000): access denied for user 'root'@'localhost'」是 MySQL 新手遇到的第一道墙。这个报错的意思是用户名或密码不对,或者该用户没有从 localhost 连接的权限。排查按这个顺序走:先确认密码有没有输错,注意 MySQL 8 默认密码策略可能要求大小写加符号;再确认是不是用了root但从远程 IP 连接,root默认只允许 localhost;最后检查用户表里有没有这条记录。
-- 用管理员身份登录后查看用户和主机 SELECT user, host FROM mysql.user; -- 如果 root 的 host 只有 localhost,而你从 127.0.0.1 连,可以补一条 CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1'; FLUSH PRIVILEGES;逻辑说明:mysql.user表里host字段决定允许从哪台机器连接,localhost和127.0.0.1在 MySQL 里是两个不同的主机名。FLUSH PRIVILEGES让权限修改立即生效,不加这句有时要重启服务。注意不要把%当成万能解,生产环境用%等于开放所有 IP,报告里如果写了这个要能解释清楚风险。
3. 增删改查写进报告:四条语句加三个查询场景
3.1 插入、更新、删除的标准写法与自增主键处理
实践报告里「数据库增删改查」是必写章节,但很多人只贴四条最基础的语句,缺少场景说明。我一般会按「新增一本图书 → 修改价格 → 删除下架图书」这个业务流来组织,每条语句后面注明影响行数和注意事项。
-- 插入:不写 book_id,让自增主键自动生成 INSERT INTO books (isbn, title, author, price, stock) VALUES ('9787111128069', '数据库系统概论', '王珊', 45.00, 10); -- 更新:把 ISBN 对应的书价格调整为 42.50,同时库存加 5 UPDATE books SET price = 42.50, stock = stock + 5 WHERE isbn = '9787111128069'; -- 删除:只删除库存为 0 且三年未借阅的书(用子查询限定范围) DELETE FROM books WHERE stock = 0 AND book_id NOT IN ( SELECT DISTINCT book_id FROM borrow_records WHERE borrow_date > DATE_SUB(CURDATE(), INTERVAL 3 YEAR) );逻辑说明:插入时不写book_id是依赖AUTO_INCREMENT,如果手写 ID 可能和已有记录冲突。更新时stock = stock + 5是原地累加,比先查再写更安全,避免并发覆盖。删除用了子查询,NOT IN排除近三年有借阅记录的书,DATE_SUB(CURDATE(), INTERVAL 3 YEAR)算出三年前的日期。这里要注意NOT IN子查询如果返回 NULL 会导致整个条件失效,所以子查询里book_id有外键约束不会为 NULL,可以放心用。
参数说明:INTERVAL 3 YEAR可以改成3 MONTH或30 DAY,按报告的业务规则调整。CURDATE()返回当前日期,不含时间,适合和 DATE 类型字段比较。
3.2 exists 查询和连接查询在报告里的取舍
热搜里「exists 查询」出现,说明很多人分不清EXISTS和IN、JOIN的使用场景。在实践报告里,如果你要查「借过书的读者姓名」,用EXISTS更符合语义,而且在大表上通常比IN快,因为EXISTS找到第一条匹配就返回,不用扫描全部。
-- 查询借过至少一本书的读者(用 EXISTS) SELECT DISTINCT borrower FROM borrow_records br WHERE EXISTS ( SELECT 1 FROM books b WHERE b.book_id = br.book_id AND b.stock < 10 ); -- 等价的 JOIN 写法,报告里可以对比两种执行计划 SELECT DISTINCT br.borrower FROM borrow_records br JOIN books b ON b.book_id = br.book_id WHERE b.stock < 10;逻辑说明:EXISTS子查询里写SELECT 1是惯例,因为外层只关心有没有行,不关心具体值。关联条件b.book_id = br.book_id把子查询和外层表连起来。JOIN写法更直观,但如果books表里一个book_id对应多行(实际不会,因为主键唯一),JOIN会产生重复行,需要DISTINCT去重。报告里可以两种都写,然后说明「在 book_id 有索引的情况下,两者执行计划接近;如果子查询表很大且匹配率高,EXISTS 通常更优」。
参数说明:stock < 10是业务条件,可以换成任意筛选条件。DISTINCT在borrow_records里一个读者可能借多次,去重后每个读者只出现一次。
3.3 慢 SQL 优化的三个可写进报告的检查点
热搜里「慢 SQL 优化」是进阶需求,实践报告如果能体现这一点会加分。我一般让学生先开慢查询日志,找到执行时间超过 1 秒的语句,然后按「有没有索引 → 有没有全表扫描 → 有没有回表」三步查。
-- 开启慢查询日志(MySQL 8) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; -- 用 EXPLAIN 看执行计划,重点看 type 和 rows EXPLAIN SELECT * FROM borrow_records WHERE borrower = '张三' AND status = 'borrowed';逻辑说明:long_query_time = 1表示超过 1 秒的记录,报告里可以改成 0.5 秒做演示。EXPLAIN输出的type列如果是ALL说明全表扫描,需要加索引;rows列是预估扫描行数,越小越好。针对上面这条查询,可以在borrower和status上建联合索引。
-- 联合索引,把区分度高的列放前面 CREATE INDEX idx_borrower_status ON borrow_records (borrower, status);参数说明:联合索引的顺序很重要,borrower在前是因为姓名重复度低,status只有三个值区分度低。如果查询条件只有status,这个索引用不上,需要单独建。报告里可以画一个「加索引前 type=ALL,加索引后 type=ref」的对比表。
4. 避坑与排查:实践报告里最容易翻车的五件事
4.1 中文乱码:现象是查询结果全是问号
现象:插入「数据库系统概论」后,SELECT出来显示??????。原因:数据库、表、连接三处的字符集不一致,常见是建库时用了latin1,或者连接字符串没指定utf8mb4。解决:建库时显式写DEFAULT CHARACTER SET utf8mb4,连接串加?useUnicode=true&characterEncoding=utf8,已经建好的表用ALTER TABLE books CONVERT TO CHARACTER SET utf8mb4;转换。
4.2 外键报错:现象是插入借阅记录时提示 cannot add or update a child row
现象:往borrow_records插数据,报Cannot add or update a child row: a foreign key constraint fails。原因:插入的book_id在books表里不存在。解决:先查books表确认这个 ID 有没有,或者插入前先插图书。如果报告里需要批量导入历史数据,可以临时SET FOREIGN_KEY_CHECKS = 0;关掉检查,导入完再打开,但要在报告里说明这是临时手段。
4.3 自增主键跳号:现象是 ID 不连续,删了记录后新 ID 从更大的数开始
现象:删了book_id = 5的记录,下一条插入变成 6 而不是 5。原因:AUTO_INCREMENT只保证唯一,不保证连续,删除后计数器不会回退。解决:这是正常行为,报告里不要写成 bug。如果非要连续,可以用ALTER TABLE books AUTO_INCREMENT = 1;重置,但已有数据会冲突,不推荐。
4.4 日期比较失效:现象是WHERE borrow_date = '2024-01-01'查不到当天数据
现象:明明有2024-01-01的记录,等值查询返回空。原因:borrow_date是DATE类型时没问题,但如果是DATETIME且存了2024-01-01 10:30:00,等值比较就不匹配。解决:用范围查询WHERE borrow_date >= '2024-01-01' AND borrow_date < '2024-01-02',或者用DATE(borrow_date) = '2024-01-01',后者会导致索引失效,数据量大时优先用范围。
4.5 权限报错:现象是本地能连,换台电脑就 access denied
现象:在自己电脑上 MySQL 正常,把项目拷给同学后连不上,报Access denied for user 'root'@'localhost'。原因:对方电脑没装 MySQL,或者装了但 root 密码不同,或者项目里写死了localhost而对方用远程连接。解决:报告里不要写死连接信息,用配置文件或环境变量;如果必须演示,提前在目标机器上建好同名用户和密码,或者改用 Access 单文件方案避免环境依赖。
5. 把查询结果变成报告图表:一个自动化导出技巧
实践报告如果只有 SQL 语句和文字,说服力有限。我习惯在报告最后加一个「数据导出与可视化」小节,用 Python 把查询结果直接生成表格和柱状图,这样答辩时展示的是真实数据跑出来的结果,而不是手动画的示意图。下面这段代码连接 MySQL、执行查询、导出 Excel 并画图,依赖pymysql、pandas、matplotlib三个库。
import pymysql import pandas as pd import matplotlib.pyplot as plt # 连接配置:host、user、password 按实际环境改 conn = pymysql.connect( host='127.0.0.1', user='root', password='your_password', database='library_db', charset='utf8mb4' ) # 查询每个作者的图书数量和平均价格 sql = """ SELECT author, COUNT(*) AS book_count, AVG(price) AS avg_price FROM books GROUP BY author HAVING COUNT(*) >= 1 ORDER BY book_count DESC """ df = pd.read_sql(sql, conn) conn.close() # 导出 Excel,方便贴进报告附录 df.to_excel('author_stats.xlsx', index=False) # 画柱状图,中文需要指定字体 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(8, 4)) plt.bar(df['author'], df['book_count'], color='#4C72B0') plt.title('各作者图书数量统计') plt.xlabel('作者') plt.ylabel('图书数量') plt.tight_layout() plt.savefig('author_stats.png', dpi=150) plt.show()逻辑说明:pymysql.connect里的charset='utf8mb4'和建库时保持一致,否则中文作者名会乱码。pd.read_sql直接把 SQL 结果转成 DataFrame,省去手动遍历游标。GROUP BY author按作者分组,HAVING COUNT(*) >= 1过滤掉没有书的作者,ORDER BY book_count DESC让数量多的排前面。导出 Excel 用to_excel,画图用matplotlib,SimHei是黑体,Windows 自带,如果报字体找不到就换成Microsoft YaHei。
参数说明:figsize=(8, 4)控制图片宽高比,报告里如果排版是 A4 纸,8:4 比较合适。dpi=150保证打印清晰,屏幕展示 100 也够。color='#4C72B0'是柔和的蓝色,比默认色好看,报告里统一用这个色系会显得专业。
这个技巧的价值在于:你改一条 SQL,重新跑一次脚本,图表和 Excel 自动更新,不用手动复制粘贴。报告里可以写「数据可视化脚本见附录」,答辩时现场改一个查询条件重新生成,比背稿子更有说服力。
我自己带学生做这类实践报告时,最深的教训是:不要等到最后一天才动手建库。数据库的坑集中在环境配置和字符集上,这两个问题一旦出现,可能耗掉半天。提前把库建好、插几条测试数据、跑通一条查询,后面写报告就是水到渠成的事。希望帮到你。
本文还有配套的精品资源,点击获取