资讯动态

数据库原理实验复习指南:从建库建表到SQL查询的完整链路

发布时间:2026/10/18 1:30:55 来源:尧图企业网站定制
简介这份资源是南华大学《数据库原理》课程的实验报告面向大数据技术等专业学生及数据库初学者用于配合课程实验、巩固SQL语言与数据库设计基础。报告围绕SQL Server Management Studio展开涵盖认识DBMS、创建数据库与数据表、定义主码外码与默认值、建立表间一对多及多对多关系以及单表查询、多表连接查询、数据更新等实验内容并附有实验代码与总结可帮助读者对照题目复现建库建表流程、理解实体完整性与参照完整性。资源包共1个doc文件约5.38MB为完整实验报告文档结构按实验1至实验4及实验总结编排便于按模块查阅。目前已有375人学习下载适合需要完成数据库原理实验、复习SQL查询与表关系设计的学习者参考。1. 数据库原理实验的知识地图从建库到查询的完整链路数据库原理这门课实验部分看着零散其实是一条很清晰的链路先认识 DBMS 这个“黑匣子”再动手建库建表接着把表间关系用主码外码串起来最后用 SQL 把数据查出来、改进去。很多人复习时容易把实验一和实验二割裂开看结果建表时没想清楚约束查询时就到处翻车。梳理下来会发现整个实验体系就围绕三件事转数据怎么存表结构与完整性约束、数据怎么连主外码与连接、数据怎么取单表到嵌套组合查询。这份实验报告覆盖了 SQL Server Management Studio 的图形化操作和 SQL 语句两条路径适合正在系统学数据库、准备实验考或期末复习的人把零散实验题串成一张可复用的知识地图。2. 实验一建库建表与完整性约束的复习重点2.1 两条建库路径图形界面与 SQL 语句的对照实验一的核心不是“会点按钮”而是理解同一个数据库对象可以用两种方式创建且两者结果等价。图形界面SQL Server Management Studio适合快速验证结构SQL 语句适合复现和版本管理。复习时要能默写出建库建表的关键语句而不是只记得点过哪些菜单。建库语句本身简单但命名和文件配置容易忽略-- 创建数据库 StuCou200905 CREATE DATABASE StuCou200905 ON PRIMARY ( NAME StuCou200905_data, FILENAME D:\SQLData\StuCou200905_data.mdf, SIZE 10MB, MAXSIZE 100MB, FILEGROWTH 5MB ) LOG ON ( NAME StuCou200905_log, FILENAME D:\SQLData\StuCou200905_log.ldf, SIZE 5MB, MAXSIZE 50MB, FILEGROWTH 2MB );参数说明ON PRIMARY指定主数据文件LOG ON指定日志文件SIZE是初始大小MAXSIZE是上限FILEGROWTH是每次自动增长量。考试或实验报告里如果只写CREATE DATABASE StuCou200905;也能过但复习时要清楚完整语法因为“文件组与增长策略”是选择题常客。建表才是实验一的重点。三张表的结构如下表名主要字段主码外码默认值学生200905学号、姓名、性别、出生日期、院系名称、备注学号无性别默认“男”课程200905课程号、课程名、先行课、学分课程号先行课引用课程号学分默认 4选修200905学号、课程号、分数(学号,课程号)学号引用学生课程号引用课程无复习时最容易漏的是选修表的主码是复合主码不是单独学号或课程号。另外先行课作为外码引用本表的课程号属于自参照建表时要注意先建主码再加外码约束或者用ALTER TABLE补加。2.2 主码、外码与默认值完整性约束的落地写法实验要求里明确提到“为性别和学分属性定义默认值”这对应DEFAULT约束。主码对应PRIMARY KEY外码对应FOREIGN KEY ... REFERENCES。复习时要把约束分类记清楚实体完整性主码非空唯一、参照完整性外码要么为空要么引用存在的主码值、用户定义完整性默认值、CHECK 等。-- 创建学生表含主码和默认值 CREATE TABLE 学生200905 ( 学号 CHAR(10) PRIMARY KEY, 姓名 VARCHAR(20) NOT NULL, 性别 CHAR(2) DEFAULT 男, 出生日期 DATE, 院系名称 VARCHAR(30), 备注 VARCHAR(100) ); -- 创建课程表先行课自参照外码 CREATE TABLE 课程200905 ( 课程号 CHAR(6) PRIMARY KEY, 课程名 VARCHAR(30) NOT NULL, 先行课 CHAR(6), 学分 DECIMAL(3,1) DEFAULT 4, FOREIGN KEY (先行课) REFERENCES 课程200905(课程号) ); -- 创建选修表复合主码加双外码 CREATE TABLE 选修200905 ( 学号 CHAR(10), 课程号 CHAR(6), 分数 DECIMAL(4,1), PRIMARY KEY (学号, 课程号), FOREIGN KEY (学号) REFERENCES 学生200905(学号), FOREIGN KEY (课程号) REFERENCES 课程200905(课程号) );梳理下来会发现建表顺序有讲究先建学生和课程再建选修否则外码引用会失败。如果课程表的先行课外码引用本表插入数据时也要先插先行课存在的记录。这些顺序问题在实验报告里往往一笔带过但复习时是查漏补缺的关键。注意默认值只在插入时省略该列才生效显式插入 NULL 不会触发默认值。3. 实验二单表查询与多表连接的易错点3.1 单表查询条件、排序、分组与聚合的典型题实验二的单表查询有 10 道题覆盖了 SELECT 的核心用法。复习时不要按题号背要按“查询条件类型”归类等值查询、模糊查询、空值查询、范围查询、聚合查询、分组查询、排序与 TOP。几个典型题和易错点查询计算机系全体学生信息WHERE 院系名称 计算机系注意字符串用单引号。查询姓“李”的学生WHERE 姓名 LIKE 李%%匹配任意长度_匹配单个字符。查询没有先行课的课程名WHERE 先行课 IS NULL不能用 NULL。查询考试成绩有不及格的学生的学号WHERE 分数 60如果分数列允许为空还要考虑IS NULL的情况。查询选修了 C01 或 C02 的学生学号及成绩WHERE 课程号 IN (C01,C02)或者用OR。查询计算机系学生姓名及年龄年龄用YEAR(GETDATE()) - YEAR(出生日期)计算注意函数返回值类型。查询 1999—2000 年出生的学生WHERE 出生日期 BETWEEN 1999-01-01 AND 2000-12-31边界包含。查询姓李的学生中按字典序前两名SELECT TOP 2 ... ORDER BY 姓名TOP 和 ORDER BY 搭配才稳定。查询选修两门以上课程的学生学号与课程数GROUP BY 学号 HAVING COUNT(*) 2HAVING 不能写成 WHERE。查询选课数大于等于 2 的学生学号、平均成绩、选课门数按平均成绩降序GROUP BY 学号 HAVING COUNT(*) 2 ORDER BY AVG(分数) DESC。这里最容易翻车的是WHERE 和 HAVING 的区别WHERE 在分组前过滤行HAVING 在分组后过滤组。聚合条件必须放 HAVING否则报错。另一个易漏点是NULL 的处理COUNT(*)统计所有行COUNT(列名)跳过 NULLAVG(列名)也跳过 NULL如果分数有 NULL平均分可能和预期不一致。3.2 多表连接内连接、外连接与自连接的辨析多表查询的 8 道题里连接类型是核心。复习时要能区分内连接只返回匹配行左外连接返回左表全部加右表匹配右外连接反之全外连接返回两边全部。实验里“查询所有学生的信息和他们的选课课程编号”就是典型的外连接场景因为没选课的学生也要出现。-- 查询所有学生及其选课课程编号左外连接 SELECT S.学号, S.姓名, SC.课程号 FROM 学生200905 S LEFT JOIN 选修200905 SC ON S.学号 SC.学号; -- 查询选修了数据库原理的计算机系学生学号和姓名多表内连接 SELECT S.学号, S.姓名 FROM 学生200905 S JOIN 选修200905 SC ON S.学号 SC.学号 JOIN 课程200905 C ON SC.课程号 C.课程号 WHERE C.课程名 数据库原理 AND S.院系名称 计算机系;参数说明LEFT JOIN保留左表所有行右表无匹配时填 NULLJOIN默认是INNER JOIN只保留匹配行。多表连接时连接条件写在ON后面过滤条件写在WHERE后面混在一起虽然有时结果对但语义不清晰。自连接是实验二的一个难点查询每一门课的间接先行课即先行课的先行课。这需要把课程表当成两张表用-- 查询间接先行课自连接 SELECT C1.课程号, C2.先行课 AS 间接先行课 FROM 课程200905 C1 JOIN 课程200905 C2 ON C1.先行课 C2.课程号 WHERE C2.先行课 IS NOT NULL;梳理下来会发现自连接的关键是给同一张表起两个别名然后按别名写连接条件。实验里还要求“列出学生所有可能的选修情况”这其实是笛卡尔积加左连接用来展示所有学生和所有课程的组合复习时要理解CROSS JOIN和LEFT JOIN的区别。注意多表连接时如果漏写连接条件会得到笛卡尔积行数爆炸这是实验报告里最常见的“翻车”现场。4. 实验三嵌套查询与组合查询的易漏点4.1 嵌套查询IN、EXISTS 与比较运算符的层次关系实验三的嵌套查询要求用子查询实现“统计选修数据库原理的人数”“查询没有选修数据库原理的学生信息”等。嵌套查询的核心是子查询返回单值、一列多行还是多列多行对应不同的运算符。返回单值用、、等比较运算符。返回一列多行用IN、ANY、ALL。判断是否存在用EXISTS子查询通常写成SELECT * FROM ... WHERE ...。-- 统计选修数据库原理课程的学生人数 SELECT COUNT(DISTINCT SC.学号) FROM 选修200905 SC JOIN 课程200905 C ON SC.课程号 C.课程号 WHERE C.课程名 数据库原理; -- 查询没有选修数据库原理的学生信息NOT IN 写法 SELECT * FROM 学生200905 WHERE 学号 NOT IN ( SELECT SC.学号 FROM 选修200905 SC JOIN 课程200905 C ON SC.课程号 C.课程号 WHERE C.课程名 数据库原理 );易漏点NOT IN遇到子查询结果含 NULL 时会返回空结果因为NULL参与比较结果是 UNKNOWN。更安全的写法是NOT EXISTS。实验里还要求“查询其他系中比计算机系学生年龄都小的学生信息”这需要先用子查询算出计算机系所有学生的出生日期再用ALL或MAX比较。4.2 组合查询UNION、INTERSECT、EXCEPT 与等价嵌套写法实验三明确要求用两种方法实现同一查询UNION 对 ININTERSECT 对 EXISTSEXCEPT 对 NOT EXISTS。这是复习的重点因为考试常考“写出等价写法”。组合操作含义等价嵌套写法UNION并集去重IN 或 ORINTERSECT交集EXISTS 双重嵌套EXCEPT差集NOT EXISTS-- 查询被 0602001 或 0602002 选修的课程号UNION SELECT 课程号 FROM 选修200905 WHERE 学号 0602001 UNION SELECT 课程号 FROM 选修200905 WHERE 学号 0602002; -- 等价 IN 写法 SELECT DISTINCT 课程号 FROM 选修200905 WHERE 学号 IN (0602001, 0602002); -- 查询两人同时选修的课程号INTERSECT SELECT 课程号 FROM 选修200905 WHERE 学号 0602001 INTERSECT SELECT 课程号 FROM 选修200905 WHERE 学号 0602002; -- 等价 EXISTS 写法 SELECT DISTINCT 课程号 FROM 选修200905 SC1 WHERE 学号 0602001 AND EXISTS ( SELECT 1 FROM 选修200905 SC2 WHERE SC2.学号 0602002 AND SC2.课程号 SC1.课程号 );梳理下来会发现组合查询的列数和数据类型必须一致否则报错。UNION 默认去重UNION ALL 保留重复。INTERSECT 和 EXCEPT 在某些数据库版本里支持情况不同复习时要确认所用 DBMS 的语法。实验报告里还提到“括号的配对使用问题”嵌套层数多了以后括号不匹配是常见错误建议每写一层子查询就缩进对齐。注意EXCEPT 和 NOT EXISTS 在语义上等价但 EXCEPT 会自动去重NOT EXISTS 不会需要配合 DISTINCT 使用。5. 数据更新与实验总结查漏补缺的复习清单5.1 数据更新INSERT、UPDATE、DELETE 的约束联动实验四的数据更新虽然篇幅短但和前面的完整性约束直接相关。插入数据时要满足主码唯一、外码引用存在、默认值生效、CHECK 约束通过。更新和删除时要注意外码的级联行为如果选修表引用了学生表删除学生前必须先删选修记录或者建表时定义ON DELETE CASCADE。-- 插入学生数据性别用默认值 INSERT INTO 学生200905 (学号, 姓名, 出生日期, 院系名称) VALUES (0602001, 李华, 2000-05-12, 计算机系); -- 更新分数 UPDATE 选修200905 SET 分数 85 WHERE 学号 0602001 AND 课程号 C01; -- 删除选课记录 DELETE FROM 选修200905 WHERE 学号 0602001 AND 课程号 C01;复习时要能说出插入时如果省略性别列默认值“男”生效如果显式写 NULL则存入 NULL。更新时如果违反外码约束比如把学号改成不存在的值会报错。删除时如果被外码引用默认是 RESTRICT即拒绝删除。5.2 复习清单从建库到查询的查漏补缺表把四个实验串起来复习时按下面的清单逐项自检模块必会操作易错点自检方式建库CREATE DATABASE 完整语法文件大小和增长策略默写语句建表主码、外码、默认值、CHECK复合主码、自参照外码画表结构图单表查询WHERE、ORDER BY、GROUP BY、HAVINGWHERE 与 HAVING 混用改错题多表连接INNER JOIN、LEFT JOIN、自连接漏连接条件导致笛卡尔积对比结果行数嵌套查询IN、EXISTS、ANY、ALLNOT IN 遇 NULL 返回空换 NOT EXISTS组合查询UNION、INTERSECT、EXCEPT列数不一致、括号不配对写等价写法数据更新INSERT、UPDATE、DELETE外码约束、默认值触发手动执行看报错梳理下来会发现数据库原理实验的复习不是背题而是把“约束—查询—更新”当成一个闭环。建表时定义的约束会在插入和更新时生效查询时写的连接条件依赖建表时的主外码关系。最容易忽略的是NULL 的三值逻辑它影响查询条件、聚合函数、NOT IN 和 EXISTS 的行为几乎每个实验都有它的影子。从那以后我每次复习数据库实验都强制走一遍“建库→建表→插数据→单表查→多表查→嵌套查→更新删”的完整链路而不是跳着看题。希望这份梳理帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑