问答题 设在SQL Server 2008某数据库中建有图书表和销售表,两个表的定义如下:
CREATE TABLE图书表(
书号char(10)PRIMARY KEY,
书名varchar(40),
图书类别varchar(20),
进价int);
CREATE TABLE销售表(
书号char(10)REFERENCES图书表(书号),
销售时间datetime,
销售数量int,
售价int,
PRIMARY KEY(书号,销售时间));
现要创建一个存储过程:查询指定类别的每种图书在当前年累计销售总数量。请补全下列代码。
CREATE PROC p_TotalSales
@lb varchar(20)
AS
SELECT 书名,
(
SELECT ______
FROM销售表t1
WHERE ______ and
year(销售时间)=year(______)
)AS销售总数量
FROM图书表t2 WHERE ______
【正确答案】
【答案解析】第一空:SUM(销售数量)
第二空:t1.书号=t2.书号或t2.书号=t1.书号
第三空:Getdate()
第四空:t2.图书类别=@lb [解析] ①整个SELECT语句的含义是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。
②该题中“SELECT ______ FROM销售表t1 WHERE ______ and year(销售时间)=year(______)”是个嵌套,计算销售总数量。
③语句执行过程:
·先从图书表中按照第二个WHERE子句形成一个初步查询结果。由于只有图书表中有“图书类别”字段,因此可知第四空填写:t2.图书类别=@lb(t2是图书表的别名,t1是销售表的别名)。由此可知该步是按给定“图书类别”查询。
·计算销售总数量语句应该在第一步的基础上求某年的总量。因此可以推断第三空是获得销售时间语句。因此该空填写Getdate()。由于是在第一步基础上的查询,所以应该实行连表查询,第二空应该填写连接的条件,即t1.书号=t2.书号或t2.书号=t1.书号。
·第一空应该是求总量的语句,即SUM(销售数量)。