数据库课程设计.docx
《数据库课程设计.docx》由会员分享,可在线阅读,更多相关《数据库课程设计.docx(37页珍藏版)》请在冰豆网上搜索。
![数据库课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/24/d8727b36-ec54-4d3e-bf6f-df57bc3b003b/d8727b36-ec54-4d3e-bf6f-df57bc3b003b1.gif)
数据库课程设计
《数据库系统概论》
课程设计报告
一、实验目的
二、实验要求
三、实验题目
四、实验设计
五、实验小结
一、实验目的:
1.加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;
2.在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;
3.学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;
4.为毕业设计和以后工作打下必要基础。
二、实验要求
运用数据库基本理论与应用知识,在微机RDBMS(SQLServer)的环境上建立一个数据库应用系统。
要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。
1.概念设计
2.逻辑设计
订户(编号,姓名,住址);
报刊目录(代号,名称,期刊,单价);
订单(编号,代号,日期,起订期,终定期,订单量);
投递卡(编号,代号,期号,份量);
主码通过横线给出。
该关系属于第一范式
3.完整性设计
关系主码、外码约束
三、实验题目
(1)创建数据库的结构
(2)创建各基本表的结构
(3)编制输入子系统,完成数据的录入
(4)检索地址为“太平路4890号”的订户信息
(5)检索份数多于3的期号
(6)检索订阅“01-01”报刊代号的订户名、报刊名、订阅份数
(7)检索没有订阅“人民日报”的订户号
(8)检索至少订阅“人民日报”的订户名
(9)检索至少订阅了“人民日报”的所有期号的订户号
(10)检索未订阅代号为“03-01”报刊的订户名
(11)检索被多个订户订阅的报刊之代号
(12)增加一种报刊“04-01,经济信息报,周报,0.5”
(13)删去报刊代号为“01-03”的报刊
(14)把订户号“161213”改为“161225”
(15)把“090104”订户所订的“01-03”报刊的截止日期改为12
(16)检索订阅期在1到12月份的各种报刊的代号和总数
(17)检索每种报刊的订阅总数,并给出报刊代号
(18)统计各种报刊的订户数
(19)输出如下报表:
订户姓名报刊名称期号日期起订期终订期份数
(20)输出操作结果和程序清单
课程设计补充内容:
1.创建视图:
报刊订阅:
查询出用户杨春花订阅情况(字段根据自己设计选择即可)
2.授权操作:
请创建用户YANG,并授予他可以查询,修改第一题所建视图的权限。
3.触发器操作:
●删除某一个用户的记录时,利用触发器实现级联删除,即删除其他表中该用户的相应信息
●更新起订期和终定期时,若字段值小于1或者大于12,请提示“数据无效”错误
●更新用户订阅报刊份数时,请输出订阅报刊总份数大于6份的用户姓名和订阅数量
订单(ORDER)
订户号(CNO)日期(DATE)报刊代号(NMNO)起订期(START)终订期(TERM)份数
(QTY)
09010183121501-0101121
09010184012003-0104062
09010184010162-2601061
09010483120501-0101125
09010484013101-0302052
09020584071501-0309121
09020584062103-0107122
09020583120713-3001121
09020584053158-8007121
16041283122301-0101121
16041284031701-0304122
16041284062503-0107081
16121384093101-0111122
16121384031662-2604071
16748084012701-0102122
订户(CUSTOMER)
编号(CNO)姓名(NAME)住址(ADDR)
090101单明北京路10号
090104杨春花中山路4235号
090205陈卫星汉府街1234号
160412李宇光华门路784号
161213吴明镇鼓楼街2107号
167480王文武太平路4890号
报刊目录(NMTABLE)
代号(NMNO)名称(TITLE)刊期(PERIOD)单价(PRICE)
01-01人民日报日报0.067
01-03中国日报周六报0.10
03-01解放日报日报0.033
11-06物价市场半月刊0.04
13-30内蒙古科技报周报0.03
58-80新疆社会科学季刊0.60
62-20四川中医月刊0.35
投递卡(SENDING)
订户号(CNO)报刊代号(NMNO)期号(ISSUE)份数(QTY)
09010101-0124071
09010103-011342
09010162-262041
09010401-0124075
09010401-0378402
09020501-0378401
09020503-0124012
09020513-307801
09020558-802301
09020558-802311
16041201-0124071
16041201-0378402
16041201-0124081
16041201-0378412
16121301-0124072
16121362-26451
四、实验设计
1-1创建数据库的结构
1-2创建各基本表的结构
在表“订单OR1”中将“订户号CNO”和“报刊代号NMNO”设置为主键,其中“订户号CNO”为表“订户CUSTOMER”的主键,“报刊代号NMNO”为表“报刊目录NMTABLE”的主键
在表“订户CUSTOMER”中将“编号CNO”设置为主键
在表“报刊目录NMTABLE”中将“代号NMNO”设置为主键
在表“投递卡SENDING”中将“订户号CNO”和“期号ISSUE”设置为主键,其中“订户号CNO”为“订户CUSTOMER”的主键
1-3编制输入子系统,完成数据的录入
代码段:
INSERT
INTOOR1
VALUES('167480','840127','01-01',02,12,2);
结果
1-4检索地址为“太平路4890号”的订户信息
代码段
SELECT*
FROMCUSTOMER
WHEREADDR='太平路号';
结果
1-5检索份数多于3的期号
代码段
SELECTISSUE
FROMSENDING
GROUPBYISSUE
HAVINGSUM(QTY)>3;
结果
1-6检索订阅“01-01”报刊代号的订户名、报刊名、订阅份数
代码段
SELECTNAME,TITLE,QTY
FROMOR1,CUSTOMER,NMTABLE
WHEREOR1.NMNO='01-01'ANDOR1.CNO=CUSTOMER.CNOANDNMTABLE.NMNO='01-01';
结果
1-7检索没有订阅“人民日报”的订户号
代码段
SELECTDISTINCTCNO
FROMOR1
WHEREOR1.CNONOTIN
(SELECTDISTINCTCNO
FROMNMTABLE,OR1
WHERETITLE='人民日报'ANDNMTABLE.NMNO=OR1.NMNO
结果
1-8检索至少订阅“人民日报”的订户名
代码段
SELECTNAME
FROMCUSTOMER,OR1,NMTABLE
WHERENMTABLE.TITLE='人民日报'ANDOR1.NMNO=NMTABLE.NMNO
ANDCUSTOMER.CNO=OR1.CNO;
结果
1-9检索至少订阅了“人民日报”的所有期号的订户号
代码段
SELECTDISTINCTS1.CNO
FROMSENDINGS1
WHERENOTEXISTS
(SELECT*
FROMSENDINGS2,NMTABLE
WHERENMTABLE.TITLE='人民日报'ANDS2.NMNO=NMTABLE.NMNOAND
NOTEXISTS
(SELECT*
FROMSENDINGS3
WHERES1.CNO=S3.CNOANDS2.ISSUE=S3.ISSUE
)
);
结果
1-10检索未订阅代号为“03-01”报刊的订户名
代码段
SELECTDISTINCTNAME
FROMOR1,CUSTOMER
WHEREOR1.CNO=CUSTOMER.CNOANDOR1.CNONOTIN
(SELECTOR2.CNO
FROMOR1OR2
WHEREOR2.NMNO='03-01'
);
结果
1-11检索被多个订户订阅的报刊之代号
代码段
SELECTDISTINCTNMNO
FROMOR1
GROUPBYNMNO
HAVINGSUM(QTY)>3;
结果
1-12增加一种报刊“04-01,经济信息报,周报,0.5”
代码段
INSERT
INTONMTABLE
VALUES('04-01','经济信息报','周报',0.5);
结果
1-13删去报刊代号为“01-03”的报刊
代码段
DELETE
FROMNMTABLE
WHERENMTABLE.NMNO='01-03'
DELETE
FROMOR1
WHEREOR1.NMNO='01-03'
DELETE
FROMSENDING
WHERESENDING.NMNO='01-03';
结果
1-14把订户号“161213”改为“161225”
代码段
UPDATEOR1
SETOR1.CNO='161225'
WHEREOR1.CNO='161213'
UPDATECUSTOMER
SETCUSTOMER.CNO='161225'
WHERECUSTOMER.CNO='161213'
UPDATESENDING
SETSENDING.CNO='161225'
WHERESENDING.CNO='161213';
结果
1-15把“090104”订户所订的“01-03”报刊的截止日期改为12
代码段
UPDATEOR1
SETTERM=12
WHERENMNO='01-03'ANDCNO='090104';
结果
因为前面已经删除过,所以0行受影响
1-16检索订阅期在1到12月份的各种报刊的代号和总数
代码段
SELECTNMNO,SUM(QTY)
FROMOR1
WHERESTART>=1ANDTERM<=12
GROUPBYNMNO;
结果
1-17检索每种报刊的订阅总数,并给出报刊代号
代码段
SELECTNMNO,SUM(QTY)
FROMOR1
GROUPBYNMNO;
结果
1-18统计各种报刊的订户数
代码段
SELECTNMNO,count(CNO)
FROMOR1
GROUPBYNMNO;
结果
1-19输出如下报表:
订户姓名报刊名称期号日期起订期终订期份数
代码段
SELECTCUSTOMER.NAME订户姓名,NMTABLE.TITLE报刊名称,OR1.DATA日期,OR1.START起订期,OR1.TERM终订期,OR1.QTY份数
FROMOR1,CUSTOMER,NMTABLE
WHEREOR1.CNO=CUSTOMER.CNOANDOR1.NMNO=NMTABLE.NMNO;
结果
1-20创建视图:
代码段
CREATEVIEWCUS_OR1
AS
SELECTOR1.CNO,NAME,DATA,NMNO,START,TERM,QTY
FROMOR1,CUSTOMER
WHEREOR1.CNO=CUSTOMER.CNO;
结果
1-21查询出用户杨春花订阅情况
代码段
SELECT*
FROMCUS_OR1
WHERENAME='杨春花';
结果
1-22授权操作:
请创建用户YANG,并授予他可以查询,修改第一题所建视图的权限。
GRANTSELECT,UPDATE
ONCUS_OR1
TOYANG;
结果
1-23触发器操作:
先建外码
OR1的外码
代码段
ALTERTABLEOR1
ADD
CONSTRAINTPK_CNO
FOREIGNKEY(CNO)REFERENCESCUSTOMER(CNO);
结果
代码段
ALTERTABLEOR1
ADD
CONSTRAINTPK_NMNO
FOREIGNKEY(NMNO)REFERENCESNMTABLE(NMNO);
结果
SENDING的外码
代码段
ALTERTABLESENDING
ADD
CONSTRAINTPK_CNO2
FOREIGNKEY(CNO)REFERENCESCUSTOMER(CNO);
结果
代码段
ALTERTABLESENDING
ADD
CONSTRAINTPK_NMNO2
FOREIGNKEY(NMNO)REFERENCESNMTABLE(NMNO);
结果
1-24删除某一个用户的记录时,利用触发器实现级联删除,即删除其他表中该用户的相应信息
代码段CREATETRIGGERDELECTER
ONCUSTOMER
INSTEADOFDELETE
AS
BEGIN
DECLARE@CN1NCHAR(12);
SELECT@CN1=CNO
FROMDELETED;
DELETE
FROMOR1
WHERECNO=@CN1;
DELETE
FROMSENDING
WHERECNO=@CN1;
DELETE
FROMCUSTOMER
WHERECNO=@CN1;
END;
结果
代码段
DELETE
FROMCUSTOMER
WHERECNO='167480';
结果
1-25更新起订期和终定期时,若字段值小于1或者大于12,请提示“数据无效”错误
代码段
CREATETRIGGERUP1
ONOR1
AFTERUPDATE
ASBEGIN
DECLARE@SSMALLINT;
SELECT@S=START
FROMINSERTED;
DECLARE@TSMALLINT;
SELECT@T=TERM
FROMINSERTED;
IF(@S<1OR@S>12)
BEGIN
PRINT'输入错误,请重新输入';
ROLLBACK;
END;
IF(@T<1OR@T>12)
BEGIN
PRINT'输入错误,请重新输入';
ROLLBACK;
END;
END;
结果
代码段
UPDATEOR1
SETSTART=14
WHERECNO='090205'ANDNMNO='58-80';
结果
1-26更新用户订阅报刊份数时,请输出订阅报刊总份数大于6份的用户姓名和订阅数量
代码段
CREATETRIGGERUP3
ONOR1
AFTERUPDATE
ASBEGIN
IFUPDATE(QTY)
BEGIN
SELECTNAME用户姓名,SUM(QTY)订阅份数
FROMOR1,CUSTOMER
WHEREOR1.CNO=CUSTOMER.CNO
GROUPBYCUSTOMER.NAME
HAVINGSUM(QTY)>6;
END;
END;
结果
代码段
UPDATEOR1
SETQTY=7
WHERECNO='090104'ANDNMNO='01-03';
结果
五、实验小结
学了一个学期的数据库,总感觉很简单,但是真正的到自己操作的时候才发现并不简单,大错误就先不说,小错误就一个接一个,比如说错把双引号用作单引号,将表的名字取的和关键字一样,报错时却不知道错在哪儿了,在不同的数据库下新建查询,导致结果错误,中文字符与英语字符的转换,下划线“-”与连线“—”区分等等。
发现错误的过程就是一个学习的过程,虽然错的很多,但那也正是自己水平的体现,或者说那样也就减少了以后自己工作中的错误,吃一堑长一智。
虽然很短的几天,但是对SQL语句了解的更多了一些,确实像老师所讲的那样,这是目前我所学的语言中最简单的一门了,很容易上手的,即便以前学的不认真,但是只要仔细的研究一下,还是会写一些简单的语句的,但是仅仅的局限于照葫芦画瓢还是不够的,要有自己的思路,这样才能真正的掌握到SQL,也只有这样才能对以后的工作有所帮助。