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])