dqz数据库原理Word文档下载推荐.docx
- 文档编号:6614482
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:23
- 大小:168.64KB
dqz数据库原理Word文档下载推荐.docx
《dqz数据库原理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《dqz数据库原理Word文档下载推荐.docx(23页珍藏版)》请在冰点文库上搜索。
商店电话号码pone
库位数no_bins
所在城市city
所以:
此实体的主码primarykey必定是:
商店编号store_id
没有部分函数依赖或传递依赖,满足3NF要求,所以:
商店store实体不需要修改。
(2)、实体:
供货商supplier中只有一个属性,所以可以把它变成为联系:
订单hold的一个属性。
所以取消实体:
商店
(3)、实体:
货物items中,存在以下函数依赖:
货物编号item_id->
货物名称desc
货物尺寸size
货物重量weight
货物编号item_id
货物items实体不需要修改。
(4)、联系:
订单hold中,存在以下函数依赖:
订单编号order_no->
订单日期order_date
商店编号store_id
所订货物编号item_id
(订单编号order_no,所订货物编号item_id)->
所订货物数量qty_ordered
发现:
由于在联系:
订单hold中,既存在由订单编号order_no单独数据决定某属性的情况,又存在由(订单编号order_no,所订货物编号item_id)共同数据决定某属性的情况。
此实体的主码primarykey必定只能是:
(订单编号order_no,所订货物编号item_id)
然而:
决定了(订单编号order_no,所订货物编号item_id)为主码,则又有下列关系:
(订单编号order_no,所订货物编号item_id)->
于是,此关系中存在部分函数依赖!
因为存在:
订单编号order_no->
订单日期order_date,
并且又存在:
所以实际上有订单日期order_date部分函数依赖于(订单编号order_no,所订货物编号item_id)
因此:
此模式只能达到1NF,不能达到题目要求的3NF
必须对联系:
订单hold进行投影分解。
投影分解为以下两个关系:
订单hold(订单编号order_no,订单日期order_date,商店编号store_id,供货商supplier)
订单明细(订单编号order_no,所订货物编号item_id,所订货物数量qty_ordered)
这样,两个关系中均不再有部分函数依赖或传递函数依赖,所以满足3NF
【注意:
订单之类的一般都必须包括两个表,一个是订单表,表示订单的情况概述;
另一个是订单明细表,表示订单中具体所订的货物及数量等。
】
所以,新产生的基本E-R图为:
两个实体:
商店stores和货物items以及三个联系:
商店与货物的联系:
存货hold,商店与供货商联系:
订单orders,订单与货物的联系:
item_order【也可认为商店、货物、订单都是实体】
商店、货物、订单都是名词,所以可以是实体而不是联系。
第三步:
据以上分析,把基本E-R图向数据模型转换:
根据转换方法:
每个实体用一个表表达,每个联系用一个表表达。
所以本小题的答案为:
建立以下五个表:
stores(stored_id,phone,no_bins,city)
items(item_id,desc,size,weight)
hold(store_id,item_id,qty_held)
orders(order_no,order_date,supplier)
item_order(order_no,item_id,qty_ordered)
2、用SQL-98的DDL描述题目中规定的语义的假设。
(1)、用SQL建立商店stores表
据商店stores表中的函数依赖,以及题目假设1,知道:
商店编号store_id不能为空且为主码,商店所在城市city不能为空且必须唯一,电话号码pone可为空(即无约束),因为货位数no_bins没有指明约束条件,所以用默认(即可以为空),
即
stores(stored_id,phone,no_bins,city)
约束:
Notnull无约束无约束Notnull
PrimarykeyUnique
所以SQL语句如下:
createtablestores
(store_idchar(8)notnullprimarykey,
ponechar(15),
no_binsnumber(3),
citychar(20)notnullunique
);
作为主码的属性列/字段一定同时也是不可为空的,所以对单独一个属性列/字段作主码时的约束条件必须连写为:
notnullprimarykey】
作为取值唯一的属性列/字段一定同时也是不可为空的,所以对单独一个属性列/字段取值唯一时的约束条件必须连写为:
notnullunique实际上取值唯一的属性列/字段也就代表了它必定是一个候选索引。
不写notnull时则约束条件默认为“可以为空”,所以题目中说“可以为空则不需要特别指明其约束条件】
(2)、用SQL建立货物items表
据货物items表中的函数依赖,以及题目假设2,知道:
知道货物items表中货物编号item_id不能为空且为主码,货物名称的desc不能为空,货物尺寸size不能为空,货物重量无约束,即:
items(item_id,desc,size,wieght)
NotnullNotnullNotnull无约束
Primarykey
createtableitmes
(item_idchar(13)notnullprimarykey,
descchar(20)notnull,
sizechar(20)notnull,
weightnumber(8)
(3)、用SQL建立存货hold表
据存货hold表中的函数依赖,以及题目假设3,知道:
知道商店编号store_id是引用于stores(store_id)且不能为空,货物编号item_id是引用于itemss(item_id)且不能为空,存货数量qty_held可以为空但必须大于0,整个hold表的主码为(store_id,item_id)
items(store_id,item_id,qty_held)
NotnullNotnull>
Referencestores(store_id)Referenceitems(item_id)
createtablehold
(store_idchar(8)notnullreferencesstores(store_id),
item_idchar(13)notnullreferencesitems(item_id),
qty_heldnumber(8)check(qty_held>
0),
primarykey(stroe_id,item_id)
作为主码的属性列/字段一定同时也是不可为空的,所以对多个属性列/字段作主码时,在主码的各属性列/字段上必须写有约束条件:
notnull,而在表定义的最后必须用primarykey(主码的属性列/字段的集合)语句来定义表的主码,以保证其实体完整性】
虽然题目中没有明确引用关系,但是在建立表的时候,特别是建立表示联系的表的时候,必须自己指出其中在其他表中已经出现过的属性列/字段是从什么表的什么字段引用过来的,以保证其参照完整性】
用到了引用关系的属性列/字段的数据类型定义及长度必须与被引用对象相同】
(4)、用SQL建立订单orders表
据订单orders表中的函数依赖,以及题目假设4,知道:
知道订单orders表中订单编号order_no不能为空且为主码,订货日期order_date不能为空,供货商supplier不能为空且为唯一(题目中要求一份订单不能有一个以上的供应商但必须有一个供应商),即:
orders(order_no,order_date,supplier)
NotnullNotnullNotnull
Primarykeyunique
createtableorders
(order_nochar(8)notnullprimarykey,
order_datedatenotnull,
supplierchar(20)notnullunique
(5)、用SQL建立订单明细表item_order表
据订明细表item_order表中的函数依赖,以及题目假设4,知道:
知道订明细表item_order表中订单编号order_no是引用于oders(order_id)且不能为空,货物编号item_id是引用于items(item_id)且不能为空,订货数量qty_ordered必须大于0,整个item_order表的主码为(order_no,item_id)
items_order(order_id,item_id,qty_ordered)
Referenceorders(order_id)Referenceitems(item_id)
createtableitems_order
(order_idchar(8)notnullreferencesorders(order_id),
item_idchar(13)notnullreferencesitems(item_id),
qty_orderednumber(8)check(qty_ordered>
primarykey(order_id,item_id)
【注意写SQL时,写完一条SQL语句必须以一个分号;
来结束此语句】
二、SQL:
【主要考察:
建表,查询(选择、投影、连接),插入,删除,修改。
不考修改表、建立索引、视图,删除表、索引、实体,授权和收回授权】
1、查位于Boston的商店的号码(store_id):
selectstore_idfromstores
wherecity=’Boston’;
2、查重量大于10的各种货物的货号(item_id):
selectitem_idfromitems
whereweight>
10;
3、查某供货商P&
G的所有供货的订货日期
selectdatefromorders
wheresupplier=’P&
G’;
4、查各有货物名称(desc)为window的商店的位置(city):
selectA.cityfromstoresA,itemsB,item_orderC
whereA.store_id=C.store_idandC.item_id=B.item_idandB.desc=’window’;
5、查备有P&
G所供货物的商店号(store_id)
selecthold.store_idfromhold,orders,item_order
wherehold.item_id=item_order.item_idanditem_order.order_no=orders.order_noandorders.supplier=’P&
或使用in短语来实现:
selecthold.store_idfromhold
wherehold.item_idin
(selectitem_oder.item_idfromitem_oder
whereitem_oder.order_noin
(selectorders.order_nofromorders)
);
6、查备有所有货物的商店号(store_id)
selectA.store_idfromstoresA
wherenotexists
(select*fromitmes
whereitmes.item_idnoin
(selecthold.item_idfromhold
)
);
7、查每个商店备有的各种货物的总数量
selectstore_id,sum(qty_held)fromhold
groupbystore_id;
8、删除订单ord1及相关订购货物
deletefromitem_order
whereorder_no=’ord1’;
deletefromorders
9、将所有货物重量在原基础上提高三倍
updateitems
setweight=weight*3;
如将商店编号(store_id)为’km1’的商店的货物名称(desc)为’cap’的货物数量增加20,则用下面带有where子句的update语句:
updatehold
setqty_held=qty_held+20
wherestore_id=’km1’anditem_idin
(selectitem_idfromitems
wheredesc=’cap’);
【注意此处不能用item_id=(select……),因为此处的(seect……)将输出一个可能有多个元组/行/记录的选择集而不仅仅是一个元组/行/记录,所以只能用in短语来连接而不能用=来连接】
在SQL的where子句中如用到一个属性列/字段与一个(select……)子句来连接形成一个逻辑表达式时,一般用in短语来代替=作连接符合,以免出错。
in短语在此处能完全代替=的功能,但=不能代替in短语的功能】
10、将(’st_a’,66,200,‘chicago’)插入stores表
insertinto
stores(stored_id,phone,no_bins,city)
values(‘st_a’,66,200,‘chicago’);
11、查询有两种以上货物的商店号
selectstore_idfromhold
groupbystore_idhavingcount(item_id)>
2;
或者用下列语句:
selectA.store_idfromholdAB
whereA.store_id=B.store_idandA.item_id<
>
B.item_id;
12、按重量由低到高顺序输出货物的信息
select*fromitems
orderbyweightasc;
13、查重量相同的货物的编号
selectA.item_idfromitemsAB
whereA.weight=B.weightandA.item_id<
B.tiem_id;
θ
三、关系代数:
【主要考选择δ、投影П、连接、不考除法】
.1、查询有两种以上货物的商店号
【在本例子中,参与条件连接的两个运算对象也可以直接是hold表本身,但为了降低运算量,本例子中用的是对hold表在store_id和item_id属性列上的投影。
在关系代数中,一个表达式写完之后不能相SQL一样加分号;
来结尾。
关系代数的表达式不用任何符号来表示结尾。
而SQL一条语句完成后必须用一个分号;
来表示语句结束。
在关系代数中,参与运算的可以是关系/表,也可以是对关系/表的某种操作的表达式。
2、查位于Boston的商店的号码(store_id)
Пstore_id(δcity=’Boston’(stores))
Пcity(Пdesc,item_id(δdesc=’window’(items))Пstore_id,item_id(hold)
Пstore_id,city(stores))
3、查各有货物名称(desc)为window的商店的位置(city)
在关系代数中,当使用自然连接的时候,可以不写出应在连接符号下方写出的条件表达式。
【重点一:
数据库的设计(设计其模式:
即设计表结构。
以及用SQL建立带有指定约束条件的表结构),可能比较复杂,题目目标例如:
学生的成绩管理、收费单的管理、订单的管理、人事的管理。
特别注意CREATE语句中的各种约束条件的写法:
notnull,notnullunique,notnullprimarykey,check(条件表达式)以及referencesXXX表(属性列)以及primarykey(属性列1,属性列2)
注意:
考试时数据库设计的题,设计出的表的个数不要超过5个。
重点二:
用SQL对表实现SELECT、INERST、UPDATE、DELETE,不考对索引、视图的操作、不考授权和收回授权,不考对表结构的修改
象征性的考一些:
关系代数:
选则、投影、连接。
不考除法。
一共三个题型,形同上述三个例子。
不考概念。
附录:
1、关系代数:
(1)、选择:
δ逻辑表达式(表的名称)
用于从指定表中选出满足指定逻辑表达式的元组/行/记录。
相当于:
SELECT*FROM指定的表WHERE逻辑表达式;
(注意SQL语句必须用分号;
结尾。
)
例如:
δcity=’Boston’(stores)
(2)、投影:
П属性列1,属性列2,……,属性列n(表的名称)
用于从指定表中输出指定的属性列。
SELECTDISTINCT属性列1,属性列2,……,属性列nFROM指定的表;
逻辑表达式
例如:
Пstore_id,city(stores)
(3)、连接:
关系1关系2
用于完成关系1和关系2的笛卡尔积,并从中选出满足逻辑表达式的元组/行/记录输出。
它相当于:
δ逻辑表达式(关系1×
关系2),也即:
SELECT*FROM关系1,关系2WHERE逻辑表达式
hold.Store_id=stores.store_id
Пstore_id,item_id(hold)
Пstore_id,city(stores)
2、SQL语言:
(1)、查询,SELECT语句:
SELECT[ALL|DISTINCT]<
目标列表达式>
[别名][,<
[别名]……]
FROM<
表名或视图名>
[WHERE<
不包含有集函数的作用于基本表或视图的条件表达式>
]
[GROUPBY<
属性列名1>
[HAVING<
可包含有集函数的作用于选择集分组的条件表达式>
]]
[ORDERBY<
属性列名2>
[ASC|DESC]];
<
1>
、ALL和DISTINCT选项:
默认为ALL,可省略。
如用了DISTINCT短语,表示从选择结果集中排除哪些值完全相同的重复的元组/行/记录。
2>
、目标列表达式的格式可以是以下几种:
*代表选取所有属性列/字段输出,即在所有属性列/字段上投影。
表名>
.*代表选取指定表中的所有元组/行/记录。
此表名必须是在FROM子句中出现的表或视图的名称或别名。
[<
.]<
属性列名表达式>
此表达式可以是属性列名/字段名,作用于属性列名的集函数表达式或其它函数表达式,属性列名与其它任意类型相同的常数的算术表达式(+-*/),输出结果是此属性列名表达式的表达式值。
其中集函数表达式有:
COUNT(属性列名)计选择集分组中元组/行/记录的个数
SUM(属性列名)求选择集分组中指定属性列/字段的累加和,其中此指定属性列/字段必须为数值型的量。
AVG(属性列名)求选择集分组中指定属性列/字段的平均值,其中此指定属性列/字段必须为数值型的量。
M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dqz 数据库 原理
![提示](https://static.bingdoc.com/images/bang_tan.gif)