尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

数据库实践报告从PDF到可运行增删改查:MySQL建库建表与SQL优化指南

数据库实践报告从PDF到可运行增删改查:MySQL建库建表与SQL优化指南 简介这份《数据库及其应用实践报告》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 还是 MySQL2.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 rootlocalhost」是 MySQL 新手遇到的第一道墙。这个报错的意思是用户名或密码不对或者该用户没有从 localhost 连接的权限。排查按这个顺序走先确认密码有没有输错注意 MySQL 8 默认密码策略可能要求大小写加符号再确认是不是用了root但从远程 IP 连接root默认只允许 localhost最后检查用户表里有没有这条记录。-- 用管理员身份登录后查看用户和主机 SELECT user, host FROM mysql.user; -- 如果 root 的 host 只有 localhost而你从 127.0.0.1 连可以补一条 CREATE USER root127.0.0.1 IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON *.* TO root127.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这个索引用不上需要单独建。报告里可以画一个「加索引前 typeALL加索引后 typeref」的对比表。4. 避坑与排查实践报告里最容易翻车的五件事4.1 中文乱码现象是查询结果全是问号现象插入「数据库系统概论」后SELECT出来显示??????。原因数据库、表、连接三处的字符集不一致常见是建库时用了latin1或者连接字符串没指定utf8mb4。解决建库时显式写DEFAULT CHARACTER SET utf8mb4连接串加?useUnicodetruecharacterEncodingutf8已经建好的表用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 rootlocalhost。原因对方电脑没装 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( host127.0.0.1, userroot, passwordyour_password, databaselibrary_db, charsetutf8mb4 ) # 查询每个作者的图书数量和平均价格 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, indexFalse) # 画柱状图中文需要指定字体 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, dpi150) plt.show()逻辑说明pymysql.connect里的charsetutf8mb4和建库时保持一致否则中文作者名会乱码。pd.read_sql直接把 SQL 结果转成 DataFrame省去手动遍历游标。GROUP BY author按作者分组HAVING COUNT(*) 1过滤掉没有书的作者ORDER BY book_count DESC让数量多的排前面。导出 Excel 用to_excel画图用matplotlibSimHei是黑体Windows 自带如果报字体找不到就换成Microsoft YaHei。参数说明figsize(8, 4)控制图片宽高比报告里如果排版是 A4 纸8:4 比较合适。dpi150保证打印清晰屏幕展示 100 也够。color#4C72B0是柔和的蓝色比默认色好看报告里统一用这个色系会显得专业。这个技巧的价值在于你改一条 SQL重新跑一次脚本图表和 Excel 自动更新不用手动复制粘贴。报告里可以写「数据可视化脚本见附录」答辩时现场改一个查询条件重新生成比背稿子更有说服力。我自己带学生做这类实践报告时最深的教训是不要等到最后一天才动手建库。数据库的坑集中在环境配置和字符集上这两个问题一旦出现可能耗掉半天。提前把库建好、插几条测试数据、跑通一条查询后面写报告就是水到渠成的事。希望帮到你。本文还有配套的精品资源点击获取
返回列表