尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
数据库原理实验报告全解析:从建表到多表查询的SQL核心实践
简介这份资源是南华大学数据库原理课程的实验报告文档面向大数据技术等专业学生及数据库初学者用于完成DBMS认识、SQL查询与数据更新等实验任务。报告围绕SQL Server Management Studio展开涵盖创建“学生选课200905”与“StuCou200905”数据库、构建学生、课程、选修三张表并定义主码外码与默认值以及单表查询、多表连接查询、高级SQL查询和数据更新等实验内容完整呈现了从建库建表到查询操作的实践流程。资源包为1个doc文件大小5.38MB结构清晰便于按实验顺序查阅与对照练习。目前已有375人学习下载。读者可借助其中的实验题目、要求与代码示例理解表间一对多、多对多关系及实体完整性与参照完整性掌握SELECT语句在筛选、排序、分组和联接中的用法为数据库开发、数据分析等方向打下基础。1. 数据库原理实验报告到底在讲什么从一份课程作业看懂 SQL 的骨架很多人第一次听到「数据库原理实验报告」脑子里浮现的画面大概是一堆表格、一堆看不懂的英文大写单词、还有同学在群里问「你第三题查出来几行」。它听起来像是一门课的作业实际上它是一份把数据库核心概念串起来的练习册——从怎么建库、怎么建表到怎么用 SQL 把想要的数据捞出来。通俗地说数据库就像一个大仓库表是货架字段是货架上的标签而 SQL 就是你跟仓库管理员说的话。这份实验报告做的事就是让你从「认识仓库」开始一步步学会「怎么跟管理员下指令」。它覆盖了 DBMS 的基本操作、数据库和表的创建、表间关系的定义、单表查询、多表连接查询、嵌套查询和组合查询。搞懂它你就搞懂了关系型数据库最基础的那套逻辑。2. 为什么数据库要先讲「关系」表与表之间的那根线2.1 三张表怎么就把学生、课程、选课说清楚了实验里反复出现三张表学生表、课程表、选修表。学生表存的是「谁」课程表存的是「有什么课」选修表存的是「谁选了什么课、考了多少分」。这三张表单独看都很简单但把它们放在一起就能回答「计算机系选了数据库原理的学生有哪些」这种复杂问题。打个比方学生表像一本花名册课程表像一张课程清单选修表像一张签到表。签到表上只写学号和课程号不写姓名和课程名因为姓名去花名册查、课程名去课程清单查就行了。这样做的好处是学生改了名字只需要改花名册一处课程改了名称只需要改课程清单一处。如果签到表上把姓名和课程名都抄一遍改起来就容易漏、容易错。这就是关系型数据库的核心思路数据不重复存用关联字段把表连起来。学号在学生表里是主码在选修表里是外码课程号在课程表里是主码在选修表里也是外码。主码保证每行数据唯一外码保证选修表里的学号和课程号一定能在对应的表里找到。2.2 主码、外码、默认值三个最容易被跳过但最不能跳过的定义实验要求里专门提到「为性别和学分属性定义默认值」还要求「指定主码、外码」。这些不是走形式它们直接决定了数据能不能正确存进去。主码就是一张表里能唯一标识一行的字段。学生表用学号做主码因为学号不会重复课程表用课程号做主码选修表用学号加课程号联合做主码因为一个学生选一门课只应该有一条记录。外码是「这张表里的某个字段是另一张表的主码」。选修表里的学号是外码指向学生表的学号。外码的作用是防止你往选修表里插入一个不存在的学号——数据库会直接拒绝因为学生表里根本没有这个人。默认值是在你不填的时候自动填入的值。实验里要求给性别定义默认值比如不填就默认「男」或「女」给学分定义默认值比如不填就默认 4 分。默认值减少了手动输入的工作量也避免了空值带来的查询麻烦。注意主码和外码的定义顺序有讲究。必须先创建被引用的表学生表、课程表再创建引用它们的表选修表否则外码找不到引用的目标建表语句会直接报错。2.3 用 SQL 建表和用图形界面建表差别在哪实验里做了两遍几乎一样的事先用管理工具的图形界面建库建表再用 SQL 语句建库建表。很多人觉得这是重复劳动其实这两条路径解决的是不同问题。图形界面适合初学者理解「表长什么样」——你能看到字段名、数据类型、是否允许为空这些选项点一点就能改。但图形界面的问题是换一台电脑、换一个数据库版本你之前点的那些操作没法原样搬过去。SQL 语句建表的优势在于可重复、可版本管理、可自动化。你把建表语句存成一个.sql文件发给任何同学他在自己的数据库里执行一遍就能得到一模一样的表结构。实验里要求用 SQL 语句创建StuCou200905数据库和三张表就是在训练这种「用代码描述结构」的能力。-- 创建数据库 CREATE DATABASE StuCou200905; -- 切换到该数据库 USE StuCou200905; -- 创建学生表学号为主码性别默认值为男 CREATE TABLE Stu200905 ( 学号 CHAR(10) PRIMARY KEY, 姓名 VARCHAR(20) NOT NULL, 性别 CHAR(2) DEFAULT 男, 出生日期 DATE, 院系名称 VARCHAR(30), 备注 VARCHAR(100) ); -- 创建课程表课程号为主码学分默认值为4 CREATE TABLE Cou200905 ( 课程号 CHAR(6) PRIMARY KEY, 课程名 VARCHAR(30) NOT NULL, 先行课 CHAR(6), 学分 INT DEFAULT 4 ); -- 创建选修表学号课程号联合主码分别指向学生表和课程表 CREATE TABLE SC200905 ( 学号 CHAR(10), 课程号 CHAR(6), 分数 INT, PRIMARY KEY (学号, 课程号), FOREIGN KEY (学号) REFERENCES Stu200905(学号), FOREIGN KEY (课程号) REFERENCES Cou200905(课程号) );上面这段代码里PRIMARY KEY定义主码FOREIGN KEY ... REFERENCES定义外码DEFAULT定义默认值NOT NULL表示不允许为空。参数CHAR(10)表示固定长度 10 个字符VARCHAR(20)表示最多 20 个字符的可变长度。这些类型选择直接影响存储空间和查询效率实验里要求「为属性选择合适的数据类型」就是在练这个判断。3. 查询才是重头戏从单表筛选到多表连接的思维跃迁3.1 单表查询WHERE 后面那串条件到底怎么写的实验 2 的前半部分全是单表查询题目看起来五花八门但拆开看只有几个套路。第一个套路是按条件筛行。比如「查询计算机系全体学生的信息」就是在WHERE后面写院系名称 计算机系。「查询姓李的学生」用的是姓名 LIKE 李%百分号表示后面可以是任意字符。「查询考试成绩有不及格的学生的学号」用的是分数 60。第二个套路是对结果做计算和排序。比如「查询全体计算机系学生的姓名及其年龄」年龄不是表里存的字段而是用当前年份减去出生年份算出来的。实验里用的写法大致是YEAR(GETDATE()) - YEAR(出生日期) AS 年龄。AS是给计算结果起个别名方便阅读。第三个套路是分组统计。比如「查询选修了两门以上课程的学生学号与课程数」这里用到了GROUP BY和HAVING。GROUP BY 学号把同一个学生的选课记录归到一组COUNT(*)数出一共有几条HAVING COUNT(*) 2筛选出选课数大于 2 的组。-- 查询选修了两门以上课程的学生学号与课程数 SELECT 学号, COUNT(*) AS 选课数 FROM SC200905 GROUP BY 学号 HAVING COUNT(*) 2; -- 查询选修课程数大于等于2的学生的学号、平均成绩和选课门数 -- 并按平均成绩降序排列 SELECT 学号, AVG(分数) AS 平均成绩, COUNT(*) AS 选课门数 FROM SC200905 GROUP BY 学号 HAVING COUNT(*) 2 ORDER BY 平均成绩 DESC;这里的关键区别是WHERE在分组之前筛选行HAVING在分组之后筛选组。ORDER BY放在最后DESC表示降序。很多人第一次写的时候会把HAVING写成WHERE结果数据库直接报错因为WHERE不认识COUNT(*)这种聚合函数。3.2 多表连接为什么查着查着就查出了重复行多表查询是实验 2 后半部分和实验 3 的重点。最典型的题目是「查询学生的学号、姓名、选修课程的名称和成绩」。学号和姓名在学生表课程名在课程表成绩在选修表——一条查询要同时用到三张表。连接的基本写法是在FROM后面把两张表都写上然后在WHERE里写连接条件。比如学生表和选修表通过学号连接-- 查询学生的学号、姓名、选修课程的名称和成绩 SELECT S.学号, S.姓名, C.课程名, SC.分数 FROM Stu200905 S JOIN SC200905 SC ON S.学号 SC.学号 JOIN Cou200905 C ON SC.课程号 C.课程号;这里用了JOIN ... ON的写法比在WHERE里写连接条件更清晰。S、SC、C是表的别名避免字段名重复时产生歧义。多表连接最容易翻车的地方是连接条件写漏或写错。如果你只写了FROM Stu200905, SC200905但忘了写WHERE S.学号 SC.学号数据库会把两张表的每一行都两两组合一遍结果行数等于两张表行数的乘积。这个错误叫笛卡尔积数据量小的时候你还能忍数据量一大查询直接卡死。另一个容易混的点是内连接和外连接的区别。内连接只返回两张表都能匹配上的行左外连接返回左表所有行右表匹配不上的地方填空值。实验要求里专门提到「比较内连接、外连接的结果」就是因为这个区别在实际查数据时非常关键。比如「查询所有学生的信息和他们的选课情况」如果某个学生一门课都没选内连接会把他漏掉左外连接才能把他保留下来。3.3 嵌套查询和组合查询把一条查询的结果当成另一条查询的条件实验 3 讲的是嵌套查询和组合查询这是 SQL 从「会写」到「写得巧」的分水岭。嵌套查询的思路是先查出一个结果集再用这个结果集去筛选另一张表。比如「查询没有选修数据库原理课程的学生信息」可以先查出选修了数据库原理的学生学号然后用NOT IN排除掉这些人。-- 查询没有选修数据库原理课程的学生信息 SELECT * FROM Stu200905 WHERE 学号 NOT IN ( SELECT SC.学号 FROM SC200905 SC JOIN Cou200905 C ON SC.课程号 C.课程号 WHERE C.课程名 数据库原理 );组合查询用的是UNION、INTERSECT、EXCEPT这三个集合运算符。UNION把两个查询结果合并去重INTERSECT取两个结果的交集EXCEPT取差集。实验里要求「用 UNION 组合查询与 IN 条件查询两种方法实现同一道题」就是在训练你用不同思路解决同一个问题。提示UNION会自动去重如果不想去重就用UNION ALL。INTERSECT和EXCEPT在不同数据库里的支持程度不一样写之前最好确认一下当前环境是否支持。4. 常见误区这几个概念一混查询结果就全错了4.1 主码和外码都是码到底谁约束谁易混点主码和外码都叫「码」初学者容易觉得它们是一回事。为什么混两个概念都涉及「唯一标识」和「表间关系」名字又只差一个字。怎么区分主码是「我这行我说了算」——它唯一标识本表的一行不允许重复、不允许为空。外码是「我指向别人」——它的值必须能在另一张表的主码里找到或者为空。一张表只能有一个主码但可以有多个外码。学生表的学号是主码选修表的学号是外码选修表的学号加课程号是联合主码。4.2 WHERE 和 HAVING都是筛选位置不同结果不同易混点两个都可以写条件看起来功能差不多。为什么混初学时写的查询简单用 WHERE 能解决大部分问题遇到 HAVING 就觉得是另一种写法的 WHERE。怎么区分WHERE 在分组之前筛选行不能使用聚合函数COUNT、SUM、AVG 等。HAVING 在分组之后筛选组必须和 GROUP BY 配合使用可以使用聚合函数。如果你要筛「分数大于 80 的记录」用 WHERE如果你要筛「平均分大于 80 的学生」用 HAVING。4.3 内连接和外连接差一个 LEFT差出一批数据易混点JOIN和LEFT JOIN看起来只差一个单词结果集却可能差很多行。为什么混数据量小的时候两种连接的结果可能一模一样因为每行都能匹配上。怎么区分内连接只保留两张表都能匹配的行。左外连接保留左表所有行右表匹配不上的字段填 NULL。判断用哪个的标准是左表的数据是否允许丢失。如果「查询所有学生的选课情况」学生是左表即使某个学生没选课也要出现在结果里就必须用左外连接。4.4 UNION 和 UNION ALL去重和不去重性能差一截易混点两个都是合并结果集写哪个都行。为什么混小数据量下结果看起来一样因为本来就没有重复行。怎么区分UNION会去掉重复行UNION ALL保留所有行。去重需要排序和比较所以UNION比UNION ALL慢。如果你确定两个结果集没有重复或者你就是要保留重复用UNION ALL更高效。4.5 空值 NULL不是 0也不是空字符串易混点NULL 看起来就是「什么都没有」那判断的时候写 NULL应该可以吧。为什么混直觉上「等于空」是一个合理的判断。怎么区分NULL 在 SQL 里表示「未知」它不等于任何值也不等于另一个 NULL。判断 NULL 必须用IS NULL或IS NOT NULL写 NULL永远返回假。另外NULL 参与算术运算结果还是 NULL参与聚合函数时会被跳过。实验里定义字段时决定「是否允许为空」就是在控制这个字段能不能出现 NULL。5. 什么时候该翻出这份实验报告一个过来人的使用边界这份实验报告最直接的用途是帮你建立关系型数据库的第一层认知框架。如果你正在学数据库原理课或者刚开始接触 SQL它是一份很好的练习路线图先认识 DBMS再建库建表然后从单表查询练到多表连接最后用嵌套查询和组合查询收尾。这个顺序不是随便排的每一步都在为下一步打基础。但也要说清楚它不适合什么场景。这份报告里的 SQL 是教学用的标准写法实际工作中你会遇到更复杂的性能问题、更严格的权限管理、更大规模的数据量。实验里查的是几十行数据生产环境里查的是几百万行同样的 SQL 写法可能需要加索引、改连接方式、甚至换查询策略。另外实验用的是 SQL Server 的语法换到 MySQL 或 PostgreSQL 时日期函数、字符串函数、分页写法都会有差异不能直接照搬。如果你只是想快速搞懂「数据库是什么」「SQL 能干什么」这份报告的前两个实验就够了。如果你要准备面试或者做实际项目实验 2 和实验 3 里的多表连接、嵌套查询、组合查询是必须练熟的部分因为它们是 SQL 面试题里出现频率最高的题型。我自己刚开始学的时候总觉得建表语句写一遍就行了反正图形界面也能建。后来有一次帮同学看一个查询问题他把连接条件写在了 WHERE 里但漏了一个结果查出来的数据多了一倍。我让他把 SQL 改成JOIN ... ON的写法问题一眼就看出来了。从那以后我每次写多表查询都强制自己先把连接条件单独写出来确认每张表都连上了再往上面加筛选条件。这个习惯帮我省了很多排查时间。希望这份实验报告能帮你把数据库的底子打扎实后面遇到更复杂的查询时你知道该从哪里拆、从哪里查。本文还有配套的精品资源点击获取
RELATED

相关推荐

Spring Boot集成COS对象存储:下载、删除与碎片清理实战

Spring Boot集成COS对象存储:下载、删除与碎片清理实战

做文件上传功能的时候,很多人会把所有精力放在 upload 方法上,等上线才发现下载、删除、碎片清理这些配套能力一个比一个头疼。我最近在一个 Spring Boot 项目里做腾讯云 COS 对象存储的接入,功能很简单,就是对象下载、删除、还有…

📅 2026/10/17 15:54:59
KBEngine 嵌入式 Python 中的 ensurepip 模块详解:离线引导安装 pip

KBEngine 嵌入式 Python 中的 ensurepip 模块详解:离线引导安装 pip

游戏开发后端 【免费下载链接】kbengine A MMOG engine of server. 项目地址: https://gitcode.com/gh_mirrors/kb/kbengine 点击查看 免费下载 ensurepip 是 CPython 标准库中用于"引导式安装 pip"的模块:它把 pip(及其依赖 setu…

📅 2026/10/17 15:54:58
BiliTools 完整使用指南:如何用好这款免费开源的 B 站下载工具

BiliTools 完整使用指南:如何用好这款免费开源的 B 站下载工具

BiliTools 完整使用指南:如何用好这款免费开源的 B 站下载工具 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools 是一款基于 Tauri 构建、完全本地运行的免费开源 B 站下载工具&…

📅 2026/10/17 15:54:58
MORE NEWS

更多资讯

📰

回溯去重全排列详解:Permutations II 剪枝模板与实战

这道题我第一次遇到的时候,心里想的是:“全排列 I 都写熟了,加个去重能有多难?”结果真上手才发现,难的不是写代码,而是搞清楚那两行剪枝条件背后的状态关系。Permutations II 的核心就一句话:输…

📰

蒙特卡洛树搜索实现井字棋人机对战:从原理到代码实战

要是让你从零写一个能跟人下棋的AI,你首先想到的是什么?穷举所有可能的走法?在下棋这种决策树规模爆炸的场景里,五子棋的合法局面大约是十的三十几次方,围棋更是比宇宙中的原子数还多。你根本没法把所有走法都算完。这…

📰

Flutter跨端视频列表应用:OpenHarmony播放器适配与性能优化实践

视频类应用开发现场,十次有九次会遇到同一个问题:一套逻辑,三种设备,要同时保交付质量和开发效率。这次我面对的目标,是让一个 Flutter 编写的视频列表应用,跑在包括 OpenHarmony 在内的多个系统上&#xf…

📰

LedshowTW DLL二次开发指南:从环境配置到避坑实战

简介:LedshowTW 2014 二次开发包DLL动态库,是仰邦(BX)LED显示屏控制软件面向应用开发者的扩展接口集合。它通过DLL封装屏幕内容更新、亮度调节、颜色变换、播放效果等核心API,帮助开发者摆脱底层协议细节,快…

📰

SpringMVC请求链路全拆解:从DispatcherServlet到视图渲染

简介:这是一份面向 Java Web 初学者的 SpringMVC 入门项目,通过一个经典的 Hello World 示例,完整演示了 SpringMVC 框架从请求接收到视图响应的核心流程。项目采用 MVC 分层架构,涵盖前端控制器 DispatcherServlet、处理器映射器…

📰

理解策略单调提升:TRPO与PPO背后的信任域与KL散度

2021年2月12日,我把强化学习笔记翻到第四十三篇,正好卡在Monotonic Improvement Theory,也就是策略的单调提升理论。说实话,策略优化这一块最容易让人懵的不是某个算法有多复杂,而是“为什么TRPO要限定KL散度”“为什么…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬