2024年3月20日发(作者:)
实验三解释
(4)查询作者名长度大于等于8的图书信息,显示书名(BookName)及作者(Author)。
结果如图2.13。
解析:字符串长度可以使用SQL支持的字符串长度函数Len(s)判断,或者使用通配符来判断,
“_”代表任意单个字符;“%”代表任意长度的字符串。
(5)统计订单表Order中每个客户的订单总额并对购买力给出评价,评价规则:订单总额
大于等于200为 “强”;订单总额大于等于100且小于200为“较强”; 订单总额大于等于
50且小于100为“一般”; 订单总额小于50为“较弱”。结果如图2.14。
解析:T-SQL语言提供了一些流程控制语句,使得对数据库中数据的检索、更新、插入等操
作更加方便和容易。本题使用Case语句判断查询结果情况,显示不同的说明。
(6)查询客户号(CustomerCode)为“1201”的客户是否订购过图书,若已订购则显示订
购总金额;否则显示:“没有订购图书”。结果如图2.15。
解析:本题需要先定义变量,利用变量存放查询结果,然后使用if语句判断变量值,决定
显示输出内容。
局部变量由用户定义和使用,其名称前有一个@符号。其定义格式如下:
DECLARE @局部变量名 数据类型
可以使用SET或SELECT语句给变量赋值。其基本语法格式如下:
SET @局部变量名=表达式
SELECT @局部变量名=表达式
5.实现以下含有多表联接查询的SELECT语句。
(1)查询所有客户的用户等级(VIPClass),要求显示客户号(CustomerCode)、客户名
(Name)、用户等级(VIPClass)和评价时间(EvaluateDate)。结果如图2.16。
解析:INNER JOIN(内联接):查询结果仅包含两个表中每对联结匹配的行。内联接是系
统默认的,可以将关键字INNER省略。注意查询字段中两个表的共同字段需要指明表名,
格式为表名.字段名。多表查询也可以使用Where子句表达表间的连接关系。推荐使用JOIN
表达方式。
本题查询涉及Customer和CustomerEvaluation两个表。
(2)查询图书“神曲”的销售总量及销售总额,结果如图2.17所示。
解析:本实验查询涉及的数据表有3个,形成联接嵌套。多表联接嵌套有两种表示方法,一
种是依次写表的联接和联接关系的说明;另一种是首先写所有表的联接,再写联接关系,这
时要注意,联接关系要从后向前写。
(3)查询客户“刘炎林” 的所有订单信息。要求显示订单号(OrderCode)、图书名
(BookName)、册数(Amount)、单价(Price)和总价(Amount×Price)及订购时间,并
按总价升序排列,结果如图2.18。
解析:本实验查询涉及的数据表有4个,形成联接嵌套。
(4)查询所有客户的购书情况,显示客户号(CustomerCode)、客户名(Name)和订单号
(OrderCode)、购书时间(OrderTime)。结果如图2.19所示。
解析:LEFT OUTER JOIN(左外联接):查询结果除了包含两张表中符合联接条件的记录外,
还包含左表(写在关键字LEFT OUTER JOIN左边的表)中不符合联接条件、但符合WHERE
条件的全部记录。
(5)查询所有图书的销售情况。要求显示图书号(BookCode)、图书名(BookName)以及
相应的销售总量。结果如图2.20。
解析:RIGHT OUTER JOIN(右外联接):查询结果除了包含两张表中符合联接条件的记录,
还包含右表(写在关键字RIGHTT OUTER JOIN右边的表)中不符合联接条件、但符合
WHERE条件的全部记录。
6.使用SELECT语句复制数据表。
(1)将客户名(Name)、所购图书名(BookName)及购书数量(Amount)复制到新表
CustomerBuyBook中。
解析:在SELECT查询语句中的字段名后加上INTO 表名可将查询结果复制到一张新表中。
8.使用UPDATE语句修改数据表中字段值
(3)修改CustomerEvaluation表,将2008年以前(不包括2008年)注册的、用户等级为
“D”的客户用户等级(VIPClass)修改为“C”,评价时间(EvaluateDate)取当前时间。
解析:本题修改CustomerEvauation表,在Where子句中可使用子查询来查询Customer表获
得2008年以前注册的、用户等级为“D”的客户号;当前时间可使用GetDate()函数获得。
参考语句:
Update CustomerEvaluation Set VIPClass='C', EvaluateDate=GetDate()
Where VIPClass='D' AND CustomerCode IN (Select CustomerCode From Customer Where
Year(LoginDate)<2008)
(4)根据订单详细信息表OrderDetail中的购书数量和图书表Book中的价格和折扣信息汇
总计算的总价,修改Order表中订单号为“08110801”的TotalPrice。
解析: 本题在Update语句中使用汇总查询获得订单号为“08110801”的总价。
Update [Order] Set TotalPrice=(Select Sum(**nt)
From OrderDetail Join [Order] On ode=[Order].OrderCode
Join Book On [OrderDetail].BookCode=de
Group By [Order].OrderCode
Having [Order].OrderCode='08110801')
Where [Order].OrderCode='08110801'
(5)修改CustomerEvaluation表,将消费总额(TotalPrice)在100至200元之间的客户用
户等级(VIPClass)修改为“B”。
解析:本实验通过子查询获得消费金额在100到200之间的客户代码。然后将这些客户的信
用等级VIPClass改为“B”。
参考语句:
Update CustomerEvaluation Set VIPClass='B'
Where CustomerCode IN
(Select CustomerCode From [Order]
Group By CustomerCode
Having Sum(TotalPrice) Between 100 And 200)
9.使用DELECT语句删除记录
(2)删除CustomerBuyBook表中购书数量(Amount)小于7的记录。
参考语句:
Delete From
CustomerBuyBook
Where Amount<7
注意:CustomerBuyBook表是6.(1)建立的表。
(3)删除CustomerClass表中姓“刘”和姓“杨”的记录。
解析:LIKE用来指定字段的值是否包含在给定的字符串中。通配符“_”表示任意单个字
符;“%”表示包含零个或更多字符的任意字符串。也可以使用SQL语言支持的字符串函数
Left(s,n)获得字符串的首个字符;[]指定范围(如:[1-9])或集合(如:[abcdefg])中任何单
个字符。
(4)删除CustomerEvaulation表中没有购买过书的客户评价记录。
解析:本题使用子查询从Order表获得所有购买过书的客户号,并使用Not In运算找到没
买过书的客户号。
参考语句:
DELETE FROM
CustomerEvaluation
WHERE CustomerCode Not In (Select Distinct CustomerCode From [Order])


发布评论