SQL Server 实践题库:借阅管理系统设计与实现

需积分: 10 18 下载量 177 浏览量 更新于2025-01-05 收藏 34KB DOC 举报
SQL Server 练习题3 本资源摘要信息将围绕 SQL Server 练习题3,涵盖了十五个处理,包括建立BORROW表、查询借书超过5本的读者、查询借阅了"水浒"一书的读者、查询过期未还图书、查询书名包括"网络"关键词的图书等多个方面的知识点。 1. 建立BORROW表 创建BORROW表的SQL语句如下所示: ```sql CREATE TABLE BORROW ( CNO INT, BNO INT, RDATE DATE, PRIMARY KEY (CNO, BNO), FOREIGN KEY (CNO) REFERENCES CARD(CNO), FOREIGN KEY (BNO) REFERENCES BOOKS(BNO) ); ``` 这个表的主码是(CNO, BNO),它组合了借书卡号和书号。同时,这个表还定义了两个外键,分别引用CARD表的CNO列和BOOKS表的BNO列,以确保借书记录的完整性。 2. 找出借书超过5本的读者 为了找出借书超过5本的读者,可以使用以下SQL语句: ```sql SELECT CNO, COUNT(*) AS BorrowCount FROM BORROW GROUP BY CNO HAVING COUNT(*) > 5; ``` 这个语句使用了GROUP BY子句对借书记录进行分组,然后使用HAVING子句来过滤出借书超过5本的读者。 3. 查询借阅了"水浒"一书的读者 要查询借阅了"水浒"一书的读者,可以使用以下SQL语句: ```sql SELECT C.NAME, C.CLASS FROM CARD C JOIN BORROW B ON C.CNO = B.CNO JOIN BOOKS BK ON B.BNO = BK.BNO WHERE BK.BNAME = '水浒'; ``` 这个语句使用了JOIN子句来连接CARD、BORROW和BOOKS三个表,然后使用WHERE子句来过滤出借阅了"水浒"一书的读者。 4. 查询过期未还图书 要查询过期未还图书,可以使用以下SQL语句: ```sql SELECT B.CNO, B.BNO, B.RDATE FROM BORROW B WHERE B.RDATE < GETDATE(); ``` 这个语句使用了WHERE子句来过滤出过期未还图书。 5. 查询书名包括"网络"关键词的图书 要查询书名包括"网络"关键词的图书,可以使用以下SQL语句: ```sql SELECT BNO, BNAME, AUTHOR FROM BOOKS WHERE BNAME LIKE '%网络%'; ``` 这个语句使用了LIKE子句来过滤出书名包括"网络"关键词的图书。 6. 查询现有图书中价格最高的图书 要查询现有图书中价格最高的图书,可以使用以下SQL语句: ```sql SELECT TOP 1 BNAME, AUTHOR FROM BOOKS ORDER BY PRICE DESC; ``` 这个语句使用了ORDER BY子句来对图书按照价格进行排序,然后使用TOP子句来选择最高价格的图书。 7. 查询当前借了"计算方法"但没有借"计算方法习题集"的读者 要查询当前借了"计算方法"但没有借"计算方法习题集"的读者,可以使用以下SQL语句: ```sql SELECT CNO FROM BORROW WHERE BNO IN ( SELECT BNO FROM BOOKS WHERE BNAME = '计算方法' ) AND CNO NOT IN ( SELECT BNO FROM BOOKS WHERE BNAME = '计算方法习题集' ) ORDER BY CNO DESC; ``` 这个语句使用了IN子句和NOT IN子句来过滤出符合条件的读者,然后使用ORDER BY子句来对结果进行排序。 8. 将"C01"班同学所借图书的还期都延长一周 要将"C01"班同学所借图书的还期都延长一周,可以使用以下SQL语句: ```sql UPDATE BORROW SET RDATE = DATEADD(DAY, 7, RDATE) FROM BORROW JOIN CARD ON BORROW.CNO = CARD.CNO WHERE CARD.CLASS = 'C01'; ``` 这个语句使用了UPDATE子句来更新BORROW表的RDATE列,然后使用JOIN子句来连接BORROW和CARD表,以便过滤出"C01"班同学所借图书。 9. 从BOOKS表中删除当前无人借阅的图书记录 要从BOOKS表中删除当前无人借阅的图书记录,可以使用以下SQL语句: ```sql DELETE FROM BOOKS WHERE BNO NOT IN ( SELECT BNO FROM BORROW ); ``` 这个语句使用了NOT IN子句来过滤出当前无人借阅的图书记录,然后使用DELETE子句来删除这些记录。 10. 如果经常按书名查询图书信息,请建立合适的索引 要建立合适的索引,可以使用以下SQL语句: ```sql CREATE INDEX IX_BOOKS_BNAME ON BOOKS(BNAME); ``` 这个语句使用了CREATE INDEX子句来建立索引,以便加速书名查询。 11. 在BORROW表上建立一个触发器 要在BORROW表上建立一个触发器,可以使用以下SQL语句: ```sql CREATE TRIGGER TR_BORROW_ON_INSERT ON BORROW AFTER INSERT AS BEGIN IF EXISTS ( SELECT 1 FROM inserted WHERE BNAME = '数据库技术及应用' ) BEGIN INSERT INTO BORROW_SAVE (CNO, BNO, RDATE) SELECT CNO, BNO, RDATE FROM inserted; END END; ``` 这个语句使用了CREATE TRIGGER子句来建立触发器,以便在读者借阅"数据库技术及应用"时保存借阅记录。 12. 建立一个视图 要建立一个视图,可以使用以下SQL语句: ```sql CREATE VIEW VW_STUDENT_BORROW AS SELECT C.NAME, BK.BNAME FROM CARD C JOIN BORROW B ON C.CNO = B.CNO JOIN BOOKS BK ON B.BNO = BK.BNO WHERE C.CLASS = '力01'; ``` 这个语句使用了CREATE VIEW子句来建立视图,以便显示"力01"班学生的借书信息。 13. 查询当前同时借有"计算方法"和"组合数学"两本书的读者 要查询当前同时借有"计算方法"和"组合数学"两本书的读者,可以使用以下SQL语句: ```sql SELECT CNO FROM BORROW WHERE BNO IN ( SELECT BNO FROM BOOKS WHERE BNAME IN ('计算方法', '组合数学') ) GROUP BY CNO HAVING COUNT(DISTINCT BNO) = 2 ORDER BY CNO ASC; ``` 这个语句使用了IN子句和GROUP BY子句来过滤出符合条件的读者,然后使用HAVING子句来过滤出同时借有两本书的读者。 14. 为BOOKS表追加定义主码 要为BOOKS表追加定义主码,可以使用以下SQL语句: ```sql ALTER TABLE BOOKS ADD CONSTRAINT PK_BOOKS_BNO PRIMARY KEY (BNO); ``` 这个语句使用了ALTER TABLE子句来追加定义主码。 15. 对CARD表做如下修改 要对CARD表做如下修改,可以使用以下SQL语句: ```sql ALTER TABLE CARD ALTER COLUMN NAME VARCHAR(10); ALTER TABLE CARD ADD COLUMN DEPT VARCHAR(20); ``` 这个语句使用了ALTER TABLE子句来修改CARD表的NAME列和添加新的DEPT列。