您好,欢迎访问三七文档
实验三高级查询1实验目的(1)掌握SQL的高级查询的使用方法,如分组统计、嵌套查询、集合查询等等。2实验内容2.1掌握SQL高级查询使用方法(1)分组统计。(2)嵌套查询,包括IN查询、EXISTS查询。(3)集合查询。3实验要求(1)深入复习教材第三章SQL有关高级查询语句。(2)根据书上的例子,针对TPCH数据库模式设计分组统计查询、嵌套查询(IN、EXISTS)语句和集合查询语句,每种类型的基本查询至少要设计一个查询,描述清楚查询要求,运行你所设计的查询语句,并截图相应的实验结果,每幅截图并要有较为详细的描述。也可以按照附2所列示例查询做实验。(3)实验步骤和实验总结中要详细描述实验过程中出现的问题、原因和解决方法。4实验步骤4.1掌握SQL高级查询使用方法(1)不带分组过滤条件的分组统计查询。统计每个顾客订购金额。SELECTSUM(TOTALPRICE),custkeyFROMORDERSGROUPBYCUSTKEY(2)带分组过滤条件的分组统计查询。查询平均每个订单金额超过1000元的顾客编号及其姓名。SELECTCUSTKEY,NAMEFROMcustomerWHEREcustkeyIN(SELECTcustkeyFROMORDERSGROUPBYCUSTKEYHAVINGAVG(TOTALPRICE)1000)(3)IN嵌套查询。查询订购了“海大”制造的“船舶模拟驾驶舱”的顾客。SELECT*FROMcustomerCWHEREC.CUSTKEYIN(SELECTO.CUSTKEYFROMORDERSO,PARTSUPP1PS,SUPPLIERS,PARTP,lineitemLWHERES.NAME='海大'ANDP.NAME='船舶模拟驾驶舱'ANDP.PARTKEY=L.PARTKEYANDL.SUPPKEY=S.SUPPKEY)(4)单层EXISTS嵌套查询。查询没有购买过“海大”制造的“船舶模拟驾驶舱”的顾客。SELECT*FROMCUSTOMERWHERENOTEXISTS(SELECT*FROMPARTP,SUPPLIERS,LINEITEML,ORDERSOWHEREP.NAME='船舶模拟驾驶舱'ANDS.NAME='海大'ANDL.PARTKEY=P.PARTKEYANDS.SUPPKEY=L.SUPPKEYANDL.ORDERKEY=O.ORDERKEYANDO.CUSTKEY=CUSTOMER.CUSTKEY)(5)双层EXISTS嵌套查询。查询至少购买过顾客“张三”购买过的全部零件的顾客姓名。SELECTNAMEFROMcustomerWHEREcustomer.NAMEIN(SELECTDISTINCTO1.CUSTKEYFROMordersO1,lineitemL1WHEREo1.orderkey=L1.orderkeyANDNOTEXISTS(SELECT*FROMlineitemL2,ordersO2WHEREO2.orderkey=L2.orderkeyANDNOTEXISTS(SELECT*FROMlineitemL3,ordersO3,CUSTOMERC2WHEREL2.partkey=L3.partkeyANDC2.custkey=O2.custkeyANDO3.CUSTkey=O1.CUSTkeyANDO3.orderkey=L3.orderkeyandC2.name='张三')))(6)集合查询(交、并、差各设计一个)。查询顾客“张三”和“李四”都订购过的全部零件的信息。查询顾客“张三”和“李四”订购的全部零件的信息。顾客“张三”订购过,而“李四”没订购过的零件的信息。SELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='张三'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))INTERSECTSELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='李四'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))SELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='张三'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))UNIONSELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='李四'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))SELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='张三'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))EXCEPTSELECT*FROMPARTWHEREPARTKEYIN(SELECTPARTKEYFROMLINEITEMWHEREORDERKEYIN(SELECTORDERKEYFROMORDERSO,CUSTOMERCWHEREC.NAME='李四'ANDC.CUSTKEY=O.CUSTKEYANDLINEITEM.ORDERKEY=O.ORDERKEYANDPART.PARTKEY=LINEITEM.PARTKEY))(7)FROM子句中的嵌套查询查询平均每个订单金额超过1万元的顾客中属于中国的顾客信息。SELECT*FROMCUSTOMERWHERECUSTKEYIN(SELECTCUSTKEYFROMORDERSGROUPBYCUSTKEYHAVINGAVG(TOTALPRICE)10000)INTERSECTSELECT*FROMCUSTOMERWHERENATIONKEYIN(SELECTnationkeyFROMnationWHERENAME='CHINA')5总结与体会5.1实验中出现的问题及其解决方案1、因为时间比较长,很多东西记忆已经模糊了。分组查询内容不多,复习起来比较容易,但嵌套查询因为本身难度比较大,在实际编代码是话费了很长时间。索性这次难度还不是特别大,经过紧张的复习,我还是很快的编完了代码。2、建表的难度较上一次比较大,因为需要查询的东西很多,因此查询难度很大不过经过紧张的输入数据,还是很快的把表建好了。3、对SOL.SERVE本身不太熟悉。尝试了很多次,终于把一些重要的东西弄明白了。5.2总结GROUPBY子句本身难度不大,只要用的时间足够,可以很好的编出来。难度体现在嵌套查询上。还好这次的实验次数不多,并没有花费很长时间。5.3体会嵌套虽然理解起来很困难而且代码非常繁琐,但是恰当的运用嵌套查询可以提高效率,当数据量很大时嵌套查询用很大的作用。总之合理运用嵌套查询会提生程序运行效率。
本文标题:数据库实验3
链接地址:https://www.777doc.com/doc-1916066 .html