数据库实验报告

 

 

 

 

 

 

 

数据库原理与技术实验报告

 

课程名称:数据库原理与技术

 

实验报告要求

1.         列出所有的SQL语句和源代码;

2.         程序要求有适当的注释;

3.         对数据完整性约束实施、实验三、实验四和实验五要求给出相应的测试用例。

4.         实验报告提交电子档。

 

实验内容

 

实验一:创建表、更新表和实施数据完整性

 

1.  运行给定的SQL Script,建立数据库GlobalToyz

2.  在企业管理器中建立所有表的关系图。

3.  利用系统定义的存储过程sp_helpdb查看数据库的相关信息,例如所有者、大小、创建日期等。

4.  列出所有表中出现的约束(包括Primary key, Foreign key, check constraint, default, uniqueexec sp_helpconstraint Category

如此类推

5. Recipient表和Country表中的cCountryId属性定义一个用户自定义数据类型,并将该属性的类型定义为这个自定义数据类型。

   exec sp_addtype hqok,'char(3)','null'

   然后在企业管理器中打开该表,并对该类型进行重定义

6.  把价格在$20以上的所有玩具的信息拷贝到称为PremiumToys的新表中。

   create table PremiumToys

(

       cToyId           char(6)  check(cToyId like('[0-9][0-9][0-9][0-9][0-9][0-9]') )

                            constraint tt_id primary key clustered,

                           

       vToyName      varchar(20) not null,

       vToyDescription     varchar(250),

       cCategoryId    char(3) references Category(cCategoryId) ,

       mToyRate       money not null,

       cBrandId char(3)references ToyBrand(cBrandId),

       imPhoto image,

       siToyQoh       smallint not null,

       siLowerAge    smallint not null,

       siUpperAge     smallint not null,

       siToyWeight    smallint,

       vToyImgPath  varchar(50) null

)

insert into PremiumToys select * from Toys where mToyRate > 20

7.  对表Toys实施下面数据完整性规则:(1)玩具的现有数量应在0200之间;(2)玩具适宜的最低年龄缺省为1

    ALTER TABLE Toys

ADD CONSTRAINT siToyQoh_size check (siToyQoh>0 and siToyQoh <200)

ALTER TABLE Toys

ADD CONSTRAINT newsiLowerAge_min check (siLowerAge>=1)

8.  不修改已创建的Toys表,利用规则实现以下数据完整性:(1)玩具的价格应大于0;(2)玩具的重量应缺省为1

    CREATE RULE mToyRate_min

AS @mToyRate > 0

sp_bindrule 'mToyRate_min','Toys.mToyRate'

CREATE RULE siToyWeight_init

AS @siToyWeight = 0

Sp_bindrule ‘siToyWeight_init’,’Toys.siToyWeight’

9.  id为‘000001’玩具的价格增加$1

   update Toys set mToyRate=1+mToyRate where cToyId='000001'

10. 列出表PickofMonth中的所有记录,并显示中文列标题。

select cToyId as '玩具 id',siMonth as '出厂月份',iYear as '出厂年份', iTotalSold as '出厂总数' from PickOfMonth

 

实验二:查询数据库

 

1.         显示属于CaliforniaIllinoi州的顾客的名、姓和emailID

select vFirstName,vLastName,vEmailId

from Shopper

where cState=' California ' or cState='Illinoi'

2.         显示定单号码、商店ID,定单的总价值,并以定单的总价值的升序排列。

select cOrderNo,cCartId,mTotalCost

from Orders order by mTotalCost

3.         显示在orderDetail表中vMessage为空值的。

    select * from OrderDetail where vMessage is null

4.         显示玩具名字中有“Racer”字样的所有玩具的材料。

select vToyDescription

from Toys

where vToyName like '%Racer%'

5.         根据2000年的玩具销售总数,显示“Pick of the Month”玩具的前五名玩具的ID

select top 5 CToyId

from PickOfMonth

where iYear=’ 2000’ order by iTotalSold

6.         根据OrderDetail表,显示玩具总价值大于¥50的定单的号码和玩具总价值。

Select cOrderNO,mToyCost

from OrderDetail

where mToyCost > 50

7.         显示一份包含所有装运信息的报表,包括:Order Number, Shipment Date, Actual Delivery Date, Days in Transit. (提示:Days in Transit = Actual Delivery Date – Shipment Date)

select OrderNO,dShipmentDate,dActualDeliveryDate,DaysinTransit=datediff(day,dShipmentDate,dActualDeliveryDate)

from Shipment

8.         显示所有玩具的名称、商标和种类(Toy Name, Brand, Category)。

select vToyName,cCategory,cBrandName

from Toys ,Category ,ToyBrand 

where Toys.cCategoryId=Category.cCategoryId and Toys.cBrandId=ToyBrand.cBrandId

9.         以下列格式显示所有购物者的名字和他们的简称:(Initials, vFirstName, vLastName,例如Angela SmithInitialsA.S

    select

vFirstName,vLastName,Substring(vFirstName,1,1)+'.'+Substring(vLastName,1,1) as Initials

from Shopper

10.     显示所有玩具的平均价格,并舍入到整数。

    select round(avg(mToyRate),0) as AvgRate from Toys

11.     显示所有购买者和收货人的名、姓、地址和所在城市,要求显示结果集中的重复记录。

Select

a.vFirstName,a.vLastName,a.vAddress,a.cCity,b.vFirstName,b.vLastName,b.vAddress,b.cCity          

from Shopper a,Recipient b,Orders c

where a.cShopperId=c.cShopperId a.and b.cOrderNO=c.cOrderNO

12.     显示没有包装的所有玩具的名称。(要求用子查询实现)

select vToyName

from Toys

where cToyId

in (select cToyId from OrderDetail

where  cWrapperId is NULL)

13.     显示已发货定单的定单号码以及下定单的时间。(要求用子查询实现)

select cOrderNo,dOrderDate

from Orders where cOrderNo

in (select cOrderNo from Shipment

where dActualDeliveryDate is NOT NULL)

14.     显示一份基于Orderdetail的报表,包括cOrderNo,cToyIdmToyCost,记录以cOrderNo升序排列,并计算每一笔定单的玩具总价值。(提示:使用运算符COMPUTE BY)。

    select cOrderNo,cToyId,mToyCost

from Orderdetail

order by cOrderNo

compute sum(mToyCost) by cOrderNo

实验三:视图与触发器

 

1.         定义一个视图,包括购买者的姓名、所在州和他们所订购玩具的名称、价格和数量。
 create view ShopperandToys (vFirstName,vLastName,cState,vToyName,mToyRate,siQty)

as select a.vFirstName,a.vLastName,a.cState,b.vToyName,b.mToyRate,c.siQty

from Shopper a,Toys b,OrderDetail c,Orders d

where  (a.cShopperId=d.cShopperId and b.cToyId=c.cToyId) and c.cOrderNo=d.cOrderNo

结果:

2.         基于(1)中定义的视图,查询显示所有California州的购买者的姓名和他们所订购玩具的名称及数量。
select vFirstName,vLastName,vToyName,siQty

from ShopperandToys

where cState=' California '

视图定义如下:
     CREATE VIEW vwOrderWrapper
     AS
     SELECT cOrderNo, cToyId, siQty, vDescription, mWrapperRate
     FROM OrderDetail JOIN Wrapper
     ON OrderDetail.cWrapperId = Wrapper.cWrapperId
以下更新命令,在更新siQtymWrapperRate属性使用了以下更新命令时出现错误:
     UPDATE vwOrderWrapper
     SET siQty = 2, mWrapperRate = mWrapperRate + 1
     FROM vwOrderWrapper
     WHERE cOrderNo = ‘000001’
修改更新命令,以更新基表中的值。

    UPDATE OrderDetail

     SET siQty = 2

     WHERE cOrderNo = '000001'

UPDATE Wrapper

     SET mWrapperRate = mWrapperRate + 1

     FROM OrderDetail a,Wrapper b

     WHERE a.cOrderNo='000001' and a.cWrapperId=b.cWrapperId

3.         OrderDetail上定义一个触发器,如果购物者改变了定单的数量,玩具的成本也自动地改变。(提示:Toy cost = Quantity * Toy Rate

    create trigger CheckToyCost

on OrderDetail

for update

as

if update(siQty)

     begin

      update OrderDetail

      set mToyCost=siQty*mToyRate

      f rom OrderDetail,Toys

     end

go

测试用例:

对定单的数量修改前的OrderDetail

对定单的数量进行修改:

修改后为:

4.         在(2)中定义的视图vwOrderWrapper上创建一个INSTEAD OF UPDATE触发器,以解决(2)中对视图进行更新时出现的问题。

实验四:存储过程

 

1.         编写一段程序,将每种玩具的价格提高¥0.5,直到玩具的平均价格接近$24.5为止。此外,任何玩具的最大价格不应超过$53

程序为:

use GlobalToyz

go

while (select avg(mToyRate) from Toys)<24.5

begin

  if (select max(mToyRate) from Toys)>53

    begin

      break

    end

  update Toys

  set mToyRate=mToyRate+0.5

end

程序执行前:

程序执行后:

2.         创建一个称为prcCharges的存储过程,它返回某个定单号的装运费用和包装费用。

创建存储过程的语句为:

create proc prcCharges @OrderNo char(6) output

as

select cOrderNo,mShippingCharges,mGiftWrapCharges

from Orders

where cOrderNo=@OrderNo

go

 

测试:

打开所创建的存储过程,输入想要查找的订单号

执行后的结果为:

使用另外一种测试方法:

 

 

3.         创建一个称为prcHandlingCharges的过程,它接收定单号并显示经营费用。PrchandlingCharges过程应使用prcCharges过程来得到装运费和礼品包装费。
提示:经营费用=装运费+礼品包装费

 

创建存储过程的语句为:

create proc prcHandingCharges @OrderNo char(6)

as

create table #temp1( OrderNo char(6), mSCharges money, mGCharges money)

insert into #temp1 exec prcCharges @OrderNo

select OrderNo,mSCharges+mGCharges as HandingCharges from #temp1

go

测试用列:

实验五:事务与游标

1.         名为prcGenOrder的存储过程产生存在于数据库中的定单号:
   CREATE  PROCEDURE  prcGenOrder
   @OrderNo char(6) OUTPUT
   as
   SELECT @OrderNo=Max(cOrderNo)  FROM Orders
   SELECT @OrderNo=
   CASE
      WHEN @OrderNo>=0 and @OrderNo<9 Then
              ‘00000’+Convert(char,@OrderNo+1)
      WHEN @OrderNo>=9 and @OrderNo<99 Then
              ‘0000’+Convert(char,@OrderNo+1)
      WHEN @OrderNo>=99 and @OrderNo<999 Then
              ‘000’+Convert(char,@OrderNo+1)
      WHEN @OrderNo>=999 and @OrderNo<9999 Then
              ‘00’+Convert(char,@OrderNo+1)
      WHEN @OrderNo>=9999 and @OrderNo<99999 Then
              ‘0’+Convert(char,@OrderNo+1)
      WHEN @OrderNo>=99999 Then Convert(char,@OrderNo+1)
   END
   RETURN
当购物者确认定单时,应该出现下面的步骤:
1)用上面的过程产生定单号。
2)定单号,当前日期,购物车ID,和购物者ID应该加到Orders表中。
3)定单号,玩具ID,和数量应加到OrderDetail表中。
4)在OrderDetail表中更新玩具成本。(提示:Toy cost = Quantity * Toy Rate.
将上述步骤定义为一个事务。编写一个过程以购物车ID和购物者ID为参数,实现这个事务。

该过程编写如下:

  create proc prcOrder @CartID char(6),@ShopperID char(6)

  as

  declare @OrderNo char(6),@OrderNo1 char (6),@ToyID char (6),@Qty char (6)

  exec prcGenOrder @OrderNo output

  SELECT @OrderNo1=isnull( CONVERT(nvarchar, @OrderNo), '<NULL>' )

  create table #temp1

(OrderNo char (6),CartId char (6),ShopperId char (6),OrderDate datetime)

  insert into #temp1 (OrderNo,CartId,ShopperId,OrderDate)

values(@OrderNo1,@CartID,@ShopperID,getdate())

 insert into Orders (cOrderNo,cCartId,cShopperId,dOrderDate)

          select * from #temp1      

  select @ToyID=cToyId,@Qty=siQty from ShoppingCart

                 where cCartId=@CartID         

  insert into OrderDetail (cOrderNo,cToyId,siQty)

          values(@OrderNo1,@ToyID,@Qty)

  update OrderDetail

      set mToyCost=siQty*mToyRate

       from OrderDetail,Toys

  go

测试前的Orders

注意:订单号只是到000010

测试前的OrderDetail

对该过程进行测试:

注意:输入ToyIdShopperId都为:000001

执行后的结果为:

Orders表:

注意:订单号自动生成,为000011

OrderDetail表:

 

2.         编写一个程序显示每天的定单状态。如果当天的定单值总合大于170,则显示“High sales”,否则显示”Low sales”.报告中要求列出日期、定单状态和定单总价值。

程序为:

    declare @TotalCost money

select Orders.dOrderDate,Orders.cOrderProcessed,sum(mToyCost) as TotalCost

from Orders,OrderDetail

where Orders.cOrderNo=OrderDetail.cOrderNo and Orders.dOrderDate=getdate()

group by Orders.dOrderDate,Orders.cOrderProcessed

 

select @TotalCost=sum(mTotalCost)

from Orders,OrderDetail

where Orders.cOrderNo=OrderDetail.cOrderNo and Orders.dOrderDate=getdate()

if @TotalCost > 170

     print 'High Sales'

else

     print 'Low Sales'

 

实验一:创建、更新和实施数据完整性 1. 运行给定的SQL Script,建立数据库GlobalToyz。 2. 创建所有的关系图。 3. 列出所有中出现的约束(包括Primary key, Foreign key, check constraint, default, unique) 4. 对Recipient和Country中的cCountryId属性定义一个用户自定义数据类型,并将该属性的类型定义为这个自定义数据类型。 5. 把价格在$20以上的所有玩具的材料拷贝到称为PremiumToys的新中。 6. 对Toys实施下面数据完整性规则:(1)玩具的现有数量应在0到200之间;(2)玩具适宜的最低年龄缺省为1。 7. 不修改已创建Toys,利用规则实现以下数据完整性:(1)玩具的价格应大于0;(2)玩具的重量应缺省为1。 8. 给id为‘000001’玩具的价格增加$1。 实验二:查询数据库 1. 显示属于California和Illinoi州的顾客的名、姓和emailID。 2. 显示定单号码、商店ID,定单的总价值,并以定单的总价值的升序排列。 3. 显示在orderDetail中vMessage为空值的行。 4. 显示玩具名字中有“Racer”字样的所有玩具的材料。 5. 根据2000年的玩具销售总数,显示“Pick of the Month”玩具的前五名玩具的ID。 6. 根据OrderDetail,显示玩具总价值大于¥50的定单的号码和玩具总价值。 7. 显示一份包含所有装运信息的报,包括:Order Number, Shipment Date, Actual Delivery Date, Days in Transit. (提示:Days in Transit = Actual Delivery Date – Shipment Date) 8. 显示所有玩具的名称、商标和种类(Toy Name, Brand, Category)。 9. 显示玩具的名称和所有玩具的购物车ID。如果玩具不在购物车中,则显示NULL值。 10. 以下列格式显示所有购物者的名字和他们的简称:(Initials, vFirstName, vLastName),例如Angela Smith的Initials为A.S。 11. 显示所有玩具的平均价格,并舍入到整数。 12. 显示所有购买者和收货人的名、姓、地址和所在城市。 13. 显示没有包装的所有玩具的名称。(要求用子查询实现) 14. 显示已发货定单的定单号码以及下定单的时间。(要求用子查询实现) 实验三:视图与触发器 1. 定义一个视图,包括购买者的姓名、所在州和他们所订购玩具的名称、价格和数量。 2. 基于(1)中定义的视图,查询显示所有California州的购买者的姓名和他们所订购玩具的名称及数量。 3. 视图定义如下: CREATE VIEW vwOrderWrapper AS SELECT cOrderNo, cToyId, siQty, vDescription, mWrapperRate FROM OrderDetail JOIN Wrapper ON OrderDetail.cWrapperId = Wrapper.cWrapperId 以下更新命令,在更新siQty和mWrapperRate属性使用了以下更新命令时出现错误: UPDATE vwOrderWrapper SET siQty = 2, mWrapperRate = mWrapperRate + 1 FROM vwOrderWrapper WHERE cOrderNo = ‘000001’ 修改更新命令,以更新基中的值。 4. 在OrderDetail上定义一个触发器,如果购物者改变了定单的数量,玩具的成本也自动地改变。(提示:Toy cost = Quantity * Toy Rate) 实验四:存储过程 1. 编写一段程序,将每种玩具的价格提高¥0.5,直到玩具的平均价格接近$24.5为止。此外,任何玩具的最大价格不应超过$53。 2. 创建一个称为prcCharges的存储过程,它返回某个定单号的装运费用和包装费用。 3. 创建一个称为prcHandlingCharges的过程,它接收定单号并显示经营费用。PrchandlingCharges过程应使用prcCharges过程来得到装运费和礼品包装费。 提示:经营费用=装运费+礼品包装费 实验五:事务与游标 1. 名为prcGenOrder的存储过程产生存在于数据库中的定单号: CREATE PROCEDURE prcGenOrder @OrderNo char(6) OUTPUT as SELECT @OrderNo=Max(cOrderNo) FROM Orders SELECT @OrderNo= CASE WHEN @OrderNo>=0 and @OrderNo=9 and @OrderNo=99 and @OrderNo=999 and @OrderNo=9999 and @OrderNo=99999 Then Convert(char,@OrderNo+1) END RETURN 当购物者确认定单时,应该出现下面的步骤: (1)用上面的过程产生定单号。 (2)定单号,当前日期,购物车ID,和购物者ID应该加到Orders中。 (3)定单号,玩具ID,和数量应加到OrderDetail中。 (4)在OrderDetail中更新玩具成本。(提示:Toy cost = Quantity * Toy Rate). 将上述步骤定义为一个事务。编写一个过程以购物车ID和购物者ID为参数,实现这个事务。 2. 编写一个程序显示每天的定单状态。如果当天的定单值总合大于170,则显示“High sales”,否则显示”Low sales”.报告中要求列出日期、定单状态和定单总价值。
2008数据库实验 1.SQL SEVER 2000的系统工具、使用交互方式建库、建 2.T—SQL的简单查询、连接查询 3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理器和查询分析器创建数据库、索引和修改结构及向数据库输入数据、修改数据和删除数据的操作方法和步骤,掌握定义数据约束条件的操作。 实验内容和步骤: (1)熟悉SQL SEVER 2000的界面和操作。 (3)熟悉企业管理器和查询分析器的界面和操作。 (3)创建数据库和查看数据库属性。 (4)创建、确定的主码和约束条件。 (5)查看和修改的结构。 (6)向数据库输入数据,观察违反列级约束时出现的情况。 (7)修改数据。 (8)删除数据,观察违反级约束时出现的情况。 实验2 T—SQL的简单查询、连接查询 实验目的和要求:,了解SQL语句的数据定义与数据更新功能,了解SQL语句的查询功能,掌握SQL中的数据定义语句的用法,熟练掌握SQL中的插入、修改和删除语句的操作,熟练掌握使用SQL语句进行数据库的简单查询、连接查询。 实验内容和步骤: (1)在SQL SEVER 2000的查询分析器里,用SQL语句建库、建并插入记录。 (2)修改结构,包括修改属性列的数据类型,增加新的属性列,删除已有的属性列。 (3)使用单个元组和多元组插入。 (4)简单查询操作,包括投影、选择、数据排序、模糊匹配查询等。如果结果不正确,要进行修改,直至正确为止。 (5)连接查询操作,包括等值连接、自然连接、一般连接、自身连接、外连接。 实验3 子查询及组合 实验目的和要求:了解SQL语句的查询功能,理解视图的概念。熟练掌握使用SQL语句进行数据库的嵌套查询及组合查询的操作;掌握视图创建语句和视图的使用方法,加深对视图作用的理解。 实验内容和步骤: (1)在DBMS的交互式环境里,用SQL语句建库、建并插入记录。 (2)使用In、比较符和Exists操作符进行嵌套查询操作。 (3)分组查询,包括分组条件达、选择组条件达的方法。 (4)集合查询。 (5)使用视图创建语句建视图,通过视图查询数据 (6)带子查询的修改和删除 (7)通过视图修改和删除数据 实验4 数据控制、数据的导入/导出、数据库备份和恢复 实验目的和要求:掌握数据控制(安全性)的方法,了解SQL SEVER 2000的数据备份和恢复机制,掌握SQL SEVER 2000中数据库备份和恢复的方法。 实验内容和步骤: (1)使用SQL对数据进行安全性控制,包括授权和权利收回。 (2)查看授权和权利收回后的结果 (3)SQL SEVER 2000工具对中的数据导出到其它格式的文件。 (4)将其它格式的文件数据导入到数据库中。 (5)使用SQL SEVER 2000工具创建一个数据库的备份(海量备份、增量备份)。 (6)使用SQL SEVER 2000工具及所创建数据库备份恢复这个数据库
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值