数据库课后习题答案第四版.docx
《数据库课后习题答案第四版.docx》由会员分享,可在线阅读,更多相关《数据库课后习题答案第四版.docx(35页珍藏版)》请在冰豆网上搜索。
数据库课后习题答案第四版
数据库原理实验手册
实验一
实验名称:
熟悉SQLSERVER2000环境
一、实验目的
熟悉SQLSERVER2000提供的服务管理器、企业管理器、查询分析器、客户端和服务器端网络实用工具等常用管理工具的使用。
了解Windows身份验证和SQLServer身份验证这两种连接数据库服务器方式的不同,并能够使用某种连接方式登陆上SQLSERVER数据库服务器。
学会使用SQLSERVER的联机丛中寻求帮助。
二、实验原理
使用SQLSERVER2000提供的各种常用管理工具进行有关的操作。
三、实验设备
安装有SQLSERVER2000的计算机。
$
四、实验内容
1.启动SQLSERVER服务。
2.打开SQLSERVER的企业管理器,连接上SQLSERVER服务器。
展开左边树状窗口的各级结点,观察右边内容窗口的变化。
3.在SQLSERVER的企业管理器的树状窗口或内容窗口中选择某一项,点击鼠标右键,了解快捷菜单中的有关功能。
4.使用Windows身份验证的连接方式打开SQLSERVER的查询分析器,在查询窗口用USE命令打开样例数据库pubs(也可以从工具栏中的数据库下拉列表中选择pubs数据库)。
5.在查询窗口输入execsp_help,运行后察看结果。
6.在查询窗口输入select*fromauthors,运行后察看结果。
7.在SQLSERVER的查询分析器的“帮助”菜单中点击“目录与索引”,然后在SQLSERVER的联机丛中选“索引”,输入要查找的关键字“sp_help”、“exec”、“select”,了解它们的含义。
8.在SQLSERVER的企业管理器中创建数据库S_T,并在该数据库中创建表student、course和sc,在创建表的同时可以创建各种约束。
这三个表的结构可以参考书上85页的例5、例6和例7。
9.向各个表输入数据,各个表的数据可参考书56页的图。
10.[
11.在SQLServer的查询分析器中打开S_T数据库,输入书中91页开始的例题,实现对数据库的查询。
实验二
实验名称:
创建和修改数据库
一、实验目的
熟悉SQLSERVER的企业管理器和查询分析器的用户界面,掌握用企业管理器和查询分析器创建数据库,修改数据库和删除数据库的方法。
了解数据库的三种文件类型:
主数据文件(.mdf)、次要数据文件(.ndf)和事务日志文件(.ldf)。
二、实验原理
在企业管理器中实现对数据库的管理及使用T—SQL语句CREATEDATABASE、ALTERDATABASE及DROPDATABASE来实现数据库的创建、修改及删除。
三、实验设备
安装有SQLSERVER2000的计算机。
四、实验示例
1.·
2.创建名称为testdb的数据库,数据库中包含一个数据文件,逻辑文件名为testdb_data,磁盘文件名为,文件初始容量为2MB,最大容量为8MB,文件容量递增值为1MB;事务日志文件的逻辑文件名为testdb_log,磁盘文件名为,文件初始容量为1MB,最大容量为5MB,文件容量递增值为1MB。
CREATEDATABASEtestdb
ON
(NAME=testdb_data,
FILENAME='d:
\DATA\',
SIZE=2MB,
MAXSIZE=8MB,
FILEGROWTH=1MB)
LOGON
(NAME=’testdb_log’,
-
FILENAME='d:
\DATA\',
SIZE=1MB,
MAXSIZE=5MB,
FILEGROWTH=1MB)
3.对testdb数据库进行修改:
添加一个数据文件,逻辑文件名为testdb2_data,磁盘文件名为,文件初始容量为1MB,最大容量为5MB,文件容量递增值为1MB。
ALTERDATABASEtestdb
ADDFILE
(NAME=testdb2_data,
FILENAME='d:
\DATA\',
SIZE=1MB,
【
MAXSIZE=5MB,
FILEGROWTH=1MB)
五、实验内容
分别使用SQLSERVER2000企业管理器和T—SQL语句,按下列要求创建、修改和删除用户数据库。
1.删除数据库S_T,在查询分析器中用命令采用默认设置创建数据库S_T(只需给出数据库名)。
2.创建名称为company的数据库,数据库中包含一个数据文件,逻辑文件名为company_data,磁盘文件名为,文件初始容量为5MB,最大容量为15MB,文件容量递增值为1MB;事务日志文件的逻辑文件名为company_log,磁盘文件名为,文件初始容量为5MB,最大容量为10MB,文件容量递增值为1MB。
3.对该数据库进行修改:
添加一个数据文件,逻辑文件名为company2_data,磁盘文件名为,文件初始容量为1MB,最大容量为5MB,文件容量递增值为1MB;将日志文件company_log的最大容量增加为15MB,文件容量递增值为2MB。
4.在company数据库中添加一个文件组TempGroup,并向该文件组中添加一个容量为3MB,最大容量为10MB,递增量为1MB的数据文件,该数据文件的逻辑文件名为company3_data,磁盘文件名为。
5.在company数据库中删除数据文件company2_data。
6.删除数据库company。
7.:
8.采用默认设置创建数据库company。
实验三
实验名称:
创建和修改数据表
一、实验目的
熟悉有关数据表的创建和修改等工作,理解数据库模式的概念,了解主键约束、外键约束、UNIQUE约束和CHECK约束的创建和应用。
要求学生熟练掌握使用企业管理器和T—SQL语句CREATETABLE、ALTERTABLE及DROPTABLE语句对数据表进行管理。
二、实验原理
在企业管理器中实现表的创建和修改等工作及使用T—SQL语句CREATETABLE、ALTERTABLE及DROPTABLE来实现数据表的创建、修改及删除。
三、实验设备
安装有SQLSERVER2000的计算机。
;
四、实验示例
两个示例:
一个是书上的学生选课数据库S_T,S_T数据库中有学生表student,课程表course和学生选课表sc。
各表的结构如下:
学生表student
Sno
char(5)
Notnull
primarykey
学号
Sname
]
char(20)
Notnull
姓名
Ssex
char
(2)
Notnull
性别
Sage
》
smallint
Notnull
年龄
Sdept
char(20)
Notnull
系别
~
课程表course
Cno
char(4)
Notnull
primarykey
课程号
Cname
char(40)
Notnull
"
课程名
Cpno
char(4)
先行课
Ccredit
smallint
Notnull
^
学分
学生选课表sc
Sno
char(5)
Notnull
primarykey
学号
Cno
char(4)
@
Notnull
primarykey
课程号
Grade
smallint
成绩
另一个示例是某公司的产品销售数据库company,company数据库中存在人事表employee、客户表customer、销售表sales、销售明细表sale_item、产品表product。
各表的结构如下:
)
员工人事表employee
emp_no
char(5)
Notnull
primarykey
员工编号
emp_name
varchar(10)
Notnull
<
员工姓名
sex
char
(2)
Notnull
性别
dept
varchar(10)
Notnull
;
所属部门
title
varchar(10)
Notnull
职称
date_hired
datetime
Notnull
、
雇佣日
birthday
datetime
Null
生日
salary
int
Notnull
;
薪水
telephone
varchar(20)
Null
电话
addr
varchar(50)
null
^
住址
客户表customer
cust_id
char(5)
Notnull
primarykey
客户号
cust_name
】
varchar(20)
Notnull
客户名称
addr
varchar(40)
Notnull
客户住址
tel_no
(
varchar(20)
Notnull
客户电话
zip
char(6)
null
邮政编码
~
销售主表sales
order_no
int
Notnull
primarykey
订单编号
cust_id
char(5)
Notnull
》
客户号
sale_id
char(5)
Notnull
业务员编号
tot_amt
numeric(9,2)
Notnull
—
订单金额
order_date
datetime
Notnull
订货日期
销货明细表sale_item
order_no
int
·
Notnull
primarykey
订单编号
prod_id
char(5)
Notnull
primarykey
产品编号
qty
int
-
Notnull
销售数量
unit_price
numeric(7,2)
Notnull
单价
order_date
datetime
-
null
订单日期
产品名称表product
prod_id
char(5)
Notnull
primarykey
产品编号
)
prod_name
varchar(20)
Notnull
产品名称
1.创建表及相应的约束
createtableemployee1(
emp_nochar(5)notnullcheck(emp_nolike'[E-F][0-9][0-9][0-9][0-9]'),
emp_namechar(10)notnull,
@
emp_sexchar
(1)notnullcheck(emp_sexin('m','f')),
emp_phonechar(13)notnull,
emp_addvarchar(60)notnull,
emp_salarychar(5)notnullcheck(emp_salarybetween60000and80000)
)
go
2.修改表
altertableemployee
addconstraintck_phonecheck(phonelike’[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
[0-9][0-9][0-9][0-9][0-9]’)
¥
五、实验内容
分别在SQLSERVER2000企业管理器和在查询分析分析器中使用T—SQL语句完成以下操作:
针对S_T数据库:
1.创建student表,设置Sno为主键;在Sno列上创建核查约束,要求学号各个位上只能取数字字符;在Ssex列上创建核查约束,要求性别只能取“男”或“女”;在Sage列上创建核查约束,要求学生的年龄只能在14至38之间。
2.创建course表,设置列Cno为主键;在Cno列上创建核查约束,要求课程号只能取数字字符。
3.创建sc表,设置主键为Sno与Cno的组合;在Grade列上创建核查约束,限定成绩只能在0-100。
4.修改course表,在表中为Cpno列添加一外键约束Fk_Cpno,它参照了course表的主键Cno。
5.修改sc表,在表中为Sno添加一外键约束Fk_Sno,它参照了student表中的主键Sno;为Cno添加外键约束Fk_Cno,它参照了course表中的主键Cno。
针对company数据库:
1.在数据库company中创建以上五张表,并设置各表的主键。
2.*
3.在销售主表sales中添加字段“发票号码”invoice_no,char(10),NOTNULL。
4.添加外键约束:
a)在销售主表sales的业务员编号字段sale_id上添加外键约束,参照字段为员工表employee中的字段员工编号emp_no,约束名为FK_sale_id。
b)在销售主表sales的客户号字段cust_id上添加外键约束,参照字段为客户表customer中的字段客户号cust_id,约束名为FK_cust_id。
c)在销售明细表sale_item的订单编号字段order_no上添加外键约束,参照字段为销售主表sales中的字段订单编号order_no,约束名为FK_order_no。
d)在销售明细表sale_item的产品编号字段prod_id上添加外键约束,参照字段为产品名称表product中的产品编号字段prod_id,约束名为FK_prod_id。
5.添加核查约束:
a)将员工表employee中的薪水字段salary的值限定在1000至10000间,约束名为CK_salary。
b)将员工表employee中的员工编号字段emp_no设定为以“E”字母开头,后面跟5位数的编号,约束名为CK_emp_no。
c)将员工表employee中的性别字段设定这取值只能是“男”和“女”。
约束名为CK_sex。
d)/
e)将销售主表sales中的发票号码字段invoice_no设定为以“I”字母开头,后面跟9位数的编号,约束名为CK_inno。
5.为销售主表sales中的字段发票号码invoice_no设置为唯一约束,约束名为UN_inno。
实验四
实验名称:
简单的单表查询
一、实验目的
熟练掌握用SELECT语句实现简单的单表查询。
掌握SELECT子句、FROM子句、WHERE子句及ORDERBY子句的用法。
二、实验原理
用SELECT语句实现简单的单表查询。
在SELECT子句中用TOP关键字来限制返回到结果集中的记录数目,用DISTINCT关键字从结果集中去掉重复的记录。
WHERE子句中用关系比较符、[NOT]BETWEEN、[NOT]IN、LIKE、IS[NOT] NULL及逻辑运算符构成查询条件,对结果集中的记录进行筛选。
ORDERBY子句将根据查询结果集中一个或多个字段对查询结果进行排序。
(
三、实验设备
安装有SQLSERVER2000的计算机。
四、实验示例
1.查找表中所有姓刘的职工的工号,姓名,部门,薪水
selectemp_no,emp_name,dept,salary
fromemployee
whereemp_namelike'刘%'
2.查找所有定单金额高于20000的所有客户编号
selectcust_id
&
fromsales
wheretot_amt>20000
3.查找业务部或会计部的女员工的基本信息。
selectemp_no,emp_name,dept
fromemployee
wheresex='女'anddeptin('业务','会计')
4.选取编号界于‘C0001’和‘C0004’的客户编号、客户名称、客户地址。
selectcust_id,cust_name,addr
、
fromcustomer
wherecust_idbetween'C0001'AND'C0004'
5.选取销售数量最多的前5条订单订单号、数量。
selecttop5order_no,qty
fromsale_item
orderbyqtydesc
6.计算出sale_item表中每一笔销售数据的销售金额,并按照销售金额的大小排序。
selectprod_id,qty,unit_price,(qty*unit_price)tot_amt
|
fromsale_item
orderbytot_amtdesc
五、实验内容
运行查询文件,生成上机必要的数据,然后完成以下操作。
1、查找所有经理的姓名、职称、薪水。
2、在销售主表sales中查找销售金额大于等于10000元的订单。
|
3、在员工表employee中查找薪水在4000至8000元之间的员工。
select*
fromemployee
wheresalarybetween4000and8000
4、在员工表employee中查找住址为上海、北京、天津这三个城市的员工。
5、在客户表customer中查找住址不在上海、北京、天津这三个城市的客户。
》
6、在员工表employee中查找姓“王”用姓名最后一个字为“功”的员工。
7、在客户表customer中查找姓“刘”的客户名称、电话。
selectcust_name,tel_no
fromcustomer
wherecust_namelike'刘%'
8、查找出职称为“经理”或“职员”的女工的信息。
|
9、查找薪水最高的前三条员工记录。
10、查找订单金额最高的前10%的订单记录。
selecttop10percent*
fromsales
orderbytot_amtdesc
11、查找员工表中所属部门。
(去掉重复记录)
selectdistinctemp_no,emp_name,dept
fromemployee
12、查找员工表中的所有记录,并按薪水由低到高进行排序。
^
select*
fromemployee
orderbysalaryasc
实验五
实验名称:
复杂的单表查询
一、实验目的
熟练掌握SELECT查询语句中的Groupby子句、Having子句的用法,以及汇总函数的使用。
二、实验原理
在查询语句中用Groupby子句进行分组;
)
用Having子句对分组进行筛选。
使用MAX(),MIN(),COUNT(),SUM(),AVG()等函数在查询结果集中生成汇总值。
三、实验设备
安装有SQLSERVER2000的计算机。
四、实验示例
1、统计表中员工的薪水在40000-60000之间的人数
selectcount(*)as人数
fromemployee
wheresalarybetween40000and60000
%
2、计算'P0001'产品的平均销售单价
selectavg(unit_price)
fromsale_item
whereprod_id='P0001'
3、找出目前销售业绩超过40000元的业务员编号及销售业绩,并按销售业绩从大到小排序。
Selectsale_id,sum(tot_amt)
fromsales
groupbysale_id
havingsum(tot_amt)>40000
:
orderbysum(tot_amt)desc
4、查询订购了三种以上产品的订单号。
Selectorder_nofromsale_item
Groupbyorder_no
Havingcount(*)>3
五、实验内容
1、在员工表employee中统计员工人数。
selectcount(*)人数
.
fromemployee
2、统计各部门员工的员工人数及平均薪水。
selectcount(*)人数,avg(salary)平均工资
fromemployee
3、查询销售业绩超过10000元的员工编号。
selectsale_id
from(selectsale_id,sum(tot_amt)amount
fromsales
groupbysale_id)a
?
where>10000
4、计算每一产品销售数量总和与平均销售单价。
selectprod_id,sum(qty)tot_amount,sum(unit_tot)/sum(qty)average_unit_price
from(selectprod_id,qty,qty*unit_priceunit_tot
fromsale_item
)a
groupbyprod_id
5、统计各部门不同性别、或各部门、或不同性别或所有员工的平均薪水。
(在GROUPBY子句中使用CUBE关键字)
6、统计各部门不同性别、或各部门或所有员工的平均薪水。
(在GROUPBY子句中使用ROLLUP关键字)
7、计算出一共销售了几种产品。
<
selectcount(prod_id)
from(selectdistinctprod_id
fromsale_item)a
8、显示sale_item表中每种产品的订购金额总和,并且依据销售金额由大到小排列来显示出每一种产品的排行榜。
selectprod_id,sum(qty)tot_amount,sum(unit_tot)tot_amount
from(selectprod_id,qty,qty*unit_priceunit_tot
fromsale_item
)a
groupbyprod_id
orderbysum(unit_tot)desc
9、#
10、计算每一产品每月的销售金额总和,并将结果按销售(月份,产品编号)排序。
selectprod_id,month,sum(unit_amount)month_amount
from(selectprod_id,qty*unit_priceunit_amount,month(order_date)month
fromsale_item)a
groupbyprod_id,month
orderbyprod_idasc,month_amountdesc
11、查询每位业务员各个月的业绩,并按业务员编号、月份降序排序
selectsale_id,sum(tot_amt)month_amount,month(order_date)month
>
fromsales
groupbysale_id,month(order_date)
orderbysale_iddesc,monthdesc
实验六
实验名称:
连接查询
一、实验目的
掌握使用连接的方