当前位置:文档之家› 数据库案例分析

数据库案例分析

数据库案例分析
数据库案例分析

数据库案例分析

--职工(职工号,姓名,性别,年龄,电话,EMAIL)

--在职工表中插入记录(Z01,唐僧,男,

--35,88888888,88@88.book)

INSERT INTO 职工

V ALUES('Z01','唐僧','男',35,'88888888','88@88.book')

--图书类别(类别编号,类别名称)

--图书(图书号,类别,书名,出版社代号,库存量,价格)ALTER TABLE 图书ADD CONSTRAINT C1 FOREIGN KEY(类别) REFERENCES 图书类别(类别编号)

--客户(编号,名称,信用度,联系人,联系电话)

SELECT * FROM 客户WHERE 名称LIKE '浙江___'

--常用数学函数

SUM

A VG

COUNT

MAX

MIN

GROUP BY

R(A,B,C,D,E,G,H,I)

F={AB-->C,A-->DE,B-->GH,D-->I} R1(ABC) R2(ADE) R3(BGH) R4(DI)

题目:

唐僧师徒四人从西天取经回来,决定成立一图书销售公司,为了提高销售效率,经研究决定采用数据库技术,建立一数据库如下:

职工(职工号,姓名,性别,年龄,电话,EMAIL)

出版社(出版社代号,名称,地址,联系电话)

图书类别(类别编号,类别名称)

图书(图书号,类别,书名,出版社代号,库存量,价格)

客户(编号,名称,信用度,联系人,联系电话)

销售单(单号,销售职工号,客户编号,销售时间)

销售明细(销售单号,图书号,销售量,折扣,金额)

--触发器,当删除销售单时,若发现销售明细记录多于一条时,撤销删除操作

CREATE TRIGGER trg1

ON 销售单

AFTER DELETE

AS

BEGIN

IF (SELECT COUNT(*) FROM 销售明细WHERE 销售单号IN(SELECT 单号FROM DELETED )>1

ROLLBACK TRANSACTION

END

--SQL命令动词

--数据定义:CREATE ALTER DROP

--数据操纵:SELECT INSERT UPDA TE DELETE

--数据控制:GRANT REVOKE DENY

--封锁协议:一级,二级,三级

--范式:1NF,2,3,BC

R(A,B,C) F={AB→C,C→A}

R1(A,B) R2(B,C)

AB BC

2NF? 3NF? BCNF?

非主属性对码的依赖

--闭包

R1 n R2→R1-R2

R(A,B,C) F={A→B,B→C}

F1={A→C,AB→C,ABC→C}

最小函数依赖集

现要求数据库开发商通过SQL语句解决以下问题:

1、在职工表中插入记录(Z01,唐僧,男,35,88888888,88@88.book)

2、在出版社中插入记录(C01,铁扇出版社,北京故宫路110号,110110)

3、修改表“图书”,添加外码约束C1,实现“图书”表中“类别”字段与“图书类别”表

中“类别编号”字段关联

4、查找客户名称中包含“浙江”的个人信息

5、查找“类别名称”为“精装版”的图书信息

SELECT * FROM 图书类别,图书WHERE 类别名称=’精装版’ AND 类别=类别编号改写成:

SELECT * FROM 图书WHERE 类别IN(SELECT 类别编号FROM 图书类别WHERE 类别名称=’精装版’)

--特殊的比较运算符:BETWEEN….AND….

6、查找库存量<10的图书信息

SELECT * FROM 图书WHERE 库存量<10

--统计库存量超过1000的各类别图书的库存量,并按库存量从高到低进行排序

SELECT 类别,SUM(库存量) FROM 图书GROUP BY 类别

HA VING SUM(库存量)>1000

ORDER BY SUM(库存量) DESC

7、查找职工姓名为“孙悟空”的销售明细

职工(职工号,姓名,性别,年龄,电话,EMAIL)

出版社(出版社代号,名称,地址,联系电话)

图书类别(类别编号,类别名称)

图书(图书号,类别,书名,出版社代号,库存量,价格)

客户(编号,名称,信用度,联系人,联系电话)

销售单(单号,销售职工号,客户编号,销售时间)

销售明细(销售单号,图书号,销售量,折扣,金额)

--连接查询

SELECT 销售明细.* FROM 销售明细,销售单,职工WHERE 销售明细.销售单号=销售单.单号AND 销售单.销售职工号=职工.职工号AND 姓名=’孙悟空’

--子查询

SELECT * FROM 销售明细WHERE 销售单号IN(SELECT 单号FROM 销售单WHERE 销售职工号IN(SELECT 职工号FROM 职工WHERE 姓名=’孙悟空’))

8、用UPDATE语句更新“销售明细”中的金额字段,表达式为:金额=销售量*价格*(1-

折扣)

UPDATE 销售明细SET 金额=销售量*价格*(1-折扣)

9、按销售职工号分组统计销售总金额,并按销售总金额进行降序排序

销售单(单号,销售职工号,客户编号,销售时间)

销售明细(销售单号,图书号,销售量,折扣,金额)

SELECT 销售职工号,SUM(金额) FROM 销售明细,销售单WHERE 销售明细.销售单号=销售单.单号GROUP BY 销售单.销售职工号

10、通过连接查询或子查询查找:职工姓名,客户姓名,图书名,销售量,金额。

职工(职工号,姓名,性别,年龄,电话,EMAIL)

出版社(出版社代号,名称,地址,联系电话)

图书类别(类别编号,类别名称)

图书(图书号,类别,书名,出版社代号,库存量,价格)

客户(编号,名称,信用度,联系人,联系电话)

销售单(单号,销售职工号,客户编号,销售时间)

销售明细(销售单号,图书号,销售量,折扣,金额)

SELECT 姓名,名称,书名,销售量,金额FROM 职工,图书,客户,销售单,销售明细

WHERE 职工.职工号=销售单.销售职工号AND 图书.图书号=销售明细.图书号AND 客户.编号=销售单.客户编号AND 销售单.单号=销售明细.销售单号

11、删除名称为“红孩儿出版社”的出版社记录。

DELETE FROM 出版社WHERE 名称=’红孩儿出版社’

触发器与存储过程

1、在删除销售单同时删除其下的销售明细,怎么办?

2、在销售明细表插入数据、修改或删除数据时要进行以下操作(1)以“金额=销售量*价格*(折扣/10)”对金额进行自动计算(其中的价格来自“图书”表);(2)销售量发生变化后,“图书”表中的库存量也要相应发生变化,怎么办?

触发器实例二:

在学生成绩表中,要求修改成绩列时进行修改过程跟踪。通过触发器实现。

3、建立一存储过程,实现销售明细数据的插入操作,要对拟输入数据进行控制,要求销售单号、图书号不能为空,且(销售单号+图书号)不能重复),并将操作结果状态通过输出参数返回。

--建立一存储过程,实现销售明细数据的插入操作,要对拟输入数据进行控制,要求销售单号、图书号不能为空,且(销售单号+图书号)不能重复),并将操作结果状态通过输出参数返回。

CREATE PROCEDURE pro_IN_XSMX

(

@XSDH NVARCHAR(10),

@TSH NVARCHAR(10),

@XSL INT,

@ZK FLOAT,

@ZXJG CHAR(20)OUTPUT

)

AS

BEGIN

IF@XSDH=''

BEGIN

SET@ZXJG='销售单号为空!'

RETURN

END

IF@TSH=''

BEGIN

SET@ZXJG='图书号为空!'

RETURN

END

IF (SELECT COUNT(*)FROM销售明细

WHERE销售单号=@XSDH AND图书号=@TSH)>=1 BEGIN

SET@ZXJG='记录重复,请检查!'

RETURN

END

INSERT INTO销售明细(销售单号,图书号,销售量,折扣) VALUES(@XSDH,@TSH,@XSL,@ZK)

SET@ZXJG='插入成功!'

END

1、在职工表中插入记录(Z01,唐僧,男,35,88888888,

88@88.book)

答案:

(1)insert into 职工(职工号,姓名,性别,年龄,电话,EMAIL)values(Z01,唐僧,男,35,88888888,88@88.book)(2)insert into 职工(职工号,姓名,性别,年龄,电话,EMAIL)values(‘Z01’,’唐僧’,’男’,35,’88888888’,’88@88.book’)

3、修改表“图书”,添加外码约束C1,实现“图书”表中“类别”字段与“图书类别”表中“类别编号”字段关联答案:

(1)UPDATE 图书….

(2)ALTER TABLE 图书ADD C1 WHERE…

(3)ALTER TABLE 图书ADD CONSTRAINT C1 FOREIGN KEY(类别) REFERENCES 图书类别(类别编号) 5、查找“类别名称”为“精装版”的图书信息

(1)SELECT ‘精装版’ FROM 图书类别

(2)SELECT 图书.* FROM 图书, 图书类别WHERE 类别名称=’精装版’ AND 图书.类别=图书类别.类别编号

通过子查询提高效率:

SELECT * FROM 图书WHERE 类别IN (SELECT 类别编

号FROM 图书类别WHERE 类别名称=’精装版’)

7、查找职工姓名为“孙悟空”的销售明细

(1)SELECT * FROM 销售明细WHERE 姓名=’孙悟空’ ???

用子查询完成

SELECT * FROM 销售明细WHERE 销售单号IN (SELECT 单号FROM 销售单WHERE 销售职工号IN (SELECT 职工号FROM 职工WHERE 姓名=’孙悟空’)) 9、按销售职工号分组统计销售总金额,并按销售总金额大小进行排序

问题:未用GROUP BY ,ORDER BY,SUM或之一SELECT 销售职工号,SUM(金额)

FROM 销售单,销售明细

WHERE 销售单.单号=销售明细.销售单号

GROUP BY 销售职工号

ORDER BY SUM(金额) DESC

10、通过连接查询或子查询查找:职工姓名,客户姓名,图书名,销售量,金额。

问题:连接表不全,找不到实际数据

SELECT 姓名,名称,书名,销售量,金额

FROM 职工,客户,图书,销售明细,销售单

WHERE 销售明细.销售单号=销售单.单号AND 销售单.销售职工号=职工.职工号AND 销售单.客户编号=客户.编号AND 销售明细.图书号=图书.图书号

相关主题
文本预览
相关文档 最新文档