2023年6月21日发(作者:)

西 安 邮 电 大 学

学院名称学生姓名专业名称班 级学号时间数据库课内实验

报 告 书

计算机学院

高 丹

计算机科学与技术

1106班

04111196(22)

2013.4—2013.5

: : : :

: :实验2 定义表和数据库完整性

一、实验目的

1.了解SQL Server 2000的基本数据类型、空值的概念,以及表的结构特点。

2. 学会使用T_SQL语句和企业管理器创建表结构和修改表结构。

3. 学会使用SQL Server 2000提供的数据完整性功能,并在创建表时定义表的数据完整性。通过实验进一步理解数据完整性的概念及分类。

二、实验内容

用T_SQL语句在Market数据库中创建客户基本信息表Cuetomers、货品信息表Goods、订单信息表Orders,它们的定义如下

/*基本表的定义与创建*/

CREATE TABLE Customers

(

CustomerID int IDENTITY(1,1) PRIMARY KEY,

CName varchar(8) NOT NULL,

Address varchar(50),

City varchar(10),

Tel varchar(20) UNIQUE,

Company varchar(50),

Birthday datetime,

Type tinyint DEFAULT 1

);

CREATE TABLE Goods

(

GoodsID int CONSTRAINT C1 PRIMARY KEY,

GoodsName varchar(20) NOT NULL,

Price money,

Decription varchar(200),

Storage int,

Provider varchar(50),

Status tinyint DEFAULT(0)

);

CREATE TABLE Orders

(

OrderID int IDENTITY(1,1) CONSTRAINT C2 PRIMARY KEY,

GoodsID int NOT NULL REFERENCES Goods(GoodsID) ON DELETE CASCADE,

/*表级完整性约束条件,参照约束为Goods(GoodID),删除时进行级联删除*/

CustomerID int NOT NULL FOREIGN KEY(CustomerID)

REFERENCES Customers(CustomerID) ON DELETE NO ACTION,

/*表级完整性约束条件,参照约束为Customers(CustomerID),删除时不删除参照表中的被引用行*/

Quantity int NOT NULL CONSTRAINT C3 CHECK(Quantity > 0), Ordersum money NOT NULL,

OrderData datetime DEFAULT(getdate())

);

实验3 表数据的插入、修改和删除

一、实验目的

掌握使用T_SQL语句和企业管理器对数据进行插入、修改和删除数据的操作,并体会数据完整性约束的作用,加深对数据完整性及其约束的理解。

通过本实验,要熟练掌握INSERT、UPDATE、DELETE语句的语法和使用方法。

二、实验内容

(1)向数据库Market的各张表中输入一些记录。

(2)使用T_SQL语句进行插入、修改和删除记录的操作。

/*在Customers表中已有数据的基础上向各个表中插入数据*/

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王伟','长安区','西安','029005','邮电大学','1995-02-13')

/*向Goods表中插入数据*/

INSERT INTO

Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

/*向Goods表中插入数据*/

INSERT INTO

Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

/*修改表中的数据*/ UPDATE Goods /*将Goods表中的所有价钱都增加*/

SET Price=Price+10;

UPDATE Orders

SET Quantity=5

WHERE CustomerID=2;/*将Orders表中CustomerID为的客户订单数量修改为*/

UPDATE Customers

SET Tel=0911536 , Address='长安区'

WHERE CustomerID=3;

修改后的表:

/*删除表中的一些数据*/

DELETE FROM Orders

WHERE CustomerID=2;/*删除了CustomerID为的订单记录*/

删除记录之后的表:

实验4 数据的简单查询和连接查询

一、实验目的

数据查询时数据库中最基本的操作,也是使用最频繁的操作,因此必须掌握SQL的查询语句(SELECT语句)的使用方法。本实验要求掌握简单表的数据查询、数据排序和多表操作时数据连接查询的操作方法。 二、实验内容

(1)简单查询操作。该实验包括投影、选择条件表达、数据排序等。

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(1)-(4)的查询。

(2)连接查询操作。该实验包括等值连接、自然连接、一般连接(内连接) 、外连接、左外连接、右外连接和自然连接等。

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(5)的查询。

(一)简单查询操作

1,查找所有西安客户的信息/*查询*/

SELECT *

FROM Customers

WHERE City='西安'; /*查找所有西安客户的信息*/

2.查找所有商品的名称,库存,价格以及表示打折价,按升序排列

SELECT GoodsName,Storage,Price,0.25*Price Discount

From Goods

ORDER BY Price ASC; /*查找所有商品的名称,库存,价格以及表示打折价,按升序排列*/

3.查找商品名中包含“衣”的商品编号,名称及价格

SELECT GoodsID,GoodsName,Price

From Goods

WHERE GoodsName LIKE '%衣%'; /*查找商品名中包含“衣”的商品编号,名称及价格*/

4.查询库存量大于小于的商品名称,库存和单价

SELECT GoodsName,Storage,Price

From Goods

WHERE Storage>100 AND Storage<500; /*查询库存量大于小于的商品名称,库存和单价*/ (二)连接查询操作

查找2011年1月1日至2012年1月1日期间,订货金额大于2的所有订单的客户姓名,商品名称,单价,订货数量和订货金额

/*连接查询*/

SELECT Goodsname,Cname,Price,Quantity,Ordersum

FROM Customers,Goods,Orders

WHERE erID=erID and

D=D and

Orderdata between '2011-01-1 'and '2012-1-1' and Quantity>2

实验5 数据库的复杂查询

一、实验目的

进一步掌握SELECT语句的使用方法,通过实验能够熟练地使用SELECT语句。本实验要求掌握嵌套查询和统计查询的操作方法。

二、实验内容

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(6)-(9)的查询。

三、运行结果

(1)查找订单编号,商品编号,客户编号,按日期对订单分组,显示订货数量不超的订单信息

SELECT OrderID,GoodsID,CustomerID

FROM Orders

WHERE Quantity<=30

(SELECT Orderdata

FROM Orders

group by Orderdata);

(7)查找所有西安客户的订单信息,要求用不相关子查询完成

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID FROM Customers

WHERE City='西安');

(8)查找不是上海客户的订单信息

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City<>'上海');

(9)查找所有西安客户的相关信息以及他们的订单情况

SELECT *

FROM Customers,Orders

WHERE erID=erID and City='西安';

实验6 索引和视图

一、实验目的

(1)理解索引和视图的概念。

(2)掌握索引的使用方法。

(3)掌握视图的定义和使用方法。

二、实验内容

在Market数据库中,完成第3章习题11中(1)的建立视图的操作,然后在该视图上完成第3章习题11中(2)的查询操作。

三、运行结果

CREATE VIEW XIAN_ORDER(OrderID,GoodsName,Quantity,CustomerID,Cname)

AS

SELECT OrderID,GoodsName,Quantity,erID,Cname

FROM Orders,Goods,Customers

WHERE erID=erID AND

D=D AND City='西安' /*创建西安客户订单的视图*/

SELECT *

FROM XIAN_ORDER /*查找西安客户的订单信息*/ 实验7 存储过程

一、实验目的

理解存储过程的概念,掌握存储过程的使用方法。

二、实验内容

(一)在Market数据库中,完成第4章习题5中(1)-(4)创建存储过程的操作,并使用EXCEL语句调用这些存储过程执行,观察他们的执行过程。

(二)在Market数据库中,进一步完成以下操作。

1.创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)。

2.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单,则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能。

3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)。

三、运行结果

(一)(1) 第4章习题5中(1)-(4)创建存储过程的操作结果如下

/*为上海客户建立存储过程*/

CREATE procedure sp_shanghai

AS

SELECT *

FROM customers

WHERE city='上海';

CREATE procedure sp_Goods

@GoodsID char(20)

AS SELECT D,GoodsName,Price,Provider,Storage,Status

FROM Goods

/*创建存储过程sp_Goods,查看制定商品信息,商品编号作为输入参数*/

/*以客户编号作为输入参数,订单总金额作为输出函数,建立存储过程*/

CREATE procedure sp_goodsum @Cnumber char(10),

@Osum int output

AS

SELECT @osum=Ordersum

FROM Orders

WHERE CustomerID=@cnumber

*编写存储过程sp_insertGoods,向Goods中插入一条记录*/

CREATE procedure sp_insertGoods

@GoodsID int,@GoodsName varchar(20),@Price money,@Decription

VARCHAR(200),@Storage int,@Provider VARCHAR(50), @Status TINYINT

AS

insert into Goods

values

(@GoodsID,@GoodsName,@Price,@Decription,@Storage,@Provider,@Status);/

创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)*/

CREATE procedure Goods_Orders1

@GoodsID int,

@OrderID int output,@CName varchar(20) output,@Quantity int

output,@OrderSum money output,@Orderdata datetime output

AS

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers WHERE erID=erID and GoodsID=@GoodsID;/*1.

.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单,

则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能

CREATE procedure Goods_Orders2

@GoodsID int=NULL

AS

IF @GoodsID is NULL

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID

END

ELSE

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and

GoodsID=@GoodsID

END

/*3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)*/

CREATE procedure Goods_OrderSum

@GoodsName varchar(20),

@OrderSum money output

AS SELECT OrderSum

FROM Orders,Goods

WHERE D=D and GoodsName=@GoodsName;

实验8 触发器

一、实验目的

学习触发器的使用,体会触发器执行的时机,加深对触发器功能和作用的理解。

二、实验内容

(1)在Market数据库中,完成第4章习题5中(5)-(9)创建触发器的操作,然后在相关的表上执行INSERT、UPDATE或DALETE语句,观察他们的执行结果。

三、运行结果

五.

代码设计技巧及体会

首先,我觉得自己使用SQL就比较生疏,刚开始不是很了解,可是通过几次上机试验后对于程序运行环境有了进一步的了解,为写代码和使用SQL打下了基础,第一次写了这么多的语句,遇到了很多困难,有些在书上找不到,需要自己认真思考,根据书上的例子进行变通,不会的时候就请教了老师或者同学,解决了一大部分的问题,自己对于SQL语句也有更进一步的了解,到后来能够自己去写代码而不用参考教材,这其中真的学到了不少东西,不足的地方还是有的,有一小部分的问题还等待在日后的学习中去解决。

源代码:

/*基本表的定义与创建*/

CREATE TABLE Customers

(

CustomerID int IDENTITY(1,1) PRIMARY KEY,

CName varchar(8) NOT NULL,

Address varchar(50),

City varchar(10),

Tel varchar(20) UNIQUE,

Company varchar(50),

Birthday datetime,

Type tinyint DEFAULT 1

);

CREATE TABLE Goods

(

GoodsID int CONSTRAINT C1 PRIMARY KEY,

GoodsName varchar(20) NOT NULL,

Price money,

Decription varchar(200),

Storage int, Provider varchar(50),

Status tinyint DEFAULT(0)

);

CREATE TABLE Orders

(

OrderID int IDENTITY(1,1) CONSTRAINT C2 PRIMARY KEY,

GoodsID int NOT NULL REFERENCES Goods(GoodsID) ON DELETE CASCADE,

/*表级完整性约束条件,参照约束为Goods(GoodID),删除时进行级联删除*/

CustomerID int NOT NULL FOREIGN KEY(CustomerID)

REFERENCES Customers(CustomerID) ON DELETE NO ACTION,

/*表级完整性约束条件,参照约束为Customers(CustomerID),删除时不删除参照表中的被引用行*/

Quantity int NOT NULL CONSTRAINT C3 CHECK(Quantity > 0),

Ordersum money NOT NULL,

OrderData datetime DEFAULT(getdate())

);

/*在Customers表中已有数据的基础上向各个表中插入数据*/

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王伟','长安区','西安','029005','邮电大学','1995-02-13')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('惠敏','海淀区','北京','010001','中国农业大学','1992-06-23')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王二小','浦东新区','上海','021001','上海商学院','1991-05-07')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('周颖','临潼区','西安','029006','西安科技大学','1991-02-02')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('吴起','槐荫区','山东','058436','山东师范','1990-10-09')

/*向Goods表中插入数据*/

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0002','水杯',32.00,'塑料','322','特百惠','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0003','上衣',100.22,'长款','18','春季适用','1') INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0004','风衣',128.22,'长款','28','秋季适用','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0005','短裤',56.88,'超短','50','夏季适用','1')

/*向Orders表中插入数据,其中有错误数据的测试*/

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0003','1','4',100.22,'2011-05-07')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0001','2','3',45.00,'2011-12-21')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0002','5','10',32.00,'2012-03-02')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0004','3','2',128.22,'2013-04-18')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)/*该语句错误,应为赋给OrderID的值没有参照表Orders*/

VALUES('0006','3','1',32.00,'2013-05-07')

/*修改表中的数据*/

UPDATE Goods /*将Goods表中的所有价钱都增加10*/

SET Price=Price+10;

UPDATE Orders

SET Quantity=5

WHERE CustomerID=2;/*将Orders表中CustomerID为2的客户订单数量修改为5*/

UPDATE Customers

SET Tel=0911536 , Address='长安区'

WHERE CustomerID=3;

UPDATE Orders

SET CustomerID=10

WHERE GoodsID=0001; /*该语句错误,没有参考完整性*/

/*删除表中的一些数据*/

DELETE FROM Orders

WHERE CustomerID=2;/*删除了CustomerID为2的订单记录*/ /*查询*/

SELECT *

FROM Customers

WHERE City='西安'; /*查找所有西安客户的信息*/

SELECT GoodsName,Storage,Price,0.25*Price Discount

From Goods

ORDER BY Price ASC; /*查找所有商品的名称,库存,价格以及表示打折价,按升序排列*/

SELECT GoodsID,GoodsName,Price

From Goods

WHERE GoodsName LIKE '%衣%'; /*查找商品名中包含“衣”的商品编号,名称及价格*/

SELECT GoodsName,Storage,Price

From Goods

WHERE Storage>100 AND Storage<500; /*查询库存量大于100小于500的商品名称,库存和单价*/

/*连接查询*/

SELECT Goodsname,Cname,Price,Quantity,Ordersum

FROM Customers,Goods,Orders

WHERE erID=erID and

D=D and

Orderdata between '2011-01-1 'and '2012-1-1' and Quantity>2

/*复杂查询*/

/*查找订单编号,商品编号,客户编号,按日期对订单分组,显示订货数量不超30的订单信息*/

SELECT OrderID,GoodsID,CustomerID

FROM Orders

WHERE Quantity<=30

(SELECT Orderdata

FROM Orders

group by Orderdata);

/*查找北京客户的订单信息*/

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City='西安'); /*查找不是上海客户的订单信息*/

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City<>'上海');

/*北京客户的相关信息及订单情况*/

SELECT *

FROM Customers,Orders

WHERE erID=erID and City='西安';

CREATE VIEW XIAN_ORDER(OrderID,GoodsName,Quantity,CustomerID,Cname)

AS

SELECT OrderID,GoodsName,Quantity,erID,Cname

FROM Orders,Goods,Customers

WHERE erID=erID AND D=D AND

City='西安' /*创建西安客户订单的视图*/

SELECT *

FROM XIAN_ORDER /*查找西安客户的订单信息*/

/*存储过程*/

/*为上海客户建立存储过程*/

CREATE procedure sp_shanghai

AS

SELECT *

FROM customers

WHERE city='上海';

CREATE procedure sp_Goods

@GoodsID char(20)

AS SELECT D,GoodsName,Price,Provider,Storage,Status

FROM Goods /*创建存储过程sp_Goods,查看制定商品信息,商品编号作为输入参数*/

EXECUTE sp_Goods @GoodsID=0001;

/*以客户编号作为输入参数,订单总金额作为输出函数,建立存储过程*/

CREATE procedure sp_goodsum

@Cnumber char(10),

@Osum int output

AS

SELECT @osum=Ordersum FROM Orders

WHERE CustomerID=@cnumber

CREATE procedure sp_insertGoods

@GoodsID int,@GoodsName varchar(20),@Price money,@Decription

VARCHAR(200),@Storage int,@Provider VARCHAR(50), @Status TINYINT

AS

insert into Goods

values (@GoodsID,@GoodsName,@Price,@Decription,@Storage,@Provider,@Status);/*编写存储过程sp_insertGoods,向Goods中插入一条记录*/

DROP procedure sp_insertGoods

/*调用存储过程*/

EXECUTE procedure sp_insertGoods

0006,'帽子',18.00,'沙滩帽',100,'上海',1

CREATE procedure Goods_Orders1

@GoodsID int,

@OrderID int output,@CName varchar(20) output,@Quantity int output,@OrderSum money

output,@Orderdata datetime output

AS

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and GoodsID=@GoodsID;/*1.创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)*/

CREATE procedure Goods_Orders2

@GoodsID int=NULL

AS

IF @GoodsID is NULL

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID

END

ELSE

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and GoodsID=@GoodsID

END /*2.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单, 则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能*/

/*3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)*/

CREATE procedure Goods_OrderSum

@GoodsName varchar(20),

@OrderSum money output

AS

SELECT OrderSum

FROM Orders,Goods

WHERE D=D and GoodsName=@GoodsName;

/*触发器*/

/*在Customers表上建立删除触发器,实现Customers表和Orders表的级联删除*/

CREATE trigger CustomersDelete on Customers

AFTER delete

as

delete from Orders

where CustomerID in

(select erID from deleted);

/*在Orders表上建立插入触发器,当向表中添加一条订货记录时,若订单中的商品状态为整理(Status=1),则不能插入该条记录*/

CREATE trigger Orders_insert on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

WHERE Status=0)=0

BEGIN

print'商品状态为整理(Status=1) 不能插入该条记录'

rollback transaction

END;

/*在Orders表上建立插入触发器,当添加订单时,减少Goods表中相应商品的库存量*/

CREATE trigger Orders_insert2 on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

)=1

BEGIN

update Goods

set Storage=ty

rollback transaction END;

/*在Orders表上建立触发器,不允许对订单日期进行修改*/

CREATE trigger Orders_update on Orders

AFTER update

AS

IF update(Orderdata)

BEGIN

print'不允许对订单日期进行修改'

rollback transaction

END;

/*建立触发器,实现参照完整性约束,即若在Orders表中添加一条订单记录时,则该订单中的商品必须在Goods表中存在,

否则不允许添加该记录*/

CREATE trigger Orders_insert3 on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

WHERE D=D)=0

BEGIN

print'不允许添加该记录'

rollback transaction

END;

2023年6月21日发(作者:)

西 安 邮 电 大 学

学院名称学生姓名专业名称班 级学号时间数据库课内实验

报 告 书

计算机学院

高 丹

计算机科学与技术

1106班

04111196(22)

2013.4—2013.5

: : : :

: :实验2 定义表和数据库完整性

一、实验目的

1.了解SQL Server 2000的基本数据类型、空值的概念,以及表的结构特点。

2. 学会使用T_SQL语句和企业管理器创建表结构和修改表结构。

3. 学会使用SQL Server 2000提供的数据完整性功能,并在创建表时定义表的数据完整性。通过实验进一步理解数据完整性的概念及分类。

二、实验内容

用T_SQL语句在Market数据库中创建客户基本信息表Cuetomers、货品信息表Goods、订单信息表Orders,它们的定义如下

/*基本表的定义与创建*/

CREATE TABLE Customers

(

CustomerID int IDENTITY(1,1) PRIMARY KEY,

CName varchar(8) NOT NULL,

Address varchar(50),

City varchar(10),

Tel varchar(20) UNIQUE,

Company varchar(50),

Birthday datetime,

Type tinyint DEFAULT 1

);

CREATE TABLE Goods

(

GoodsID int CONSTRAINT C1 PRIMARY KEY,

GoodsName varchar(20) NOT NULL,

Price money,

Decription varchar(200),

Storage int,

Provider varchar(50),

Status tinyint DEFAULT(0)

);

CREATE TABLE Orders

(

OrderID int IDENTITY(1,1) CONSTRAINT C2 PRIMARY KEY,

GoodsID int NOT NULL REFERENCES Goods(GoodsID) ON DELETE CASCADE,

/*表级完整性约束条件,参照约束为Goods(GoodID),删除时进行级联删除*/

CustomerID int NOT NULL FOREIGN KEY(CustomerID)

REFERENCES Customers(CustomerID) ON DELETE NO ACTION,

/*表级完整性约束条件,参照约束为Customers(CustomerID),删除时不删除参照表中的被引用行*/

Quantity int NOT NULL CONSTRAINT C3 CHECK(Quantity > 0), Ordersum money NOT NULL,

OrderData datetime DEFAULT(getdate())

);

实验3 表数据的插入、修改和删除

一、实验目的

掌握使用T_SQL语句和企业管理器对数据进行插入、修改和删除数据的操作,并体会数据完整性约束的作用,加深对数据完整性及其约束的理解。

通过本实验,要熟练掌握INSERT、UPDATE、DELETE语句的语法和使用方法。

二、实验内容

(1)向数据库Market的各张表中输入一些记录。

(2)使用T_SQL语句进行插入、修改和删除记录的操作。

/*在Customers表中已有数据的基础上向各个表中插入数据*/

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王伟','长安区','西安','029005','邮电大学','1995-02-13')

/*向Goods表中插入数据*/

INSERT INTO

Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

/*向Goods表中插入数据*/

INSERT INTO

Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

/*修改表中的数据*/ UPDATE Goods /*将Goods表中的所有价钱都增加*/

SET Price=Price+10;

UPDATE Orders

SET Quantity=5

WHERE CustomerID=2;/*将Orders表中CustomerID为的客户订单数量修改为*/

UPDATE Customers

SET Tel=0911536 , Address='长安区'

WHERE CustomerID=3;

修改后的表:

/*删除表中的一些数据*/

DELETE FROM Orders

WHERE CustomerID=2;/*删除了CustomerID为的订单记录*/

删除记录之后的表:

实验4 数据的简单查询和连接查询

一、实验目的

数据查询时数据库中最基本的操作,也是使用最频繁的操作,因此必须掌握SQL的查询语句(SELECT语句)的使用方法。本实验要求掌握简单表的数据查询、数据排序和多表操作时数据连接查询的操作方法。 二、实验内容

(1)简单查询操作。该实验包括投影、选择条件表达、数据排序等。

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(1)-(4)的查询。

(2)连接查询操作。该实验包括等值连接、自然连接、一般连接(内连接) 、外连接、左外连接、右外连接和自然连接等。

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(5)的查询。

(一)简单查询操作

1,查找所有西安客户的信息/*查询*/

SELECT *

FROM Customers

WHERE City='西安'; /*查找所有西安客户的信息*/

2.查找所有商品的名称,库存,价格以及表示打折价,按升序排列

SELECT GoodsName,Storage,Price,0.25*Price Discount

From Goods

ORDER BY Price ASC; /*查找所有商品的名称,库存,价格以及表示打折价,按升序排列*/

3.查找商品名中包含“衣”的商品编号,名称及价格

SELECT GoodsID,GoodsName,Price

From Goods

WHERE GoodsName LIKE '%衣%'; /*查找商品名中包含“衣”的商品编号,名称及价格*/

4.查询库存量大于小于的商品名称,库存和单价

SELECT GoodsName,Storage,Price

From Goods

WHERE Storage>100 AND Storage<500; /*查询库存量大于小于的商品名称,库存和单价*/ (二)连接查询操作

查找2011年1月1日至2012年1月1日期间,订货金额大于2的所有订单的客户姓名,商品名称,单价,订货数量和订货金额

/*连接查询*/

SELECT Goodsname,Cname,Price,Quantity,Ordersum

FROM Customers,Goods,Orders

WHERE erID=erID and

D=D and

Orderdata between '2011-01-1 'and '2012-1-1' and Quantity>2

实验5 数据库的复杂查询

一、实验目的

进一步掌握SELECT语句的使用方法,通过实验能够熟练地使用SELECT语句。本实验要求掌握嵌套查询和统计查询的操作方法。

二、实验内容

在数据库Market的客户表Customers、货品表Goods、订单表Orders中完成第3章习题6中(6)-(9)的查询。

三、运行结果

(1)查找订单编号,商品编号,客户编号,按日期对订单分组,显示订货数量不超的订单信息

SELECT OrderID,GoodsID,CustomerID

FROM Orders

WHERE Quantity<=30

(SELECT Orderdata

FROM Orders

group by Orderdata);

(7)查找所有西安客户的订单信息,要求用不相关子查询完成

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID FROM Customers

WHERE City='西安');

(8)查找不是上海客户的订单信息

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City<>'上海');

(9)查找所有西安客户的相关信息以及他们的订单情况

SELECT *

FROM Customers,Orders

WHERE erID=erID and City='西安';

实验6 索引和视图

一、实验目的

(1)理解索引和视图的概念。

(2)掌握索引的使用方法。

(3)掌握视图的定义和使用方法。

二、实验内容

在Market数据库中,完成第3章习题11中(1)的建立视图的操作,然后在该视图上完成第3章习题11中(2)的查询操作。

三、运行结果

CREATE VIEW XIAN_ORDER(OrderID,GoodsName,Quantity,CustomerID,Cname)

AS

SELECT OrderID,GoodsName,Quantity,erID,Cname

FROM Orders,Goods,Customers

WHERE erID=erID AND

D=D AND City='西安' /*创建西安客户订单的视图*/

SELECT *

FROM XIAN_ORDER /*查找西安客户的订单信息*/ 实验7 存储过程

一、实验目的

理解存储过程的概念,掌握存储过程的使用方法。

二、实验内容

(一)在Market数据库中,完成第4章习题5中(1)-(4)创建存储过程的操作,并使用EXCEL语句调用这些存储过程执行,观察他们的执行过程。

(二)在Market数据库中,进一步完成以下操作。

1.创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)。

2.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单,则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能。

3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)。

三、运行结果

(一)(1) 第4章习题5中(1)-(4)创建存储过程的操作结果如下

/*为上海客户建立存储过程*/

CREATE procedure sp_shanghai

AS

SELECT *

FROM customers

WHERE city='上海';

CREATE procedure sp_Goods

@GoodsID char(20)

AS SELECT D,GoodsName,Price,Provider,Storage,Status

FROM Goods

/*创建存储过程sp_Goods,查看制定商品信息,商品编号作为输入参数*/

/*以客户编号作为输入参数,订单总金额作为输出函数,建立存储过程*/

CREATE procedure sp_goodsum @Cnumber char(10),

@Osum int output

AS

SELECT @osum=Ordersum

FROM Orders

WHERE CustomerID=@cnumber

*编写存储过程sp_insertGoods,向Goods中插入一条记录*/

CREATE procedure sp_insertGoods

@GoodsID int,@GoodsName varchar(20),@Price money,@Decription

VARCHAR(200),@Storage int,@Provider VARCHAR(50), @Status TINYINT

AS

insert into Goods

values

(@GoodsID,@GoodsName,@Price,@Decription,@Storage,@Provider,@Status);/

创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)*/

CREATE procedure Goods_Orders1

@GoodsID int,

@OrderID int output,@CName varchar(20) output,@Quantity int

output,@OrderSum money output,@Orderdata datetime output

AS

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers WHERE erID=erID and GoodsID=@GoodsID;/*1.

.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单,

则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能

CREATE procedure Goods_Orders2

@GoodsID int=NULL

AS

IF @GoodsID is NULL

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID

END

ELSE

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and

GoodsID=@GoodsID

END

/*3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)*/

CREATE procedure Goods_OrderSum

@GoodsName varchar(20),

@OrderSum money output

AS SELECT OrderSum

FROM Orders,Goods

WHERE D=D and GoodsName=@GoodsName;

实验8 触发器

一、实验目的

学习触发器的使用,体会触发器执行的时机,加深对触发器功能和作用的理解。

二、实验内容

(1)在Market数据库中,完成第4章习题5中(5)-(9)创建触发器的操作,然后在相关的表上执行INSERT、UPDATE或DALETE语句,观察他们的执行结果。

三、运行结果

五.

代码设计技巧及体会

首先,我觉得自己使用SQL就比较生疏,刚开始不是很了解,可是通过几次上机试验后对于程序运行环境有了进一步的了解,为写代码和使用SQL打下了基础,第一次写了这么多的语句,遇到了很多困难,有些在书上找不到,需要自己认真思考,根据书上的例子进行变通,不会的时候就请教了老师或者同学,解决了一大部分的问题,自己对于SQL语句也有更进一步的了解,到后来能够自己去写代码而不用参考教材,这其中真的学到了不少东西,不足的地方还是有的,有一小部分的问题还等待在日后的学习中去解决。

源代码:

/*基本表的定义与创建*/

CREATE TABLE Customers

(

CustomerID int IDENTITY(1,1) PRIMARY KEY,

CName varchar(8) NOT NULL,

Address varchar(50),

City varchar(10),

Tel varchar(20) UNIQUE,

Company varchar(50),

Birthday datetime,

Type tinyint DEFAULT 1

);

CREATE TABLE Goods

(

GoodsID int CONSTRAINT C1 PRIMARY KEY,

GoodsName varchar(20) NOT NULL,

Price money,

Decription varchar(200),

Storage int, Provider varchar(50),

Status tinyint DEFAULT(0)

);

CREATE TABLE Orders

(

OrderID int IDENTITY(1,1) CONSTRAINT C2 PRIMARY KEY,

GoodsID int NOT NULL REFERENCES Goods(GoodsID) ON DELETE CASCADE,

/*表级完整性约束条件,参照约束为Goods(GoodID),删除时进行级联删除*/

CustomerID int NOT NULL FOREIGN KEY(CustomerID)

REFERENCES Customers(CustomerID) ON DELETE NO ACTION,

/*表级完整性约束条件,参照约束为Customers(CustomerID),删除时不删除参照表中的被引用行*/

Quantity int NOT NULL CONSTRAINT C3 CHECK(Quantity > 0),

Ordersum money NOT NULL,

OrderData datetime DEFAULT(getdate())

);

/*在Customers表中已有数据的基础上向各个表中插入数据*/

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王伟','长安区','西安','029005','邮电大学','1995-02-13')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('惠敏','海淀区','北京','010001','中国农业大学','1992-06-23')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('王二小','浦东新区','上海','021001','上海商学院','1991-05-07')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('周颖','临潼区','西安','029006','西安科技大学','1991-02-02')

INSERT INTO Customers(CName,Address,City,Tel,Company,Birthday)

VALUES('吴起','槐荫区','山东','058436','山东师范','1990-10-09')

/*向Goods表中插入数据*/

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0001','书包',45.00,'双肩包','20','舒适','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0002','水杯',32.00,'塑料','322','特百惠','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0003','上衣',100.22,'长款','18','春季适用','1') INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0004','风衣',128.22,'长款','28','秋季适用','1')

INSERT INTO Goods(GoodsID,GoodsName,Price,Decription,Storage,Provider,Status)

VALUES('0005','短裤',56.88,'超短','50','夏季适用','1')

/*向Orders表中插入数据,其中有错误数据的测试*/

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0003','1','4',100.22,'2011-05-07')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0001','2','3',45.00,'2011-12-21')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0002','5','10',32.00,'2012-03-02')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)

VALUES('0004','3','2',128.22,'2013-04-18')

INSERT INTO Orders(GoodsID,CustomerID,Quantity,Ordersum,OrderData)/*该语句错误,应为赋给OrderID的值没有参照表Orders*/

VALUES('0006','3','1',32.00,'2013-05-07')

/*修改表中的数据*/

UPDATE Goods /*将Goods表中的所有价钱都增加10*/

SET Price=Price+10;

UPDATE Orders

SET Quantity=5

WHERE CustomerID=2;/*将Orders表中CustomerID为2的客户订单数量修改为5*/

UPDATE Customers

SET Tel=0911536 , Address='长安区'

WHERE CustomerID=3;

UPDATE Orders

SET CustomerID=10

WHERE GoodsID=0001; /*该语句错误,没有参考完整性*/

/*删除表中的一些数据*/

DELETE FROM Orders

WHERE CustomerID=2;/*删除了CustomerID为2的订单记录*/ /*查询*/

SELECT *

FROM Customers

WHERE City='西安'; /*查找所有西安客户的信息*/

SELECT GoodsName,Storage,Price,0.25*Price Discount

From Goods

ORDER BY Price ASC; /*查找所有商品的名称,库存,价格以及表示打折价,按升序排列*/

SELECT GoodsID,GoodsName,Price

From Goods

WHERE GoodsName LIKE '%衣%'; /*查找商品名中包含“衣”的商品编号,名称及价格*/

SELECT GoodsName,Storage,Price

From Goods

WHERE Storage>100 AND Storage<500; /*查询库存量大于100小于500的商品名称,库存和单价*/

/*连接查询*/

SELECT Goodsname,Cname,Price,Quantity,Ordersum

FROM Customers,Goods,Orders

WHERE erID=erID and

D=D and

Orderdata between '2011-01-1 'and '2012-1-1' and Quantity>2

/*复杂查询*/

/*查找订单编号,商品编号,客户编号,按日期对订单分组,显示订货数量不超30的订单信息*/

SELECT OrderID,GoodsID,CustomerID

FROM Orders

WHERE Quantity<=30

(SELECT Orderdata

FROM Orders

group by Orderdata);

/*查找北京客户的订单信息*/

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City='西安'); /*查找不是上海客户的订单信息*/

SELECT *

FROM Orders

WHERE CustomerID in

(SELECT CustomerID

FROM Customers

WHERE City<>'上海');

/*北京客户的相关信息及订单情况*/

SELECT *

FROM Customers,Orders

WHERE erID=erID and City='西安';

CREATE VIEW XIAN_ORDER(OrderID,GoodsName,Quantity,CustomerID,Cname)

AS

SELECT OrderID,GoodsName,Quantity,erID,Cname

FROM Orders,Goods,Customers

WHERE erID=erID AND D=D AND

City='西安' /*创建西安客户订单的视图*/

SELECT *

FROM XIAN_ORDER /*查找西安客户的订单信息*/

/*存储过程*/

/*为上海客户建立存储过程*/

CREATE procedure sp_shanghai

AS

SELECT *

FROM customers

WHERE city='上海';

CREATE procedure sp_Goods

@GoodsID char(20)

AS SELECT D,GoodsName,Price,Provider,Storage,Status

FROM Goods /*创建存储过程sp_Goods,查看制定商品信息,商品编号作为输入参数*/

EXECUTE sp_Goods @GoodsID=0001;

/*以客户编号作为输入参数,订单总金额作为输出函数,建立存储过程*/

CREATE procedure sp_goodsum

@Cnumber char(10),

@Osum int output

AS

SELECT @osum=Ordersum FROM Orders

WHERE CustomerID=@cnumber

CREATE procedure sp_insertGoods

@GoodsID int,@GoodsName varchar(20),@Price money,@Decription

VARCHAR(200),@Storage int,@Provider VARCHAR(50), @Status TINYINT

AS

insert into Goods

values (@GoodsID,@GoodsName,@Price,@Decription,@Storage,@Provider,@Status);/*编写存储过程sp_insertGoods,向Goods中插入一条记录*/

DROP procedure sp_insertGoods

/*调用存储过程*/

EXECUTE procedure sp_insertGoods

0006,'帽子',18.00,'沙滩帽',100,'上海',1

CREATE procedure Goods_Orders1

@GoodsID int,

@OrderID int output,@CName varchar(20) output,@Quantity int output,@OrderSum money

output,@Orderdata datetime output

AS

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and GoodsID=@GoodsID;/*1.创建一个存储过程Goods_Orders1,查看任何指定货物的订单情况,包括订单号、订货客户的姓名以及订货数量等(要使用输入参数)*/

CREATE procedure Goods_Orders2

@GoodsID int=NULL

AS

IF @GoodsID is NULL

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID

END

ELSE

BEGIN

SELECT OrderID,CName,Quantity,OrderSum,Orderdata

FROM Orders,Customers

WHERE erID=erID and GoodsID=@GoodsID

END /*2.执行存储过程Goods_Orders1时,如果没有给出参数,则系统会报错,如果希望不给出参数是能查出所有货品的订单, 则可以用默认参数值来实现。为此要求创建另一个存储过程Goods_Orders2来完成此功能*/

/*3.创建一个存储过程Goods_OrderSum,来获得某个货品的订单总额(要使用输入以及输出参数)*/

CREATE procedure Goods_OrderSum

@GoodsName varchar(20),

@OrderSum money output

AS

SELECT OrderSum

FROM Orders,Goods

WHERE D=D and GoodsName=@GoodsName;

/*触发器*/

/*在Customers表上建立删除触发器,实现Customers表和Orders表的级联删除*/

CREATE trigger CustomersDelete on Customers

AFTER delete

as

delete from Orders

where CustomerID in

(select erID from deleted);

/*在Orders表上建立插入触发器,当向表中添加一条订货记录时,若订单中的商品状态为整理(Status=1),则不能插入该条记录*/

CREATE trigger Orders_insert on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

WHERE Status=0)=0

BEGIN

print'商品状态为整理(Status=1) 不能插入该条记录'

rollback transaction

END;

/*在Orders表上建立插入触发器,当添加订单时,减少Goods表中相应商品的库存量*/

CREATE trigger Orders_insert2 on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

)=1

BEGIN

update Goods

set Storage=ty

rollback transaction END;

/*在Orders表上建立触发器,不允许对订单日期进行修改*/

CREATE trigger Orders_update on Orders

AFTER update

AS

IF update(Orderdata)

BEGIN

print'不允许对订单日期进行修改'

rollback transaction

END;

/*建立触发器,实现参照完整性约束,即若在Orders表中添加一条订单记录时,则该订单中的商品必须在Goods表中存在,

否则不允许添加该记录*/

CREATE trigger Orders_insert3 on Orders

AFTER INSERT

AS

IF(SELECT count(*) FROM Goods, inserted

WHERE D=D)=0

BEGIN

print'不允许添加该记录'

rollback transaction

END;