走向面试之经典的数据库笔试题:一、你必知必会的SQL语句练习-Part 2

本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑而成,非原创,仅润色而已。另外,本文所列题目的解法并非只有一种,本文只是给出比较普通的一种而已,也希望各位园友能够自由发挥。

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

1.1 本题目的表结构

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

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

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

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

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

1.2 基本建表语句

 1 create table CARDS
 2 (
 3     CNO int identity(1,1),
 4     NAME nvarchar(50) not null,
 5     CLASS nvarchar(100) not null,
 6     constraint pk_cards primary key (CNO)
 7 )
 8
 9 create table BOOKS
10 (
11     BNO int identity(1,1),
12     BNAME nvarchar(255) not null,
13     AUTHOR nvarchar(50) not null,
14     PRICE decimal(8,1) not null,
15     QUANTITY int default 0,
16     constraint pk_books primary key (BNO)
17 )
18
19 create table BORROW
20 (
21     CNO int not null,
22     BNO int not null,
23     RDATE datetime default GETDATE() not null,
24     constraint pk_borrow primary key (CNO,BNO),
25     constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO),
26     constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO)
27 )

1.3 插入测试数据

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

1.4 开始实战吧小宇宙

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

1 create table BORROW
2 (
3     CNO int not null,
4     BNO int not null,
5     RDATE datetime default GETDATE() not null,
6     constraint pk_borrow primary key (CNO,BNO),
7     constraint fk_borrow_cards foreign key (CNO) references CARDS(CNO),
8     constraint fk_borrow_books foreign key (BNO) references BOOKS(BNO)
9 )

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

1 select b.CNO,COUNT(b.CNO) as ‘BorrowCount‘
2 from BORROW b
3 group by b.CNO
4 having COUNT(b.CNO)>=5

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

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

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

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

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

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

1 select b.BNO,b.BNAME,b.AUTHOR
2 from BOOKS b
3 where b.BNAME like ‘%网络%‘

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

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

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

1 select r.CNO
2 from BORROW r,BOOKS b
3 where r.BNO=b.BNO and b.BNAME=‘计算方法‘ and not exists
4 (
5     select * from BORROW r1,BOOKS b1
6     where r1.BNO=b1.BNO and r.CNO=r1.CNO and b1.BNAME=‘计算方法习题集‘
7 )
8 order by r.CNO desc

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

1 --解法一
2 update BORROW set RDATE=DATEADD(Day,7,RDATE)
3 where CNO in ( select CNO from CARDS where CLASS=‘计科一班‘ )
4 --解法二
5 update b set b.RDATE=DATEADD(Day,7,RDATE)
6 from BORROW b,CARDS c
7 where b.CNO=c.CNO and c.CLASS=‘计科一班‘

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

1 delete from BOOKS
2 where BNO not in
3 (
4     select distinct BNO from BORROW
5 )

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

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

1 create index index_books_bname on BOOKS(BNAME)

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

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

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

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

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

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

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

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

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

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

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

1 create view V_BorrowInfo_CS0801
2 as
3 select c.NAME,b.BNAME
4 from CARDS c,BOOKS b,BORROW r
5 where c.CNO=r.CNO and b.BNO=r.BNO and c.CLASS=‘计科一班‘

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

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

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

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

1 select b.CNO
2 from BORROW b
3 where b.BNO in (select BNO from BOOKS where BNAME in (‘计算方法‘,‘组合数学‘))
4 group by b.CNO
5 having COUNT(b.BNO)=2
6 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

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

走向面试之经典的数据库笔试题:一、你必知必会的SQL语句练习-Part 2

时间: 2024-10-19 03:10:51

走向面试之经典的数据库笔试题:一、你必知必会的SQL语句练习-Part 2的相关文章

走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图

一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN value3 THEN returnvalue3  ELSE defaultreturnvalue END (2)具体使用示例: 假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代

MySQL必知必会-官方数据库表及SQL脚本导入生成

最近在复习SQL语句,看的是MySQL必知必会这本书,但是发现附录中只有表设计,没有表的具体数据.所以在学习相应的语句中体验不是很好,去网上查了数据库的内容,自己慢慢导入到了数据库中.把表放出来作为参照,SQL脚本语句放在最后,可以直接导到自己的数据库. customer表 cust_id cust_name cust_address cust_city cust_state cust_zip cust_country cust_contact cust_email 10001 Coyote I

HR要求来面试的程序员做笔试题被拒,听到原因懵了

在职场中,经常会遇到能力很强,但是工作态度却很一般,有点恃才傲物的员工,对于这样的情况,放弃又有点舍不得,不放弃又可能会影响到团队氛围.而如果面试中遇到这样的求职者该怎么办呢? 最近在互联网论坛上看到这样一个帖子:HR面试一位能力很强的程序员,要求做笔试题被拒:应届生才做笔试呢!网友评论炸锅了!到底是怎么回事呢? 这位HR在帖子中说自己遇到过这样一个程序员,写代码的技术还是非常不错的,在简历中也可以看出来.只是这个程序员有点太自大了.按照公司流程,HR要求程序员做一套笔试题.可那个程序员直接就说

面试题 | 数据库笔试题集合&#183;之&#183;SQL语句(2)

第2章 SQL 语句 2.1 选择2.1.1 DELETE FROM S WHERE 年龄>60 语句的功能是( A ) A.从 S 表中彻底删除年龄大于 60 岁的记录B.S 表中年龄大于 60 岁的记录被加上删除标记C.删除 S 表D.删除 S 表的年龄列 2.1.2 使用什么命令可以清除表中所有的内容? ( CD ) A.INSERT  B.UPDATE C.DELETE D.TRUNCATE 2.1.3 以下哪个表不用于 mysql 的权限管理( D ) A.HOST         

为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很多人想查看阻塞的源头(哪个SQL语句阻塞了哪个SQL),这样方便直观.简洁明了的定位问题.但是很多时候,很多场景,我们通过SQL语句并不能或者说不容易定位到阻塞者(Blocker)的SQL语句,当然我们可以很容易找到被阻塞的SQL语句,以及它在等待的锁资源.下面我们先分析一下SQL Server数据

基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现

一.概述 在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的数据库表或存储过程的时候.例如,如果按照身份证号码的尾号来分表,那么就需要创建10个用户信息表,尾号相同的用户信息放在同一个表中. 对于类型相同的多个表,我们可以逐个建立,也可以采用循环的方法来建立.与之相对应的,可以用一个存储过程实现对所有表的操作,也可以循环建立存储过程,每个存储过程实现对某个特定表的操作. 本文中,我们建立10个员工信息表,每个表中包含员工工号(8位)和年龄字段,以工号的最后一位来分表.同时,我们建立存储

数据库笔试题2

事务隔离(isolation)定义了数据库系统中一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见.隔离是事务ACID (原子性.一致性性.隔离性.持久性)四大属性中的一个重要属性. 逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,即,当数据的逻辑结构改变时,用户程序也可以不变反应模式和外模式应用程序之间的独立. 数据库的逻辑设计阶段就是设计表格,概念设计阶段就是设计图形

一份数据库笔试题

(在Mysql数据库上面进行测试) create table a (ID int,Name char(20)); create table b (ID int,Name char(20)); 1.当b表存在a表相同的ID字段的时候,将a表的Name更新到b表的Name. update b,a set b.Name=a.Name where a.ID=b.ID; 2.当b表不存在a表ID的记录时,将a表的记录插入到b表中 insert into b select * from a where a.

******常见数据库笔试题*****

学生表:Student 学生表 (学号,姓名,性别,年龄,组织部门) Course 课程表 (编号,课程名称) Sc 选课表 (学号,课程编号,成绩) 表结构如下: (1).写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名 (2).写一个SQL语句,查询’周星驰’同学选修了的课程名字 (3).写一个SQL语句,查询选修了5门课程的学生学号和姓名 select sno,sname from student where sno in ( select sno from sc where c