一、书到用时方恨少:"图书-读者-借阅"类题目

1.1 本题目的表结构

  本题用到下面三个关系表:

  CARDS 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级

  BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数

  BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期

  备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。

1.2 基本建表语句

 create table CARDS
(
CNO int identity(1,1),
NAME nvarchar(50) not null,
CLASS nvarchar(100) not null,
constraint pk_cards primary key (CNO)
) create table BOOKS
(
BNO int identity(1,1),
BNAME nvarchar(255) not null,
AUTHOR nvarchar(50) not null,
PRICE decimal(8,1) not null,
QUANTITY int default 0,
constraint pk_books primary key (BNO)
) create table BORROW
(
CNO int not null,
BNO int not null,
RDATE datetime default GETDATE() not null,
constraint pk_borrow primary key (CNO,BNO),
constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO),
constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO)
)

1.3 插入测试数据

 insert into CARDS(NAME,CLASS) values('张三','计科一班')
insert into CARDS(NAME,CLASS) values('李四','计科一班')
insert into CARDS(NAME,CLASS) values('王五','计科二班')
insert into CARDS(NAME,CLASS) values('六四','计科二班')
insert into CARDS(NAME,CLASS) values('七七','软工一班')
insert into CARDS(NAME,CLASS) values('粑粑','软工二班') insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('水浒','施耐庵',188,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('计算机网络','谢希仁',49,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('计算方法','严蔚敏',58,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('计算方法习题集','殷人昆',188,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('数据库技术及应用','王珊',38,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('组合数学','周伟',28,3)
insert into BOOKS(BNAME,AUTHOR,PRICE,QUANTITY) values ('Redis初探','周旭龙',25,3) insert into BORROW(CNO,BNO) values(1,1)
insert into BORROW(CNO,BNO) values(2,1)
insert into BORROW(CNO,BNO) values(3,1) insert into BORROW(CNO,BNO) values(4,3)
insert into BORROW(CNO,BNO) values(4,6)
insert into BORROW(CNO,BNO) values(5,6)
insert into BORROW(CNO,BNO) values(7,7)

1.4 开始实战吧小宇宙

  (1)写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束

 create table BORROW
(
CNO int not null,
BNO int not null,
RDATE datetime default GETDATE() not null,
constraint pk_borrow primary key (CNO,BNO),
constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO),
constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO)
)

  (2)找出借书超过5本的读者,输出借书卡号及所借图书册数

 select b.CNO,COUNT(b.CNO) as 'BorrowCount'
from BORROW b
group by b.CNO
having COUNT(b.CNO)>=5

  这里测试数据里边没有借过5本的,但只要改为2,即可得到一条结果:

  (3)查询借阅了"水浒"一书的读者,输出姓名及班级

 select c.NAME,c.CLASS
from CARDS c,BORROW r,BOOKS b
where c.CNO=r.CNO and r.BNO=b.BNO and b.BNAME='水浒'

  (4)查询目前为止未还图书,输出借阅者(卡号)、书号及还书日期

 select CNO,BNO,RDATE
from BORROW
where RDATE<GETDATE()

  (5)查询书名包括"网络"关键词的图书,输出书号、书名、作者

 select b.BNO,b.BNAME,b.AUTHOR
from BOOKS b
where b.BNAME like '%网络%'

  (6)查询现有图书中价格最高的图书,输出书名及作者

 select BNAME,AUTHOR
from BOOKS
where PRICE=( SELECT MAX(PRICE) from BOOKS )

  (7)查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出

 select r.CNO
from BORROW r,BOOKS b
where r.BNO=b.BNO and b.BNAME='计算方法' and not exists
(
select * from BORROW r1,BOOKS b1
where r1.BNO=b1.BNO and r.CNO=r1.CNO and b1.BNAME='计算方法习题集'
)
order by r.CNO desc

  (8)将"计科一班"班同学所借图书的还期都延长一周

 --解法一
update BORROW set RDATE=DATEADD(Day,7,RDATE)
where CNO in ( select CNO from CARDS where CLASS='计科一班' )
--解法二
update b set b.RDATE=DATEADD(Day,7,RDATE)
from BORROW b,CARDS c
where b.CNO=c.CNO and c.CLASS='计科一班'

  (9)从BOOKS表中删除当前无人借阅的图书记录

 delete from BOOKS
where BNO not in
(
select distinct BNO from BORROW
)

  这里四本图书被删除,只剩下1,3,6这三本图书了。

  (10)如果经常按书名查询图书信息,请建立合适的索引

 create index index_books_bname on BOOKS(BNAME)

PS:关于索引,你必须了解的东东

①索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库

②索引的优点:大大加快数据的检索速度,这也是创建索引的最主要的原因;

③索引的缺点:索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;

  (11)在BORROW表上建立一个触发器,完成如下功能:

    -- 如果读者借阅的书名是"数据库技术及应用"
    -- 就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表)

 create trigger Tr_CopyToSave
on BORROW
for insert,update
as
if @@ROWCOUNT>=1
insert into BORROW_SAVE select i.BNO,i.CNO,i.RDATE
from inserted i,BOOKS b
where i.BNO=b.BNO and b.BNAME='数据库技术及应用'

PS:关于触发器,你必须了解的东东

①触发器是一种特殊类型的存储过程,对特定事件作出响应。触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程,一般用在较check约束更加复杂的约束上面。

②触发器有两个特殊的表:插入表instered表)和删除表deleted表)。这两张是逻辑表也是虚表。系统在内存中创建这两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

  (12)建立一个视图,显示"计科一班"班学生的借书信息(只要求显示姓名和书名)

 create view V_BorrowInfo_CS0801
as
select c.NAME,b.BNAME
from CARDS c,BOOKS b,BORROW r
where c.CNO=r.CNO and b.BNO=r.BNO and c.CLASS='计科一班'

PS:关于(View)视图,你必须了解的东东

(1)视图是从一个或几个基本表中根据用户需要而做成的一个虚表:①视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据;②视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户;

(2)视图的优点:①能分割数据,简化用户观点。②为数据提供一定的逻辑独立性(如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据);③提供自动的安全保护功能( 视图能像基本表一样授予或撤消访问许可权)

  (13)查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出

 select b.CNO
from BORROW b
where b.BNO in (select BNO from BOOKS where BNAME in ('计算方法','组合数学'))
group by b.CNO
having COUNT(b.BNO)=2
order by b.CNO

  (14)假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句

alter table BOOKS add primary key (BNO)

  (15)①将CARDS表中的NAME最大列宽增加到100个字符(原为50个字符)

alter table CARDS alter column NAME nvarchar(100)

      ②为CARDS表增加1列DEPTNAME(系名),可变长,最大50个字符

alter table CARDS add DEPTNAME nvarchar(50)

二、练习总结

  本篇是从Cat Qi的原文《SQL面试题(学生表-教师表-课程表-选课表)》中摘抄的,Part 1的链接点此访问。总体来说,Part 2本篇的题目难度没有Part 1的高,比较适合总结锻炼。最后,感谢Cat Qi总结的文章,让我可以从中实践并得到一点提高。后面,我会继续复习一下有关数据库的基础知识和练习一下数据库的其他方面的笔试面试题,到时如果有机会,还会总结成博客发布到我的园子。

参考原帖

  (1)Cat Qi,《SQL面试题(学生表-教师表-课程表-选课表)》:http://www.cnblogs.com/qixuejia/p/3637735.html

  (2)CSDN,《找些不错的SQL面试题》讨论帖,http://bbs.csdn.net/topics/280002741

  (3)逆心,《SQL Server 触发器》,http://www.cnblogs.com/kissdodog/p/3173421.html

  (4)JohnSoft工作室,《数据库视图定义及其相关操作》,http://www.cnblogs.com/GISDEV/archive/2008/02/13/1067817.html

 

SQL语句练习手册--第二篇的更多相关文章

  1. SQL语句练习手册--第一篇

    表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师 ...

  2. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  3. SQL语句练习手册--第四篇

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  4. SQL语句练习手册--第三篇

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  5. SQL语句优化方式--进阶篇

    MYSQL性能 最大数据量 抛开数据量和并发数,谈性能都是扯淡(扯的最疼的那种).Mysql没有限制单表最大记录数,它取决与操作系统对文件大小的限制 文件系统 单文件大小限制 FAT32(采用32位二 ...

  6. SQL语句汇总(终篇)—— 表联接与联接查询

    既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接. 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需 ...

  7. mysql基本sql语句大全(基础用语篇)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  8. mysql基本sql语句大全(提升用语篇)

    1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1(仅用于SQlServer) 法二:s ...

  9. 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)

    本篇主要讲配置Windows 故障转移集群及遇到的相关问题(坑),因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 四种集群的仲裁配置: 1.多 ...

随机推荐

  1. 重建二叉树_C++

    一.题目背景 给定一个二叉树的前序和中序遍历,求出它的后序遍历 二叉树的遍历可参考 http://blog.csdn.net/fansongy/article/details/6798278/ 二.算 ...

  2. Android控件点击事件

    1. 介绍 本文介绍了Android控件的点击事件 Android控件点击(onClick)事件可以用如下三种方式来实现 2. 实现onClick方法 在layout的xml中指定onClick方法, ...

  3. UVA 10594 Data Flow

    无向图费用流 还有一段话摘自别人博客 这道题是无向图的最小费用最大流问题,看清楚是无向图的.这么说无向图和有向图的费用流问题有什么区别呢?主要是反向边的问题.首先我们说一下最大流问题中的反向边,我们需 ...

  4. linux内核分析之进程地址空间【转】

    转自:http://blog.csdn.net/bullbat/article/details/7106094 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要介绍linux内核中进程地 ...

  5. linux内存管理2:内存映射和需求分页(英文名字:demand Paging,又叫:缺页中断)【转】

    转自:http://blog.csdn.net/zhangxinrun/article/details/5873148 当某个程序映象开始运行时,可执行映象必须装入进程的虚拟地址空间.如果该程序用到了 ...

  6. [转]Google 的开源技术protobuf 简介与例子

    本文来自CSDN博客:http://blog.csdn.NET/program_think/archive/2009/05/31/4229773.aspx 今天来介绍一下“Protocol Buffe ...

  7. git 克隆一个新仓库

    1.登陆git网页版,点击右上角创建新项目 2.更改project path(如果需要),填写project name,其它选项默认. 3.到本地要创建存放项目的目录下,打开git命令框,输入git ...

  8. python update数据

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/23 23:57 # @Author : lijunjiang # @Fi ...

  9. pandas read excel文件碰到的一个小问题

    今天利用pandas读取excel时,爆出如下错误: 代码为: import pandas as pd db_eua=pd.read_excel('db_eua.xlsx',sheetname='EU ...

  10. 你不知道的 JavaScript 基础细节

    语法部分 type 属性: 默认的 type 就是 javascript, 所以不必显式指定 type 为 javascript javascript 不强制在每个语句结尾加 “:” , javasc ...