news 2026/10/19 6:11:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据库实验报告解读: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 Sdept='IS'这条语句并没有真的存一份新数据,它只是把“查信息系学生”这个常用操作打包成一个名字。以后你直接SELECT * FROM IS_Student就行了,不用每次都写一遍 WHERE 条件。打个比方,视图就像手机里的快捷指令,你把“给妈妈发微信说今晚不回家吃饭”设成一个按钮,按一下就行,但消息本身还是走微信发出去的,并没有多出一个新 App。

2.3 增删改查:四种动作对应四种心态

实验里数据操作部分占了很大篇幅,插入用INSERT INTO,修改用UPDATE,删除用DELETE FROM,查询用SELECT。这四种动作对应四种完全不同的心态。插入是乐观的,你默认数据是新的、合法的,往里塞就行;修改是谨慎的,因为UPDATE Student SET Sage=Sage+1这种语句一旦忘了写 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 Sno='20100022'只是把学号为 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 建了索引,如果这张表几乎不更新、只用来查,那没问题;如果这张表天天改课程名,索引的维护成本就会显现出来。

从那以后我每次建表前都强制走一遍:先问这个字段会不会经常改,再问这个规则会不会变,最后才决定加不加约束、建不建索引。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 6:10:03

大模型多Agent系统显存优化:KV Cache共享机制解析

最近在啃一篇关于大模型Agent系统效率的论文&#xff0c;标题是《INMS: Memory Sharing for Large Language Model based Agents》。它的核心问题一句话就能说清楚&#xff1a;多个基于大语言模型的Agent并行运行时&#xff0c;每个人都在维护自己的长上下文&#xff0c;KV Cac…

作者头像 李华
网站建设 2026/10/19 6:10:02

Python实现DoS攻击模拟:从SYN Flood原理到防御实战

1. 从一次应急响应说起&#xff1a;为什么要研究DoS攻击原理两年前我处理过一起业务中断事件&#xff0c;某平台晚间高峰期突然无法访问&#xff0c;运维同事第一反应是“服务器是不是被打爆了”。登录机器一看&#xff0c;CPU倒是不高&#xff0c;但ss -s显示TCP连接数暴涨&am…

作者头像 李华
网站建设 2026/10/19 6:07:24

AI查重软件怎么选?九款方案对比与避坑指南

最近有位同事拿着一篇改了三稿的综述来找我&#xff0c;查重率从36%降到了6%&#xff0c;本来以为稳了&#xff0c;结果期刊编辑退回意见里写了一句话&#xff1a;“语义重复度过高&#xff0c;疑似改写不充分。”她整个人是懵的&#xff1a;查重软件都说没问题了&#xff0c;怎…

作者头像 李华
网站建设 2026/10/19 6:07:24

后台管理摄像头划警戒区域:从画框到报警的全链路实战

做过安防项目的人都懂&#xff0c;"后台管理摄像头划警戒区域"这九个字背后&#xff0c;真正的活儿远不止在管理后台里画几个框那么简单。这个需求的完整链路是&#xff1a;在Web后台打开一路实时视频&#xff0c;用鼠标在画面上圈出一块区域&#xff08;矩形或者多边…

作者头像 李华
网站建设 2026/10/19 6:06:47

KV Cache显存管理揭秘:vLLM如何将大模型推理吞吐翻倍?

跑过开源大模型推理的都知道&#xff0c;最大的瓶颈往往不是模型权重占多少显存&#xff0c;而是生成过程中不断膨胀的 KV Cache。很多人第一次切到 vLLM&#xff0c;看到同样一张显卡&#xff0c;吞吐翻了几倍&#xff0c;第一反应是它换了什么神级算子&#xff0c;实际上真正…

作者头像 李华
网站建设 2026/10/19 6:06:46

毕业论文AI辅助工具怎么选?6款实用工具对比与全流程实操指南

每年三四月份&#xff0c;总有一批人同时陷入同样的焦虑&#xff1a;文献没读完、大纲被推翻、初稿写不出来、查重红了一片。我这些年帮不少人看过毕业论文&#xff0c;发现一个越来越明显的趋势——大家手里都装了AI工具&#xff0c;但用得好的没几个。大多数人要么把AI当百度…

作者头像 李华