尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

SQL Server 2000数据库实验指导:课后习题答案与T-SQL脚本详解

发布时间:2026/9/26 9:58:24

资讯中心
01
ARTICLE

SQL Server 2000数据库实验指导:课后习题答案与T-SQL脚本详解

SQL Server 2000数据库实验指导:课后习题答案与T-SQL脚本详解
简介这份《数据库课后习题答案(第四版)》配套资料面向高校数据库课程学习者与备考学生聚焦SQL Server 2000环境下数据库原理实验与课后习题的解答参考帮助读者巩固课堂知识、核对实验步骤与查询结果。资源包内含1个PDF文档大小约856KB内容以实验手册形式组织覆盖服务管理器、企业管理器、查询分析器三大工具的使用Windows与SQL Server两种身份验证模式的差异以及CREATE DATABASE、ALTER DATABASE、DROP DATABASE等T-SQL语句的完整示例。资料还详细展开数据库三类文件.mdf、.ndf、.ldf的用途student、course、sc三表的创建与主键、外键、UNIQUE、CHECK约束设置并附有数据输入与查询例题的参考解答。目前已有1830人学习下载适合需要对照实验步骤、梳理SQL语句写法或准备课程考核的读者使用。1. 数据库课后习题答案(第四版).pdf一份能直接跑通 SQL Server 2000 实验的参考手册如果你手头正压着一份《数据库原理》的实验报告实验环境还是 SQL Server 2000那你大概率已经体会过那种“书上的例题跑不通、老师给的脚本报错、网上搜到的答案版本对不上”的滋味。这份《数据库课后习题答案(第四版).pdf》不是单纯的选择题答案汇总它把教材第四版里六个核心实验——从熟悉 SQL Server 2000 环境、创建和修改数据库到建表加约束、单表查询、复杂分组查询、多表连接查询——的完整 T-SQL 语句和操作步骤都整理了出来。适合两类人一是正在做数据库课程设计、需要对照实验步骤逐条复现的学生二是多年没碰 SQL Server 2000、临时要带实验课或帮人排查脚本的从业者。它解决的核心问题很具体让你不用在企业管理器和查询分析器之间反复试错直接拿到能跑的语句和参数。2. 实验环境搭建与身份验证从服务管理器到查询分析器2.1 为什么 SQL Server 2000 的实验环境总在连接这一步翻车SQL Server 2000 是微软早期关系型数据库管理系统它的管理工具链和现在 SSMS 那一套完全不同。服务管理器负责启停 SQL Server 服务企业管理器是图形化管库入口查询分析器才是写 T-SQL 的地方。很多人第一次装完服务管理器右下角图标是红的企业管理器里展开不了任何结点查询分析器连不上——问题基本都出在身份验证模式上。SQL Server 2000 支持两种验证Windows 身份验证靠操作系统账号直接放行SQL Server 身份验证则要单独设 sa 密码。实验里通常要求两种都试一遍但默认安装往往只开了 Windows 模式导致用 sa 登录时直接报“登录失败”。常见做法是装完实例后在企业管理器里右键服务器属性切到“安全性”页把验证模式改成“SQL Server 和 Windows”然后重启服务。这一步不做后面所有实验都卡在连接上。另外SQL Server 2000 默认不自动启动服务每次开机要手动在服务管理器里点绿三角或者把它设成自动启动。2.2 用查询分析器跑通第一个实验USE、sp_help 和 SELECT实验一的核心是让你熟悉查询分析器的操作路径。打开查询分析器后先选 Windows 身份验证连上然后在查询窗口里逐条执行下面这些语句。注意SQL Server 2000 的查询分析器默认连到 master 库要先用 USE 切到 pubs 样例库。-- 切换到 pubs 样例数据库 USE pubs GO -- 查看当前数据库里所有对象的帮助信息 EXEC sp_help GO -- 查询 authors 表的全部数据 SELECT * FROM authors GOUSE pubs的作用是把当前会话的默认数据库从 master 切到 pubs后续所有不加库名前缀的表都默认在 pubs 里找。EXEC sp_help是系统存储过程不带参数时返回当前库里所有对象表、视图、存储过程的清单带表名参数时返回该表的列定义、索引、约束等详细信息。SELECT * FROM authors是最简单的全列查询用来验证查询分析器能正常返回结果集。如果这一步报“对象名 authors 无效”说明 pubs 库没装或者没切过去——SQL Server 2000 默认安装时会问你要不要装样例库很多人当时点了否后面就得手动附加 pubs 的 mdf 文件。2.3 创建 S_T 数据库和 student、course、sc 三张表实验一后半段要求在企业管理器里建 S_T 库再建三张表。企业管理器的操作路径是右键“数据库”→新建数据库→填名称 S_T→确定然后右键 S_T 下的“表”→新建表→逐列填字段名、类型、长度、是否允许空。但更稳的方式是直接用 T-SQL 建因为图形界面里设约束容易漏。-- 创建 S_T 数据库采用默认设置 CREATE DATABASE S_T GO -- 切换到 S_T USE S_T GO -- 创建 student 表Sno 为主键 CREATE TABLE student ( Sno CHAR(5) NOT NULL PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2) NOT NULL, Sage SMALLINT NOT NULL, Sdept CHAR(20) NOT NULL ) GO -- 创建 course 表Cno 为主键 CREATE TABLE course ( Cno CHAR(4) NOT NULL PRIMARY KEY, Cname CHAR(40) NOT NULL, Cpno CHAR(4) NULL, Ccredit SMALLINT NOT NULL ) GO -- 创建 sc 表Sno 和 Cno 组合主键 CREATE TABLE sc ( Sno CHAR(5) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT NULL, PRIMARY KEY (Sno, Cno) ) GOCREATE DATABASE S_T不带任何参数时数据文件和日志文件都放在 SQL Server 2000 的默认数据目录下初始容量和增长方式也走默认值。PRIMARY KEY直接写在列定义后面是单列主键的简写sc 表用的是表级约束PRIMARY KEY (Sno, Cno)因为组合主键必须写成表级。CHAR和SMALLINT是 SQL Server 2000 里常用的定长字符和短整型和现在VARCHAR满天飞的风格不同实验里按书上结构走就行。建完三张表后用INSERT INTO逐条灌数据数据内容参考教材第 56 页的图这里不重复列。提示SQL Server 2000 的查询分析器里GO是批处理分隔符不是 T-SQL 语句。每条CREATE TABLE后面跟一个GO能避免“语句必须为批处理中第一条”这类报错。3. 数据库与数据表的创建修改文件类型、约束和 ALTER 语句3.1 主数据文件、次要数据文件和事务日志文件的参数怎么设实验二的重点是让你理解数据库的三种文件类型主数据文件.mdf存系统信息和用户数据次要数据文件.ndf用来扩展存储空间事务日志文件.ldf记录所有更改用于恢复。创建数据库时如果不指定文件参数SQL Server 2000 会按默认值走——初始容量很小增长方式也是默认的。但实验里要求你显式指定初始容量、最大容量和递增量这时候就得写完整的CREATE DATABASE语句。-- 创建 testdb 数据库显式指定数据文件和日志文件参数 CREATE DATABASE testdb ON ( NAME testdb_data, FILENAME d:\DATA\testdb_data.mdf, SIZE 2MB, MAXSIZE 8MB, FILEGROWTH 1MB ) LOG ON ( NAME testdb_log, FILENAME d:\DATA\testdb_log.ldf, SIZE 1MB, MAXSIZE 5MB, FILEGROWTH 1MB ) GOON子句后面跟的是数据文件的定义LOG ON后面跟的是日志文件。NAME是逻辑文件名在 T-SQL 里引用文件时用这个名字FILENAME是磁盘上的物理路径必须指向一个已经存在的目录否则报“操作系统错误 3”。SIZE是初始容量MAXSIZE是上限FILEGROWTH是每次自动增长的量。实验里给的路径是d:\DATA\如果你的机器没有 D 盘改成c:\DATA\并提前建好目录。MAXSIZE不写或者写UNLIMITED表示不限制增长但实验要求显式设上限照做就行。3.2 用 ALTER DATABASE 添加数据文件和修改日志参数建完库之后实验要求对 testdb 做修改加一个次要数据文件再把日志文件的最大容量和递增量改掉。ALTER DATABASE的语法和CREATE DATABASE类似但加文件用ADD FILE改文件用MODIFY FILE。-- 向 testdb 添加一个次要数据文件 ALTER DATABASE testdb ADD FILE ( NAME testdb2_data, FILENAME d:\DATA\testdb2_data.ndf, SIZE 1MB, MAXSIZE 5MB, FILEGROWTH 1MB ) GO -- 修改日志文件的最大容量和递增量 ALTER DATABASE testdb MODIFY FILE ( NAME testdb_log, MAXSIZE 15MB, FILEGROWTH 2MB ) GOADD FILE后面跟的NAME不能和已有逻辑文件名重复FILENAME的扩展名习惯上用.ndf表示次要数据文件但 SQL Server 2000 不强制检查扩展名写.mdf也能跑。MODIFY FILE里只需要写要改的属性没写的属性保持原值。注意MODIFY FILE不能改FILENAME要挪文件得先脱机再改路径实验里不涉及。如果执行ALTER DATABASE时报“无法获得数据库 testdb 上的排他锁”说明有别的会话连着这个库关掉查询分析器里其他窗口再试。3.3 在 company 库里加文件组和删除数据文件实验二还要求对 company 库做一套更复杂的操作加文件组 TempGroup往文件组里加数据文件再删掉之前加的 company2_data。文件组是 SQL Server 里用来把多个数据文件归到一起的逻辑容器主要为了管理方便。-- 在 company 数据库中添加文件组 TempGroup ALTER DATABASE company ADD FILEGROUP TempGroup GO -- 向 TempGroup 文件组中添加一个数据文件 ALTER DATABASE company ADD FILE ( NAME company3_data, FILENAME d:\DATA\company3_data.ndf, SIZE 3MB, MAXSIZE 10MB, FILEGROWTH 1MB ) TO FILEGROUP TempGroup GO -- 删除数据文件 company2_data ALTER DATABASE company REMOVE FILE company2_data GOADD FILEGROUP只建一个逻辑组不占磁盘空间。ADD FILE ... TO FILEGROUP把新文件挂到指定组里不写TO FILEGROUP时默认进 PRIMARY 组。REMOVE FILE只能删空文件如果文件里还有数据SQL Server 2000 会报错得先把数据挪走或者用DBCC SHRINKFILE带EMPTYFILE选项清空。实验里 company2_data 是刚加的、没写过数据所以直接删能成功。注意SQL Server 2000 不支持在线删除有数据的文件REMOVE FILE之前确认文件是空的。另外删文件不会自动删磁盘上的物理文件得手动去目录里清掉。4. 单表查询与复杂分组SELECT 子句、WHERE 条件和汇总函数4.1 用 TOP、DISTINCT 和 BETWEEN 做基础筛选实验四和实验五覆盖了单表查询的两大块基础筛选和分组汇总。基础筛选里SELECT子句用TOP限制返回行数用DISTINCT去重WHERE子句用比较符、BETWEEN、IN、LIKE、IS NULL组合条件ORDER BY排序。这些语法在 SQL Server 2000 里和现在基本一致但有几个细节容易翻车。-- 查找薪水最高的前三条员工记录 SELECT TOP 3 * FROM employee ORDER BY salary DESC GO -- 查找订单金额最高的前 10% 的订单记录 SELECT TOP 10 PERCENT * FROM sales ORDER BY tot_amt DESC GO -- 查找住址为上海、北京、天津的员工 SELECT * FROM employee WHERE addr IN (上海, 北京, 天津) GO -- 查找姓“刘”的客户名称和电话 SELECT cust_name, tel_no FROM customer WHERE cust_name LIKE 刘% GOTOP 3必须和ORDER BY一起用才有确定意义否则返回哪三条是随机的。TOP 10 PERCENT按结果集总行数的百分比取整行数少的时候可能返回 0 条。IN后面跟值列表等价于多个OR但写法更干净。LIKE 刘%里%匹配任意长度字符_匹配单个字符SQL Server 2000 的LIKE不支持正则别把[]和^混进来。4.2 GROUP BY 和 HAVING 的配合先分组再筛组实验五的核心是GROUP BY和HAVING。GROUP BY把行按列值分组每组出一行HAVING对分组后的结果再筛。很多人分不清WHERE和HAVINGWHERE在分组前筛行HAVING在分组后筛组。汇总函数COUNT、SUM、AVG、MAX、MIN只能出现在SELECT列表或HAVING里不能出现在WHERE里。-- 统计各部门员工人数及平均薪水 SELECT dept, COUNT(*) AS 人数, AVG(salary) AS 平均工资 FROM employee GROUP BY dept GO -- 找出销售业绩超过 40000 元的业务员编号及业绩按业绩降序 SELECT sale_id, SUM(tot_amt) AS 总业绩 FROM sales GROUP BY sale_id HAVING SUM(tot_amt) 40000 ORDER BY SUM(tot_amt) DESC GO -- 查询订购了三种以上产品的订单号 SELECT order_no FROM sale_item GROUP BY order_no HAVING COUNT(*) 3 GO第一个查询按dept分组每组算人数和平均薪水。第二个查询先按sale_id分组算总业绩再用HAVING筛出超过 40000 的组最后按总业绩降序排。第三个查询按order_no分组COUNT(*)数每组行数HAVING COUNT(*) 3筛出订购产品种类超过三种的订单。注意HAVING里不能用SELECT列表里定义的别名得把汇总表达式重写一遍。4.3 CUBE 和 ROLLUP一次查出多级汇总实验五最后两题要求用CUBE和ROLLUP统计各部门不同性别的平均薪水。这两个关键字在GROUP BY后面用用来生成额外的汇总行。ROLLUP生成层级汇总CUBE生成所有可能的组合汇总。-- 用 ROLLUP 统计各部门不同性别及各部门的平均薪水 SELECT dept, sex, AVG(salary) AS 平均薪水 FROM employee GROUP BY dept, sex WITH ROLLUP GO -- 用 CUBE 统计各部门不同性别、各部门、不同性别及所有员工的平均薪水 SELECT dept, sex, AVG(salary) AS 平均薪水 FROM employee GROUP BY dept, sex WITH CUBE GOROLLUP按dept, sex的顺序生成每个部门每种性别的平均薪水、每个部门的平均薪水sex 为 NULL 的行、所有员工的平均薪水dept 和 sex 都为 NULL 的行。CUBE在此基础上多出“每种性别的平均薪水”dept 为 NULL 的行。结果集里 NULL 表示汇总行不是数据缺失。SQL Server 2000 支持这两个关键字但后来版本推荐用GROUPING SETS实验里按书上的写法走就行。5. 连接查询与避坑排查内连接、外连接和自身连接5.1 在 FROM 子句和 WHERE 子句里写连接的两种方式实验六要求掌握内连接、左外连接、右外连接、全外连接和自身连接并且要在FROM子句和WHERE子句里各写一遍。FROM子句里用JOIN ... ONWHERE子句里用逗号加等号条件。SQL Server 2000 两种都支持但WHERE子句里的外连接用*和*这种写法在后续版本里被废弃了。-- FROM 子句内连接检索 product 和 sale_item 中数量大于 2 的相同产品 SELECT a.prod_id, b.prod_name, a.qty, a.unit_price FROM sale_item AS a INNER JOIN product AS b ON a.prod_id b.prod_id WHERE a.qty 2 ORDER BY a.prod_id GO -- WHERE 子句内连接同样效果的另一种写法 SELECT a.prod_id, b.prod_name, a.qty, a.unit_price FROM sale_item AS a, product AS b WHERE a.prod_id b.prod_id AND a.qty 2 ORDER BY a.prod_id GO -- 左外连接product 左连 sale_item单价高于 2400 SELECT b.prod_id, b.prod_name, a.qty, a.unit_price FROM product AS b LEFT JOIN sale_item AS a ON b.prod_id a.prod_id AND a.unit_price 2400 GOINNER JOIN ... ON和FROM a, b WHERE a.x b.x在内连接场景下等价但JOIN写法把连接条件和筛选条件分开可读性更好。左外连接LEFT JOIN保留左表所有行右表没匹配的列填 NULL。注意ON子句里的AND a.unit_price 2400是连接条件的一部分不是筛选条件——如果写到WHERE里左表中没匹配的行会被过滤掉外连接就退化成内连接了。这是实验里最容易翻车的地方。5.2 自身连接同一张表取两个别名自身连接是把同一张表取两个不同别名然后按别名做连接。实验里要求查找 employee 表中部门相同且住址相同的女员工以及住址相同的员工对。-- 查找部门相同且住址相同的女员工 SELECT a.emp_name, a.sex, a.title, a.salary, a.addr FROM employee AS a INNER JOIN employee AS b ON a.dept b.dept AND a.addr b.addr AND a.emp_no b.emp_no WHERE a.sex 女 GO -- 查找住址相同的员工对 SELECT a.emp_name, b.emp_name, a.addr FROM employee AS a INNER JOIN employee AS b ON a.addr b.addr AND a.emp_no b.emp_no GO自身连接必须给两个别名否则 SQL Server 分不清是哪个实例。a.emp_no b.emp_no排除自己和自己匹配a.emp_no b.emp_no保证每对只出现一次避免 (A,B) 和 (B,A) 重复。如果忘了加这个条件结果里会出现自己连自己以及每对员工出现两次。5.3 避坑排查连接查询和约束创建里的五个血泪经验现象一外连接结果比预期少。原因把右表的筛选条件写到了WHERE里而不是ON里。解决外连接中对右表的非等值条件必须放在ON子句放WHERE会把 NULL 行滤掉。现象二CREATE TABLE时报“列名无效”。原因SQL Server 2000 对CHAR和VARCHAR的长度单位是字节中文列名或中文数据在非 Unicode 排序规则下可能截断。解决建表时字符列长度留够或者用NCHAR/NVARCHAR存中文。现象三ALTER TABLE ADD CONSTRAINT加外键时报“冲突”。原因子表里已有数据在父表里找不到对应值。解决先删掉冲突数据或者用WITH NOCHECK加约束不推荐实验里要求数据一致。现象四CHECK约束用LIKE [0-9]不生效。原因SQL Server 2000 的LIKE在CHECK里对CHAR列做模式匹配时尾部空格会影响结果。解决用LEN和ISNUMERIC组合判断或者把列改成VARCHAR。现象五查询分析器里GO后面跟语句报错。原因GO是客户端批处理分隔符不是 T-SQL 语句后面不能跟分号或注释。解决GO单独占一行前后不加任何符号。6. 把实验脚本变成可复用的验证套路实验做完之后真正有价值的是把这一套脚本整理成可重复执行的验证流程。我一般会建一个lab_check.sql按实验顺序把建库、建表、加约束、灌数据、查询验证串起来每次换机器或者重装环境直接整个文件跑一遍看哪一步报错就知道环境哪里不对。比如下面这个片段把 S_T 库的建表和约束检查打包在一起-- lab_check.sqlS_T 库完整验证脚本 USE master GO IF EXISTS (SELECT * FROM sysdatabases WHERE name S_T) DROP DATABASE S_T GO CREATE DATABASE S_T GO USE S_T GO CREATE TABLE student ( Sno CHAR(5) NOT NULL PRIMARY KEY CHECK (Sno LIKE [0-9][0-9][0-9][0-9][0-9]), Sname CHAR(20) NOT NULL, Ssex CHAR(2) NOT NULL CHECK (Ssex IN (男, 女)), Sage SMALLINT NOT NULL CHECK (Sage BETWEEN 14 AND 38), Sdept CHAR(20) NOT NULL ) GO -- 插入测试数据后验证约束是否生效 INSERT INTO student VALUES (20231, 张三, 男, 20, 计算机) GO -- 下面这条应该报错因为学号不是五位数字 INSERT INTO student VALUES (ABC, 李四, 女, 22, 数学) GO这个脚本的用法是先跑建库建表再跑正常插入最后跑一条故意违规的插入看 SQL Server 是否按预期报错。如果违规插入没报错说明CHECK约束没加上得回去检查建表语句。IF EXISTS ... DROP DATABASE用来清场保证每次从干净状态开始。sysdatabases是 SQL Server 2000 的系统表查库名用name列。验证连接查询的时候我习惯在脚本末尾加一组对照查询同一组数据分别用内连接、左外连接、右外连接查一遍把结果行数记下来。如果左外连接的行数等于内连接行数说明左表没有未匹配行或者外连接写错了。这个对照法比单看结果集快得多。还有一个习惯每加一个约束立刻插一条违规数据试一下。CHECK约束、外键约束、唯一约束加完不验证等于没加。SQL Server 2000 的报错信息比较直白违规插入会直接告诉你违反了哪个约束名照着约束名回去查定义就行。从那以后我每次带实验或者帮人排查脚本都强制走一遍“建库→建表→加约束→插违规数据→看报错”这个循环能省掉后面大量返工。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。