文档库 最新最全的文档下载
当前位置:文档库 › 河南科技大学数据库实验报告

河南科技大学数据库实验报告

河南科技大学数据库实验报告
河南科技大学数据库实验报告

实验一:数据定义及更新语句练习

一实验目的:熟练掌握用SQL语句实现数据库和基本表的创建、数据的更新。

二.实验内容:

(一)用SQL语句建立如下mySPJ数据库,包括S,P,J,和SPJ四个基本表(教材第二章习题5中的四个表),要求实现关系的三类完整性。

S(SNO,SNAME,STA TUS,CITY);

P(PNO,PNAME,COLOR,WEIGHT);

J(JNO,JNAME,CITY);

SPJ(SNO,PNO,JNO,QTY)

供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。

(二)在数据库mySPJ中建立S,P,J,和SPJ四个基本表:

按照实验内容给出的基本表结构在查询分析器窗口中书写SQL语句分别建立各表,并设置主键和外键约束;

三完成情况

USE master

GO

CREATE DATABASE myspj

ON

(NAME=TEXTS_dat,

FILENAME='F:\数据库实验\myspjdat.mdf',

SIZE= 10,

MAXSIZE= 50,

FILEGROWTH= 5 )

LOG ON

(NAME='TEXTS_log',

FILENAME='F:\数据库实验\myspjlog.ldf',

SIZE= 5MB,

MAXSIZE= 25MB,

FILEGROWTH= 5MB)b

GO

create table s

(

sno char(9)primary key,

sname char(20),

statu int,

city char(20),

);

create table p

(

pno char(9)primary key,

pname char(20),

color char(20),

weigh int,

);

create table j

(

jno char(9)primary key,

jname char(20),

city char(20),

);

create table spj

(

sno char(9),

pno char(9),

jno char(9),

qty int,

primary key(sno,pno,jno),

foreign key (sno)references s(sno),

foreign key (pno)references p(pno),

foreign key (jno)references j(jno),

);

1.利用Insert 语句将习题中给出的示例记录插入各表。insert

into s

values('s1','精益','20','天津');

insert

into s

values('s2','盛锡','10','北京');

insert

into s

values('s3','东方红','30','北京'); insert

into s

values('s4','丰泰盛','20','天津'); insert

into s

values('s5','为民','30','上海'); insert

into p

values('p1','螺母','红','12'); insert

into p

values('p2','螺栓','绿','17'); insert

into p

values('p3','螺丝刀','蓝','14'); insert

into p

values('p4','螺丝刀','红','14'); insert

into p

values('p5','凸轮','蓝','40'); insert

into p

values('p6','齿轮','红','30'); insert

into j

values('j1','三建','北京');

insert

into j

values('j2','一汽','长春');

insert

into j

values('j3','弹簧厂','天津');

insert

into j

values('j4','造船厂','天津');

insert

into j

values('j5','机车厂','唐山');

insert

into j

values('j6','无线电厂','常州'); insert

values('j7','半导体厂','南京'); insert

into spj

values('s1','p1','j1','200'); insert

into spj

values('s1','p1','j3','100'); insert

into spj

values('s1','p1','j4','700'); insert

into spj

values('s1','p2','j2','100'); insert

into spj

values('s2','p31','j1','400'); insert

into spj

values('s2','p3','j2','200'); insert

into spj

values('s2','p3','j4','500'); insert

into spj

values('s2','p3','j5','400'); insert

into spj

values('s2','p5','j1','400'); insert

into spj

values('s2','p5','j2','100'); insert

into spj

values('s3','p1','j1','200'); insert

into spj

values('s3','p3','j1','200'); insert

into spj

values('s4','p5','j1','100'); insert

into spj

values('s4','p6','j3','300');

into spj

values('s4','p6','j4','200');

insert

into spj

values('s5','p2','j4','100');

insert

into spj

values('s5','p3','j1','200');

insert

into spj

values('s5','p6','j2','200');

2.利用Update更新表中的记录:

1将p表中的所有红色零件的重量增加5。

update p

set weigh=weigh+5

where color='红';

2将spj表中所有天津供应商的QTY属性值减少10。用子查询。

并记录在实验报告中。

update spj

set qty=qty-10

where sno in

(

select sno

from s

where city='天津'

);

3.利用Delete语句删除p表中的所有红色零件的记录。

delete

from p

where color='红';

思考题

(一)在为各表设定关键字时弹出的页面中有关键字和索引选项,试通过给基本表设定这两个项目并说明二者的区别。

答:关键字受主键影响,而索引不受主键影响

(二)在基本表中输入数据时,注意数据与字段的数据类型和长度以及能否为空的属性是否一致,保存时如有错误分析错误原因,及时改正并将错误报告写在实验报告中。

七实验总结:心得体会,建议等。

答:从这次实验中我明白一个道理:细节决定成败,尤其是要注意sql语言与c语言的差别。

实验二:简单查询和连接查询

一实验目的:熟练掌握用SQL语句实现的简单查询和多个数据表连接查询。

二实验内容:

(一)完成下面的简单查询:

①查询所有“天津”的供应商明细;

②查询所有“红色”的14公斤以上的零件。

③查询工程名称中含有“厂”字的工程明细。

(二)完成下面的连接查询:

①等值连接:求s表和j表的相同城市的等值连接。

②自然连接:查询所有的供应明细,要求显示供应商、零件和工程的名称,

并按照供应、工程、零件排序。

③笛卡尔积:求s和p表的笛卡尔积

④左连接:求j表和spj表的左连接。

⑤右连接:求spj表和j表的右连接。

三完成情况

(三)完成下面的简单查询:

①询所有“天津”的供应商明细;

select*

from s

where city='天津';

②查询所有“红色”的14公斤以上的零件。

select pno

from p

where color='红'and weigh>14;

③查询工程名称中含有“厂”字的工程明细。

select*

from j

where jname like'%厂';

(四)完成下面的连接查询:

①值连接:求s表和j表的相同城市的等值连接。

select s.*,j.*

from s,j

where s.city=j.city;

②自然连接:查询所有的供应明细,要求显示供应商、零件和工程的名称,

并按照供应、工程、零件排序。

select s.sname,p.pname,j.jname

from s,p,j,spj

where s.sno=spj.sno and p.pno=spj.pno and j.jno=spj.jno;

③笛卡尔积:求s和p表的笛卡尔

select*

from s,p

④左连接:求j表和spj表的左连接。

select j.*,sno,pno,qty

from j left outer join spj on (j.jno=spj.jno);

⑤右连接:求spj表和j表的右连接。

select j.*,sno,pno,qty

from spj right outer join j on (j.jno=spj.jno);

回答思考题提出的问题,

查看实验内容2中左连接和右连接的执行结果是否一致,为什么?

答:不一样,左连接是输出第一个表的全部,二右连接是输出第二个表的全部。

七实验总结:心得体会,建议等。

答:从这次实验中我明白一个道理:细节决定成败,尤其是要注意sql语言与c语言的差别。

实验三:分组查询和嵌套查询

一、实验目的:熟练掌握用SQL语句实现多个数据表的分组查询和嵌套查询。

二、实验内容:

完成下面的查询:

(一)完成下面的查询:

1、分组查询:

①求各种颜色零件的平均重量。

select color,A VG(weigh)weight

from p

group by color;

②求北京供应商和天津供应商的总个数。

select COUNT(city)个数

from s

where city='北京'or city='天津';

③求各供应商供应的零件总数。

select sno,sum(qty)数目

from spj

group by sno

order by数目asc;

④求各供应商供应给各工程的零件总数。

select sno,jno,sum(qty)数目

from spj

group by sno,jno;

⑤求使用了100个以上P1零件的工程名称。

select jname

from j

where jno in

(

select jno

from spj

where pno='p1'and qty>100

);

⑥求各工程使用的各城市供应的零件总数。

select jname

from j

where jno in

(

select jno

from spj

where pno='p1'and qty>100

);

(二)嵌套查询:

1.in连接谓词查询:

①查询没有使用天津供应商供应的红色零件的工程名称。

select jname

from j

where jno not in

(

select jno

from s,p,spj

where spj.sno=s.sno and

spj.pno=p.pno and

p.color='红'and

s.city='天津'

)

②查询供应了1000个以上零件的供应商名称。(having)

select sname

from s

where sno in

(

select sno

from spj

group by sno

having SUM(qty)>1000

)

2.比较运算符:求重量大于所有零件平均重量的零件名称。

select pname

from p

where weigh>(

select A VG(weigh)

from p

3.)Exists连接谓词:

①查询供应J1的所有的零件都是红色的供应商名称。

select sname

from s

where exists(

select*

from p,spj

where p.pno=spj.pno and

spj.sno=s.sno and

jno='j1'and

color='红');

②至少用了供应商S1所供应的全部零件的工程号JNO。

实验五:触发器和存储过程

一、实验报告要求:

(一)实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过

程的编写,并初步掌握什么情况下使用事务。

(二)实验内容:

有一个小型的图书管理数据库,包含的表为:

bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表

borrowcard(cardid,ownername);--借书证表

borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表

写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。

(三)完成情况(附上设计的SQL语句)。建立数据库:

create database bookstor

use bookstor

create table bookstore

(

bookid int,

bookname char(20),

bookauthor char(20),

purchasedate char(20),

stat char(6),

primary key(bookid),

Check(stat in('在库','不在库')),

);

create table borrowcard

(cardid int primary key,

ownername char(20),);

create table borrowlog

(cardid int,

bookid int,

borrowdate char(20),

returndate char(20),

primary key(cardid,bookid),

foreign key(cardid)references borrowcard(cardid),

foreign key(bookid)references bookstore(bookid),);

存储过程:

create procedure[dbo].[jieshu](@cardid int,@bookid int,@borrowdate char(20),@returndate char(20))

as

begin transaction

insert

into borrowlog

values(@cardid,@bookid,@borrowdate,@returndate)

if exists(select*from bookstore,borrowcard where bookid=@bookid and stat='在库'and cardid=@cardid)

begin

update bookstore

set stat='不在库'

where bookid=@bookid

commit transaction

end

else

begin

if not exists(select*from bookstore where bookid=@bookid)

print'不存在该书'

if not exists(select*from borrowcard where cardid=@cardid)

print'没有此用户'

rollback transaction

End

查询语句:exec jieshu1002062,1,'20121103','2012124'

结果:

触发器:

create trigger stor

on borrowlog

after insert

as

if(new.borrowdate>new.returndate)

print'失败,还书时间不应早于结束时间'

begin

rollback transaction

end

(四)问题及解决:首先写出执行语句不成功的时候系统报告的错误信息。然后分析错误原因,并给出解决办法。

(五)回答思考题提出的问题,

思考题:

如何通过系统的设置实现类似的功能,而不需触发器?

答:建立数据库时定义完整性约束条件。

相关文档
相关文档 最新文档