一.创建满足如下的表(16分)
1. 图书表(TShB)包括如下字段:
书号(ShH):普通编码定长字符型,6位长,主码
书名(ShM):普通编码可变长字符型,20位长,非空
价格(JG):定点小数,整数部分3位,小数部分1位
出版日期(ChBRQ):小日期时间型,大于1980年1月1日
create table TShB(
ShH char(6) primary key,
ShM varchar(20) not null,
JG numeric(4,1),
ChBRQ smalldatetime check(ChBRQ>'1980/1/1')
)
2. 书店表(ShDB)包括如下字段:
书店号(ShDH):普通编码定长字符型,4位长,主码
店名(DM) :普通编码可变长字符型,20位长,
地址(DZ):普通编码可变长字符型,20位长,
电话(DH):普通编码定长字符型,6位长,每一位必须是0-9数字
create table ShDB(
ShDH char(4) primary key,
DM varchar(20),
DZ varchar(20),
DH char(6) check(DH like '[0-9][0-9][0-9][0-9][0-9][0-9]')
)
3. 销售表(XShB)包括如下字段:
书号(ShH):普通编码定长字符型,6位长,非空
书店号(ShDH):普通编码定长字符型,4位长,非空
销售日期(XShRQ):小日期时间型,非空
销售数量(XSSL):小整型,允许空,大于0
其中:(书号,书店号,销售日期)为主码
书号为引用图书表的外码,书店号为引用书店表的外码。
create table XShB(
ShH char(6) not null,
ShDH char(4) not null,
XShRQ smalldatetime not null,
XSSL smallint check(XSSL>0),
primary key(ShH, ShDH, XShRQ),
foreign key(ShH) references TShB(ShH),
foreign key(ShDH) references ShDB(ShDH)
)
二. 写出实现如下要求的SQL语句。 (35分)
1. 查询1999年以后出版的价格在20到30之间的图书的书名。
SELECT ShM FROM TShB WHERE JG BETWEEN 20 AND 30 AND
YEAR(ChBRQ)>1999
2. 查询书店名为“海淀图书城”的书店所销售的图书的书名和图书的销售日期,
并对销售日期进行如下处理:如果销售日期早于1999年,则显示’早期’;
如果销售日期在1999到2003年之间,则显示’中期’; 如果销售日期晚于2003年,则显示’近期’。
SELECT ShM,CASE
WHEN YEAR(XShRQ) < 1999 THEN '早期'
WHEN YEAR(XShRQ) BETWEEN 1999 AND 2003 THEN '中期'
WHEN YEAR(XShRQ) > 2003 THEN '近期'
END
FROM ShDB a join XShB b on a.ShDH = b.ShDH
join TShB c on b.ShH=C.ShH
WHERE DM = '海淀图书城'
3. 查询2002年6月1日之后每种图书的销售情况,要求列出图书的书号、销售总量,
并且只列出销售总量前三名的情况。
SELECT TOP 3 ShH,SUM(XSSL) FROM XShB
WHERE XShRQ > '2002/6/1'
GROUP BY ShH
ORDER BY SUM(XSSL) DESC
4. 查询每个书店的图书销售总额,要求只列出销售总额高于1000的书店的店号和销售总额,
并将查询结果按销售总额从高到底排列。
SELECT ShDH,SUM(JG*XSSL) FROM XShB a JOIN TShB b
on a.ShH=b.ShH
GROUP BY ShDH
HAVING SUM(JG*XSSL) > 1000
Order by SUM(JG*XSSL) desc
5. 查询价格高于总平均价格的图书的书名。
SELECT ShM FROM TShB
WHERE JG >(SELECT AVG(JG) FROM TShB)
5.删除1990年之前的全部销售记录。
DELETE FROM XShB
WHERE YEAR(XShRQ )< 1990
6. 将书号为‘B10’,书名为‘计算机基础’的图书记录插入到图书表中。
INSERT INTO TShB(ShH,ShM) VALUES('b10','计算机基础')
7.将书店名为“西单”的书店所销售的图书的价格增加5%。
UPDATE TShB SET JG = JG + JG* 0.05
FROM TShB a JOIN XShB b on a.ShH = b.ShH
JOIN ShDB c on c.ShDH = b.ShDH
WHERE DM='西单'
三.建立统计指定书名的图书的销售次数的存储过程,要求书名为输入参数,统计结果为输出参数。(10分)
CREATE PROC P1
@X CHAR(20),@Y INT OUTPUT
AS
SELECT @Y=COUNT(*) FROM XShB a JOIN TShB b on a.ShH = b.ShH
where ShM=@X
四.建立限制销售数量不能超过100的触发器。(9分)
CREATE TRIGGER T1
ON XShB FOR INSERT,UPDATE
AS
IF EXISTS(SELECT * FROM INSERTED WHERE XSSL>100)
ROLLBACK