应用题
2. 设在SQL Server 2008某数据库中有商品表和销售表,表的定义如下:
CREATE TABLE 商品表(
商品号 char(10) PRIMARY KEY,
商品名 char(20),
类别 char(10),
进货单价 int)
CREATE TABLE 销售表(
商品号 char(10),
销售时间 datetime,
销售数量 int,
销售单价 int,
PRIMARY KEY(商品号,销售时间),
FOREIGN KEY(商品号) REFERENCES 商品表(商品号))
现要创建一个具有如下功能的存储过程:查询指定类别的每个商品的商品号和销售总利润,包括没有被销售过的商品(未被销售过的商品的利润为0)。请补全下列代码。
CREATE ______ p_Profit
@lb char(10)
AS
SELECT 商品表.商品号,
CASE
WHEN 销售表.商品号 ______ THEN 0
ELSE ______((销售单价-进货单价) * 数量)
END AS 销售总利润
FROM 商品表 ______ JOIN 销售表 ON 商品表.商品号=销售表.商品号
WHERE 类别 =______
GROUP BY ______
【正确答案】PROC或PROCEDURE
IS NULL
SUM
OUTER
@lb
商品表.商品号
【答案解析】 本题考查的是存储过程的使用。创建存储过程的语法:
CREATE { PROC |PROCEDURE}存储过程名[{@存储过程参数 参数类型]}[=默认值][OUT|OUTPUT]
AS
SQL语句
对比语法可知第一个空处应填写:PROC或PROCEDURE。
在数据库中未被销售的产品是空的,用NULL标识。题目要求“未被销售过的商品的利润为0”表示,在存储过程中,第二个空后面有0,可以推断出第二个空处作用是用来处理“未被销售过的商品的利润为0”功能的。根据语法规则,该处应该填写:IS NULL。
题目要求是求商品的总利润,SQL语句中求和是SUM()函数,因此第三个空处应该填写:SUM。
内联接(INNER JOIN):主表和从表都存在的记录才会查出来;外联接(OUTER JOIN)如果主表中存在的记录,从表中不存在则用NULL替代,根据题目特点,外链接符合题目要求,故第四个空处应填写:OUTER。
题目要求是指定的商品类别,因此商品类别需要通过变量输入,故第五个空处应填写:@lb。
题目要求是“查询指定类别的每个商品的商品号”,因此分组的依据应该是商品表中的商品号,故第六个空处应填写:商品表.商品号。