1、广 东 海 洋 大 学 学 生 实 验 报 告 书实验名称 实验四:使用子查询 课程名称 数据库原理与应用 成绩学院(系) 专业 班级学生姓名 学号 实验地点 实验日期一、 实验目的1. 掌握带谓词 IN 的子查询;2. 掌握带存在量词的子查询;3. 掌握使用比较运算符的子查询;4. 掌握使用限量谓词的子查询;5. 综合运用所学知识实现查询;6. 掌握 SELECT INTO 语句;二、实验内容完成在,GlobalToyz 数据库基础上的操作,按要求完成给出的下列题目,要求写出相应数据库的 T-SQL 语句。1. 将Texas州的订购者(Shopper)信息拷贝到一张全局临时表中(表名自定义)
2、。2. 查询截止日期(dExpiryDate)在 2001 年 5 月的订购者(Shopper)的姓名和所在城市。3. 根据玩具品牌统计每种品牌的平均价格,输出其中平均价格最高的品牌 ID 以及平均价格。4. 检索每一类(类别用 cCategoryId 表示)玩具里价格最高的玩具的名称。5. 检索单价最高的玩具的品牌(品牌为 Brand)名称。6. 要求必须用带 EXISTS 量词的嵌套查询实现,检索和David Cooper住在同一个州的订购者(Shopper)的姓和名。7. 检索订购玩具数量在 3 个或 3 个以上的订单号。(Orderdetail 表的 siQty 表示数量)8. 检索和
3、Lisa Lee使用同一种类型的信用卡的订购者的人数。9. 检索订购了玩具品牌为Largo的订购者的姓和名。(多层嵌套查询实现)10.列出价格不低于所有品牌 ID 为005的玩具(要求显示玩具 ID 和名称)。11.检索曾订购过玩具表中所有玩具的订购者名单。12.创建数据库 Employee,其中包含一个主文件,一个辅文件,两个日志文件组成。三、实验过程1.SELECT *INTO #TexasShopperFROM ShopperWHERE cState=TexasGDOU-B-11-1122.SELECT vFirstName+ +vLastName AS ClientName,cCity
4、FROM ShopperWHERE dExpiryDate=2001-5-13.SELECT cBrandId,AVG(mToyRate) AS AvgToyRateFROM ToysGROUP BY cBrandIdHAVING AVG(mToyRate)= ALL(SELECT AVG(mToyRate)FROM ToysGROUP BY cBrandId)4.-自身连接SELECT vToyNameFROM Toys XWHERE mToyRate=(SELECT MAX(mToyRate)FROM Toys YWHERE X.cCategoryId=Y.cCategoryId)5.1S
5、ELECT cBrandNameFROM ToyBrandWHERE cBrandId IN(SELECT cBrandIdFROM ToysWHERE mToyRate IN(SELECT MAX(mToyRate)FROM Toys)5.2SELECT cBrandName FROM Toys t1, ToyBrand WHERE ToyBrand.cBrandId = t1.cBrandId GROUP BY cBrandName HAVING MAX(mToyRate)=ALL(SELECT MAX(mToyRate) FROM Toys t2 GROUP BY cBrandId)6.
6、SELECT vFirstName,vLastNameFROM Shopper XWHERE EXISTS(SELECT *FROM Shopper YWHERE Y.vFirstName=DavidAND Y.vLastName=Cooper AND X.cState=Y.cState) 7.SELECT cOrderNoFROM OrderDetailGROUP BY cOrderNoHAVING SUM(siQty)=38.SELECT COUNT(cShopperId) AS SumShopperFROM Shopper WHERE vCreditCardType IN(SELECT
7、vCreditCardTypeFROM ShopperWHERE vFirstName=LisaAND vLastName=Lee)9.SELECT vFirstname,vLastNameFROM ShopperWHERE cShopperId IN(SELECT cShopperIdFROM OrdersWHERE cOrderNo IN(SELECT cOrderNoFROM OrderDetailWHERE cToyId IN(SELECT cToyIdFROM ToysWHERE cBrandId IN(SELECT cBrandIdFROM ToyBrandWHERE cBrand
8、Name=Largo)10.SELECT cToyId,vToyNameFROM ToysWHERE mToyRate=(SELECT MAX(mToyRate)FROM ToysWHERE cBrandId=005)11.1SELECT cOrderNo,Toys.cToyIdINTO #NEW1FROM OrderDetail,ToysWHERE OrderDetail.cToyId=Toys.cToyIdSELECT cOrderNo,COUNT(cToyId) AS SumToyIdINTO #NEW2FROM #NEW1GROUP BY cOrderNoSELECT vFirstNa
9、me,vLastNameFROM ShopperWHERE cShopperId IN(SELECT cShopperIdFROM Orders,#NEW2WHERE Orders.cOrderNo=#NEW2.cOrderNoAND #NEW2.SumToyId =(SELECT COUNT(DISTINCT cToyId)FROM TOYS)11.2SELECT vFirstName, vLastName FROM Shopper WHERE cShopperId IN( SELECT cShopperId FROM Orders WHERE cOrderNo =( SELECT cOrd
10、erNoFROM OrderDetail GROUP BY cOrderNoHAVING COUNT(DISTINCT cToyId)=(SELECT COUNT(DISTINCT cToyId)FROM Toys)12.CREATE DATABASE EmployeeONPRIMARY(NAME = Employee1,FILENAME = D:课程 数据库新建文件夹Emplpyee1.mdf ,SIZE = 100MB,MAXSIZE = 200,FILEGROWTH = 20),(NAME = Employee2,FILENAME = D:课程 数据库新建文件夹Employee2.ndf
11、 ),(NAME = Employee3,FILENAME = D:课程 数据库新建文件夹Employee3.ndf ),(NAME = Employee4,FILENAME = D:课程 数据库新建文件夹Employee4.ndf )LOG ON(NAME = Employlog1,FILENAME = D:课程 数据库新建文件夹Employeelog1.ldf,SIZE = 100MB,MAXSIZE = 200,FILEGROWTH = 20),(NAME = Employeelog2,FILENAME = D:课程 数据库新建文件夹Employeelog2.ldf,SIZE = 100
12、MB,MAXSIZE = 200,FILEGROWTH = 20);四、实验总结通过这次试验,我基本掌握了 SQL Server 的带谓词 IN 的子查询,带存在量词的子查询,使用比较运算符的子查询,掌握使用限量谓词的子查询, 对数据库的认识有了更深刻的理解,值得注意的是,第 5 题和第 11 题,第一种方法是我自己写的,第二种是网上的参考资料。5.1 是利用多层嵌套查询实现,5.2 是利用多表连接盒多层嵌套查询实现;11.1 建立的两个临时表,比较麻烦,11.2 则利用多层嵌套循环实现,思路一样,但 11.2 比较简明。这次实验对我以后的学习提供了很大的帮助,让我熟悉了数据库实现简单查询。指导教师 日期注:请用 A4 纸书写,不够另附纸。 第 页,共 页