数据库实验报告解读:SQL建表、约束与查询核心概念

发布时间:2026/10/19 6:11:30
数据库实验报告解读:SQL建表、约束与查询核心概念 简介这份资源是太原理工大学软件工程专业「数据库概论」课程的实验报告文档面向正在学习数据库系统原理、需要完成SQL实验或备考复习的本科生。报告以Microsoft SQL Server 2016为实验平台围绕交互式SQL语句的使用展开涵盖数据定义、索引创建、视图创建与数据操作四大模块具体包括用CREATE TABLE建表、ALTER TABLE修改结构、DROP TABLE删除表以及唯一索引、聚簇索引的建立和IS_Student视图的创建并配有Student、Course、Sc等表的完整SQL示例与插入、更新语句。资源包为1个docx文件大小约1.69MB内容为可直接参考的实验报告模板与操作记录。目前已有311人学习下载适合需要对照实验步骤、梳理SQL语法要点或撰写课程报告的同学借鉴使用。1. 数据库实验报告到底在讲什么从一份课程作业看懂 SQL 的骨架很多人第一次听到“数据库实验报告”这六个字脑子里浮现的画面大概是一堆看不懂的英文大写命令加上几张密密麻麻的表格最后再来一段“本次实验收获很大”的套话。但如果你把这份报告里的内容拆开看会发现它其实在讲一件很朴素的事——怎么用一套标准化的语言把数据存进去、查出来、管起来。这套语言就是 SQL全称结构化查询语言。打个比方数据库像一个大仓库表是货架字段是货架上的标签而 SQL 就是你跟仓库管理员沟通的那套话术。你说“把编号 20100001 的货物年龄改成 22”管理员就照做你说“把所有计算机系的货物理出来”管理员也不会拿错。这份实验报告记录的就是一个初学者从建仓库、摆货架、贴标签到后来学会加锁、设规矩的完整过程。它之所以值得搞懂是因为几乎任何软件系统背后都站着一个数据库你手机里的通讯录、购物车里的商品、公司后台的考勤记录底层都是这套逻辑在支撑。2. 数据定义与操作为什么建表和查数据是两套功夫2.1 建表不是画表格是在给数据定规矩很多人以为建表就是画个 Excel 表头把列名写上就完事了。但数据库里的CREATE TABLE远不止于此。你看实验里创建 Student 表时写了这么一行CREATE TABLE Student( Sno CHAR(8) PRIMARY KEY, Sname CHAR(10), Ssex CHAR(2), Sage INT, Sdept CHAR(20) );这里的PRIMARY KEY就是在告诉数据库Sno 这个字段是唯一身份证不允许两个人用同一个学号也不允许空着不填。CHAR(8)则规定了学号必须是 8 个字符长度多一个少一个都不行。通俗地说建表就像给仓库货架焊铁架子——你先得决定每层能放多大的箱子哪一层是主钥匙位哪一层可以空着。实验里还做了ALTER TABLE Student ADD Sclass CHAR(4)这就是货架用了一段时间发现少了一层再焊一层上去。而DROP TABLE Employee则是把整个货架连货带架子一起扔掉这个操作没有后悔药所以实验报告里特意提醒执行前要确认。2.2 索引和视图给查询装加速器给复杂操作装快捷方式数据量小的时候你查一条记录数据库挨个翻一遍也无所谓。但数据一多比如几万条学生记录每次查“刘晨”都要全表扫描那就跟在一本没有目录的字典里找字一样痛苦。索引就是给字典加目录。实验里CREATE INDEX iCname ON Course(Cname)就是在 Course 表的课程名字段上建了一个目录以后按课程名查就快得多。而CREATE UNIQUE INDEX iSname ON Student(Sname)多加了一层意思不仅建目录还规定学生姓名不能重复。聚簇索引CREATE CLUSTERED INDEX iSnoCno ON Sc(Sno,Cno DESC)则更进一步它直接决定了数据在硬盘上的物理排列顺序就像图书馆把同一类书按编号挨着放找起来自然快。视图则完全是另一回事。CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE SdeptIS这条语句并没有真的存一份新数据它只是把“查信息系学生”这个常用操作打包成一个名字。以后你直接SELECT * FROM IS_Student就行了不用每次都写一遍 WHERE 条件。打个比方视图就像手机里的快捷指令你把“给妈妈发微信说今晚不回家吃饭”设成一个按钮按一下就行但消息本身还是走微信发出去的并没有多出一个新 App。2.3 增删改查四种动作对应四种心态实验里数据操作部分占了很大篇幅插入用INSERT INTO修改用UPDATE删除用DELETE FROM查询用SELECT。这四种动作对应四种完全不同的心态。插入是乐观的你默认数据是新的、合法的往里塞就行修改是谨慎的因为UPDATE Student SET SageSage1这种语句一旦忘了写 WHERE全表所有人的年龄都会加一岁删除是悲观的实验里特意先把选课信息复制到临时表 tmpSC 再删就是怕手一抖把原始数据删没了查询则是探索性的你可以用BETWEEN、IN、LIKE、IS NULL各种条件组合去翻数据翻错了也没关系不会改变任何东西。3. 数据完整性与约束数据库怎么防止你往仓库里扔垃圾3.1 主键、外键、CHECK三道不同的门禁实验三专门讲数据完整性核心就一句话数据库不能什么都往里存得设门槛。主键约束是第一道门保证每条记录都有唯一标识实验里往 Student 表插两条 Sno 都是 20100001 的记录第二条就会被挡在门外。外键约束是第二道门保证表与表之间的引用关系不断裂比如 SC 表的 Sno 必须能在 Student 表里找到对应的人你不能给一个不存在的学生选课。CHECK 约束是第三道门管的是字段值的合理范围CHECK(Grade 0 AND Grade 100)就是告诉数据库成绩只能在 0 到 100 之间你写 150 分或者 -10 分都会被拒绝。这三道门禁各管各的互不替代。主键管唯一性外键管引用一致性CHECK 管值域合法性。实验里还演示了ALTER TABLE SC DROP CONSTRAINT SC_CHECK再重新加上一个更宽松的约束这说明约束不是焊死的可以改但改之前要想清楚会不会放进来不该放的数据。3.2 默认值和空值不填和填零是两码事实验里 Student 表有一个Stotal smallint DEFAULT 0意思是如果你插入记录时不指定 Stotal 的值数据库自动帮你填 0。而 Sage 字段没有设默认值也没有设 NOT NULL所以你可以插入一条 Sage 为 NULL 的记录。这里有个初学者最容易翻车的地方NULL 不是 0也不是空字符串。它代表“未知”。你查WHERE Sage IS NULL能查到那些没填年龄的人但WHERE Sage NULL永远查不到任何东西因为 NULL 跟任何值比较结果都是未知。实验里INSERT INTO Student(Sno,Sname,Ssex,Sclass) VALUES(20100102,张盛,男,1008)这条语句没有给 Sage 和 Sdept 赋值数据库就自动填 NULL而 Stotal 因为有默认值所以填了 0。3.3 触发器比约束更灵活的自动反应机制实验目的里提到了解触发器机制虽然正文没有展开写触发器的具体代码但它的定位很清楚约束只能管简单的规则触发器能管复杂的连锁反应。比如你想实现“删除一个学生时自动把他的选课记录也删掉”外键约束可以做到级联删除但如果你想实现“删除一个学生时先把他选课记录备份到日志表再删除”那就得靠触发器。触发器就像仓库里装的感应器一旦有人动了某排货架感应器就自动触发一个动作不需要你每次手动去操作。4. 常见误区与易混概念这几组词初学者十有八九会搞混4.1 DELETE 和 DROP一个删内容一个连锅端这是最经典的混淆。DELETE FROM Student WHERE Sno20100022只是把学号为 20100022 的那一行数据从表里拿掉表还在结构还在其他数据还在。而DROP TABLE Employee是把整个 Employee 表从数据库里抹掉表结构、数据、索引、约束全部消失。打个比方DELETE 是把冰箱里的一盒牛奶扔了DROP 是把整个冰箱搬走。实验里删除表用的是 DROP删除数据用的是 DELETE分得很清楚。4.2 WHERE 和 HAVING一个管行一个管组实验里SELECT cno, COUNT(*), AVG(Grade) FROM SC GROUP BY Cno HAVING AVG(Grade) 90这条语句同时出现了 WHERE 和 HAVING 的变体。WHERE 是在分组之前过滤原始行HAVING 是在分组之后过滤统计结果。你不能写WHERE AVG(Grade) 90因为 WHERE 执行的时候还没算平均值呢。通俗地说WHERE 是筛人HAVING 是筛小组。你先按课程号把选课记录分成一组一组然后 HAVING 再决定哪些组留下来。4.3 UNION 和 JOIN一个竖着拼一个横着拼实验里集合查询用了UNION、INTERSECT、EXCEPT连接查询用了JOIN。这两类操作方向完全不同。UNION 是把两个查询结果上下摞在一起要求列数和类型对得上JOIN 是把两个表的列横向拼在一起通过关联字段匹配。比如你查“计算机系的学生”和“年龄不大于 19 岁的学生”用 UNION 得到的是两类人的并集可能有人同时满足两个条件但只出现一次而 JOIN 是查“每个学生及其选课信息”把 Student 表的行和 SC 表的行按学号配对拼宽。4.4 CHAR 和 VARCHAR定长和变长的区别实验里 Student 表的 Sname 用的是CHAR(10)而 Employee 表的姓名用的是VARCHAR(8)。CHAR 是定长你存“李勇”两个字它也会占满 10 个字符后面补空格VARCHAR 是变长存“李勇”就只占两个字符的空间。定长的好处是读写速度快变长的好处是省空间。选哪个取决于你的数据特征如果字段长度基本一致比如学号固定 8 位用 CHAR如果长度差异大比如姓名从两字到四字都有用 VARCHAR。4.5 NULL 和 0 和空字符串三胞胎长得像但完全不一样前面提过 NULL 代表未知0 是一个确定的数值空字符串是一个长度为零的字符串。WHERE Score IS NULL查的是没填成绩的记录WHERE Score 0查的是考了零分的记录WHERE Score 在数值字段上根本不会匹配任何东西。实验里插入 SC 表时用了INSERT INTO SC VALUES(20100003,1,null)这就是明确告诉数据库这个学生选了课但成绩还没出来是未知状态不是零分。5. 什么时候该用数据库约束什么时候别硬扛学完这份实验报告里的内容你大概能感觉到数据库约束是个好东西主键防重复外键防断链CHECK 防乱填默认值省事。但约束不是越多越好。我踩过的一个坑是早期做一个小工具给每个字段都加了 NOT NULL 和 CHECK结果后来业务变了需要允许某个字段暂时为空改约束比改代码还麻烦。约束应该加在真正不会变的核心规则上比如学号唯一、成绩在 0 到 100 之间这些规则十年都不会变。而那些可能随业务调整的规则比如“年龄必须大于 0”其实放在应用层校验更灵活。另一个判断标准是性能。外键约束在每次插入和删除时都要去检查另一张表数据量大的时候会拖慢速度。实验里数据量小感觉不到但真实系统里几百万条记录外键的开销就不能忽略了。所以很多互联网公司会在数据库层去掉外键改在应用层保证一致性用牺牲一点安全性换性能。这不是说外键不好而是说没有银弹只有权衡。视图也一样。视图能简化查询但嵌套视图套多了数据库优化器可能选不出好的执行计划查询反而变慢。实验里创建的视图都很简单一层套一层的情况在实际中要谨慎。索引更是如此索引能加速查询但会拖慢插入和更新因为每次改数据都要维护索引结构。实验里给 Course 表的 Cname 建了索引如果这张表几乎不更新、只用来查那没问题如果这张表天天改课程名索引的维护成本就会显现出来。从那以后我每次建表前都强制走一遍先问这个字段会不会经常改再问这个规则会不会变最后才决定加不加约束、建不建索引。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询