《数据库系统原理》实验报告(共45页).doc
精选优质文档-倾情为你奉上学 生 实 验 报 告(理工类)课程名称:数据库系统原理 专业班级: 14软件工程1班 学生学号: 学生姓名: 孟祥辉 所属院部: 软件工程学院 指导教师: 麻春艳 20 15 20 16 学年 第 二 学期 金陵科技学院教务处制实验报告书写要求实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。填写注意事项(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。(3)尽量采用专用术语来说明事物。(4)外文、符号、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。实验项目名称:数据库定义与操作语言 实验学时: 2 同组学生姓名: 孟陈、陈晓雪、季佰军 实验地点: 1318 实验日期: 5.19 实验成绩: 批改教师: 批改时间: 一、实验目的1、理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。2、掌握SQL册亨徐设计基本规范,熟练运用SQL语言实现数据基本查询,包括单表查询、分组统计查询和连接查询3、掌握SQL嵌套查询和集合查询等, 各种高级查询的设计方法等.4、熟悉数据库的数据更新操作,能够使用sql语句对数据库进行数据的插入、修改、删除操作。5、熟悉sql语言有关系图的操作,能够熟练使用sql语言来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。6、掌握所以设计原则和技巧,能够创建合适的索引以提高数据库查询、统计分析效率。二、实验内容和要求1、理解和掌握SQL DDL语句的语法,特别是各种参数的具体含义和使用方法;使用sql语句创建、修改和删除数据库、模式和基本表。掌握sql语句常见语法错误的调试方法。2、针对TPC-H数据库设计各种单表查询sql语句、分组统计查询语句;设计单个表针对自身的连接查询,涉及多个表的连接查询。理解和掌握sql查询语句各个子句的特点和作用,按照sql程序设计规范写出具体的sql查询语句,并调试通过。3、针对TPC-H数据库,证券分析用户查询要求,设计各种嵌套查询和集合查询。4、针对TPC-H数据库设计单元主唱入、批量数据插入、修改数据和删除数据的sql语句。理解和掌握insert、update、delete语法结构的各个组成成分,结合嵌套sql子查询,分别设计几个不同形式的插入、修改和删除数据的语句,并调试成功。5、针对给定的数据库模式,以及相应的应用要求,创建视图和带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握试图消解执行原理,掌握可更新视图和不可更新视图的区别。6、针对给定的数据库模式和具体应用需求,创建唯一索引、函数索引、复合索引等;修改索引;删除索引。设计相应的sql查询验证索引有效性,学习利用EXPLAIN命令分析sql查询是否使用了所创建的索引,并能够分析其原因,执行sql查询并估算索引提高查询效率的百分比,要求实验数据达到10万条记录以上的数据量,以便验证所以效果.三、实验过程1、数据库定义实验(1) 定义数据库采用中文字符集创建名为TCHP的数据库。CREATE DATABASE TPCH ENCODING=GBK;(2) 定义模式在数据库TPCH中创建名为SALES的模式。Create SCHEMA Sales;(3) 定义基本表在TPCH数据库的Sales模式中创建8个基本表。/*设置当前会话的搜索路径为sales模式、public模式,基本表就会自动创建在sales模式下。*/SET SEARCH_PATH TO Sales, Public;CREATE TABLE Region(regionkey INTEGER PRIMARY KEY,name CHAR(25),comment VARCHAR(152);CREATE TABLE Nation(nationkey INTEGER PRIMARY KEY,name CHAR(25),address VARCHAR(40),regionkey INTEGER REFERENCES REGION(REGIONKEY),comment VARCHAR(152);CREATE TABLE Supplier(suppkey INTEGER PRIMARY KEY,name CHAR(25),address VARCHAR(40),nationkey INTEGER REFERENCES Nation(nationkey),phone CHAR(15),acctbal REAL,comment VARCHAR(101);CREATE TABLE Part(partkey INTEGER PRIMARY KEY,name VARCHAR(55),mfgr CHAR(25),/*制造厂*/brand CHAR(10),type VARCHAR (25),size INTEGER,container CHAR(10),retailprice REAL,comment VARCHAR(23);CREATE TABLE PartSupp(partkey INTEGER REFERENCES Part(partkey),suppkey INTEGER REFERENCES Supplier(suppkey),availqty INTEGER,supplycost REAL ,comment varchar(199),PRIMARY KEY (parkey,suppkey);CREATE TABLE Costomer(custkey INTEGER PRIMARY KEY,name VARCHAR(25),address VARCHAR(40),nationkey INTEGER REFERENCES Nation(nationkey),phone CHAR(15),acctbal REAL,mktsegment CHAR(10),comment VARCHAR(117);CREATE TABLE Orders(orderkey INTEGER PRIMARY KEY,custkey INTEGER REFERENCES Customer(custkey),orderstatus CHAR(1),totalprice REAL,orderdate DATE,orderpriority INTEGER,comment VARCHAR(79);CREATE TABLE Lineitem(orderkey INTEGER REFERENCES Order(orderkey),partkey INTEGER REFERENCES Part(partkey),suppkey INTEGER REFERENCES Supplier(suppkey),linenumber INTEGER,quantity REAL,extendedprice REAL,discount REAL,tax REAL,returnflag CHAR(1),linestatus CHAR(1),shipinstruct CHAR(25),shipmode CHAR(10),comment VARCHAR(44),PRIMARY KEY(orderkey,linenumber),FOREIGN KEY(Partkey,suppkey) REFERENCES PartSupp(partkey,suppkey);2、数据基本查询(1)单表查询(实现投影操作)查询供应商的名称、地址和联系电话。SELECTE name,address,phone FROMSupplier;(2)单表查询(实现选择操作)查询最近一周内提交的总价大于1000元的订单的编号、顾客编号等订单的所有信息。SELECT *FROM Sales.Orders WHERE CURRENT_DATE-orderdata<7 AND totalprice >1000;(3)不带分组过滤条件的分组统计查询统计每个顾客的订购金额SELECT C.custkey ,SUM(O.totalprice)FROM customer C,Orders OWHERE C.custkey=O.custkeyGROUP BY C.custkey;(4) 带分组过滤条件的分组统计查询查询订单平均金额超过1000元的顾客编号及其姓名SELECT C.custkey,MAX(C.name)FROM Customer C,Orders OWHERE C.custkey=O.custkeyGROUP BY C.custkey;HAVING AVG(O.totalprice)>1000;(5) 表单自身连接查询查询与“金仓集团”在同一个国家的供应商编号、名称和地址信息。SELECT F.suppkey,F.name,F.addressFROM Supplier F,Supplier S WHERE F.nationkey=S.nationkey AND S.name='金仓集团'(6) 两表连接查询(普通连接)查询供应价格大于零售价格的零件名、制造商名、零售价格和供应价格。SELECT P.name,P.mfgr,P.retailprice,PS.supplycostFROM Part P,Partsupp PSWHERE P.retailprice>PS.supplycost;(7) 两表连接查询(自然连接)查询供应价格大于零售价格的零件名、制造商名、零售价格和供应价格。SELECT P.name,P.mfgr,P.retailprice,PS.supplycostFROM Part P,Partsupp PSWHERE P.partkey=PS.partkey AND P.retailprice>PS.supplycost;(8)三表连接查询查询顾客“苏举库”订购的订单编号、总价及其订购的零件编号、数量和明细价格。SELECT O.orderkey,O.totalprice,L.partkey,L.quantity,L.extendedpriceFROM Custom C,Orders O,Lineitem LWHERE C.custkey=O.custkey AND O.orderkey=L.orderkey AND C.name='苏举库'3、数据高级查询实验(1)IN嵌套查询查询订购了“海大”制造的“船舶模拟驾驶舱”的顾客。SELECT custkey,nameFROM CustomerWHERE custkey IN ( SELECT O.custkey FROM Orders O,Lineitme L,PartSupp PS,Part P WHERE O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND P.mfgr='海大' AND P.name='船舶模拟驾驶舱');SELECT custkey,nameFROM CustomerWHERE cuskey IN ( SELECT O.custkey FROM Orders O,Lineitem L,Part P WHERE O.orderkey=L.orderkey ANDL.partkey=P.partkey ANDp.mfgr='海大' AND P.name='船舶模拟驾驶舱');(2)单层EXISTS嵌套查询查询没有购买过“海大”制造的“船舶模拟驾驶舱”的顾客。SELECT custkey,nameFROM CustomerWHERE NOT EXISTS( SELECT O.custkey FROM Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey ANDO.orderkey=L.orderkey ANDL.partkey=PS.partkey ANDL.suppkey=PS.suppkey ANDPS.partkey=P.partkey ANDp.mfgr='海大' AND P.name='船舶模拟驾驶舱');(3)双层EXISTS嵌套查询查询至少购买过顾客“张三”购买过的全部零件的顾客姓名。SELECT CA.nameFROM Customer CAWHERE NOT EXISTS(SELECT * FROM Customer CB,Oders OB,Lineitem LB WHERE CB.custkey=OB.custkey ANDOB.orderkey=LB.orderkey ANDCB.name='张三' ANDNOT EXISTS(SELECT * FROM Orders OC,Lineitem LC WHERE CA.custkey=LC.custkey AND OC.orderkey=LC.orderkey AND LB.suppkey=LC.suppkey AND LB.partkey=LC.partkey);(4)FROM子句中的嵌套查询查询订单平均金额超过1万元的顾客中的中国籍顾客信息。SELECT C.*FROM Customer C,(SELECT custkey FROM Orders GROUP BY custkey HAVING AVG(totalprice)>10000) B,Nation N WHERE C.custkey=B.custkey AND C.nationkey=N.nationkey AND N.name='中国'(5)集合查询(交)查询顾客“张三”和“李四”都订购过的全部零件的信息。SELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.custkey=O.custkey AND O.orderkey=L.orderkey AND L.suppkey=PS.suppkey AND L.partkey=PS.partkey AND PS.partkey=P.partkey AND C.name='李四'INTERSECTION SELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey AND O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND C.name='李四'(6)集合查询(并)查询顾客“张三”和“李四”订购的全部零件的信息。SELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey AND O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND C.name='张三'UNIONSELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey AND O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND C.name='李四'(7)集合查询(差)顾客“张三”订购过而“李四”没订购过的零件的信息。SELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey AND O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND C.name='张三'EXCEPTSELECT P.*FROM Customer C,Orders O,Lineitem L,PartSupp PS,Part P WHERE C.cuskey=O.custkey AND O.orderkey=L.orderkey AND L.partkey=PS.partkey AND L.suppkey=PS.suppkey AND PS.partkey=P.partkey AND C.name='李四'4、数据更新实验(1)INSERT基本语句(插入全部列的数据)插入一条顾客记录,要求每列都给一个合理的值。INSERT INTO CustomerVALUES (30,'张三','北京市',40,'010-',0.00,'Northeast','VIP Customer');(2)INSERT基本语句(插入部分列的数据) 插入一条订单记录,给出必要的几个字段值。INSERT INTO Lineitem(orderkey,Linenumber,partkey,suppkey,quantity,shipdate)VALUES(862,ROUND(RANDOM()*100,0,479,1,10,'2012-3-6');/*RANDOM()函数为随机小数生成函数,ROUND()为四舍五入函数*/(3)批量数据INSERT语句 创建一个新的顾客表,把所有中国籍顾客插入到新的顾客表中。CREATE TABLE NewCustmoer AS SELECT * FROM Customer WITH NO DATA;/*WITH NO DATA子句使得SELECT查询只生成一个结果模式,不查询出实际数据*/INSERT INTO NewCustomer/*批量插入SELECT 语句查询结果到NewCustomer表中*/SELECT C.*FROM Costomer C,Nation NWHERE C.nationkey=N.nationkey AND N.name='中国' 创建一个顾客购物统计表,记录每个顾客及其购物总数和总价等信息。CREATE TABLE ShoppingStat(custkey INTEGER, quantity REAL, totalprice REAL);INSERT INTO ShoppingStatSELECT C.custkey,Sum(L.quantity),Sum(O.totalprice)/*对分组后的数据求总和*/FROM Customer C,Order O,Lineitem LWHERE C.custkey=O.custkey AND O.orderkey=L.orderkeyGROUP BY C.custkey倍增零件表的数据,多次重复执行,直到总记录数达到50万为止。INSERT INTO PartSELECT partkey+(SELECT COUNT(*) FROM Part),name,mfgr,brand,type,size,container,retailprice,commentFROM Part;(4)UPDATE语句(插入部分记录的部分列值) “金仓集团”供应的所有零件的供应成本价下降10%。UPDATE PartSuppSET supplycost=supplycost*0.9WHERE suppkey=(SELECT suppkey/*找出要修改的那些记录*/ FROM Supplier WHERE name='金仓集团');(5)UPDATE语句(利用一个表中的数据修改另外一个表中的数据) 利用Part表中的零售价格来修改Lineitem中的extendedprice,其中extendedprice=Part.retailprice*quantity。UPDATE Lineitem LSET L.extendedprice=P.retailprice*L.quantityFROM Part PWHERE L.partkey=P.partkey;/*Lineitem表也可以直接与Part表相连接,而不需通过PartSupp连接*/(6)DELETE基本语句(删除给定条件的所有记录) 删除顾客张三的所有订单记录。DELECT FROM Lineitem/*先删除张三的订单明细记录*/WHERE orderkey IN(SELECT orderkey FROM Order O,Customer C WHERE O.custkey=C.custkey AND C.name='张三');DELECT FROM Order/*再删除张三的订单记录*/WHERE custkey=(SELECT custkey FROM Customer WHERE name='张三');5、 视图(1) 创建视图(省略视图列名) 创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp1,要求列出供应零件的编号、零件名称、可用数量、零售价格、供应价格和备注等信息。CREATE VIEW V_DLMU_PARTSUPP1 AS/*由SELECT子句目标列组成视图属性*/SELECT P.partkey,P.name,PS.availqty,P.retailprice,PS.supplycost,P.commentFROM Part P,PartSupp PS,Supplier SWHERE P.partkey=PS.partkey AND S.suppkey=PS.suppkey AND S.name='海大汽配'(2) 创建视图(不能省略列名的情况) 创建一个视图V_CustAvgOrder,按顾客统计平均每个订单的购买金额和零件数量,要求输出 顾客编号、姓名,平均购买金额和平均购买零件数量。CREATE VIEW V_CustAvgOrder(custkey,cname,avgprice,avgquantity) ASSELECT C.custkey,MAX(C.name),AVG(O.totalprice),AVG(L.quantity)FROM Customer C,Orders O,Lineitem LWHERE C.custkey=O.custkey AND L.orderkey=O.orderkeyGROUP BY C.custkey;(3) 创建视图(WITH CHECK OPTION) 使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp2,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证WITH CHECK OPTION是否起作用。CREATE VIEW V_DLMU_PartSupp2ASSELECT partkey,suppkey,availqty,supplycostFROM PartSuppWHERE suppkey=(SELECT suppkey FROM Supplier WHERE name='海大汽配')WITH CHECK OPTION;INSERT INTO V_DLMU_PartSupp2VALUES (58889,5048,704,77760);UPADTE V_DLMU_PartSupp2SET supplycost=12WHERE suppkey=58889;DELETE FROM V_DLMU_PartSupp2WHERE suppkey=58889;(4) 可更新的视图(行列子集视图) 使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp4,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证该视图是否是可更新的,并比较上述“(3)创建视图”实验任务与本任务结果有何异同。CREATE VIEW V_DLMU_PartSupp3AS SELECT partkey,suppkey,availqty,supplycostFROM PartSuppWHERE suppkey=(SELECT suppkeyFROM SupplierWHERE name='海大汽配'); INSERT INTO V_DLUM_PartSupp3VALUES(58889,5048,704,77760);UPDATE V_DLMU_PartSupp3SET supplycost=12WHERE suppkey=58889;DELETE FROM V_DLMU_PartSupp3WHERE suppkey=58889;(5)可更新的视图INSERT INTO V_CustAvgOrderVALUES(,NULL,20,2000);(6) 删除视图(RESTRICT/CASCADE) 创建顾客订购零件明细视图V_CustOrd,要求列出顾客编号、姓名、购买零件数、金额,然后在该视图的基础上,在创建(2)的视图V_CustAvgOrder,然后使用RESTRICT选项和CASCADE选项删除视图V_CustOrd。CREATE VIEW V_CustOrd(custkey,cname,qty,extprice)ASSELECT C.custkey,C.name,L.quantity,L.extendedpriceFROM Customer C,Order O,Lineitem LWHERE C.custkey=O.custkey AND O.orderkey=L.orderkey;CREATE VIEW V_CustAvgOrder(custkey,cname,avgqty,avgprice)ASSELECT custkey,MAX(cname),AVG(qty),AVG(extprice)FROM V_CustOrd/*在视图V_CustOrd上再创建视图*/GROUP BY custkey;DROP VIEW V_CustOrd RESTRICT;DROP VIEW V_CustOrd CASCADE;6、 索引(1) 创建唯一索引 在零件表的零件名称字段上创建唯一索引。CREATE UNIQUE INDEX Idx_part_name ON Part(name);(2) 创建函数索引(对某个属性的函数创建索引,称为函数索引) 在零件表的零件名称字段上创建一个零件名称长度的函数索引。CREATE INDEX Idx_part_name_fun ON Part(LENGTH(name);(3)创建复合索引(对两个及两个以上的属性创建索引,称为复合索引) 在零件表的制造商和品牌两个字段上创建一个复合索引。CREATE UNIQUE INDEX Idx_part_mfgr_brand ON Part(mfgr,brand);(4) *创建聚簇索引 在零件表的制造商字段上创建一个聚簇索引。CREATE UNIQUE INDEX Idx_part_mfgr ON Part(mfgr);CLUSTER Idx_part_mfgr ON Part;(5) 创建Hash索引 零件表的名称字段上创建一个Hash索引。CREATE INDEX Idx_part_name_hash ON Part USING HASH(name);(6) 修改索引名称 修改零件表的名称字段上的索引名。ALTER INDEX Idx_part_name_hash RENAME TO Idx_part_name_hash_new;(7)分析某个SQL查询语句执行时是否使用了索引EXPLAIN SELECT * FROM part WHERE name='零件'(8) *验证索引效率 创建一个函数TestIndex,自动计算sql查询执行的时间。 CREATE FUNCTION TestIndex(p_part_name CHAR(55) RETURN INTEGER AS/*自定义函数TestIndex():输入参数为零件名称,返回SQL查询的执行时间*/ DECLARE begintime TIMESTAMP; endtime TIMESTAMP; durationtime INTEGER; BEGN SELECT CLOCK_TIMESTAMP() INTO begintime;/*记录查询执行的开始时间*/ PERFORM *FROM Part WHERE name=p_partname;/*执行SQL查询,不保存查询结果*/ SELECT CLOCK_TIMESTAMP() INTO endtime; SELECT DATEDIFF(ms,begintime,endtime) INTO durationtime; RETURN durationtime;/*计算并返回查询执行时间,时间单位为毫秒ms*/ END; /*查看当零件表Part数据模型比较小,并且无索引时的执行时间*/ SELECT TestIndex(零件名称); INSERT INTO Part/*不断倍增零件表的数据,直到50万条记录*/ SELECT partkey+(SELECT COUNT(*) FROM Part), Name,mfgr,brand,type,size,container,retailprice,comment FRPM Part;/*查看当零件表Part数据模型比较大,但无索引时的执行时间*/SELECT TestIndex(零件名称);CREATE INDEX part_name ON Part(name);/*在零件表的零件名称字段上创建索引*/*查看零件表Part数据规模比较大,有索引时的执行时间*/SELECT TestIndex();四、实验心得通过本次实验,我知道只有正确理解数据库模式结构,才能正确设计数据库查询。连接查询是数据库sql查询中最重要的查询,连接查询的设计要特别注意,不同的查询表达,其查询执行的性能会有很大差别。正确地设计和执行数据更新语句,确保正确地录入数据和更新数据,才能保证查询的数据正确。当数据更新失败时,一个主要原因是更新数据时违反了完整性约束。实验项目名称:安全性语言实验 实验学时: 2 同组学生姓名: 孟陈、陈晓雪、季佰军 实验地点: 1318 实验日期: 5.26 实验成绩: 批改教师: 批改时间: 一、 实验目的1、 掌握自主存取控制缺陷的定义和维护方法。2、 掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。二、 实验内容和要求1、 定义用户、角