SQL语句题库

一、    填空题

  1. Not Only SQL数据库 泛指  非关系型数据库 
  2. SYS和SYSTEM用户都是Oracle 的系统用户,它们都使用SYSTEM表空间,其中 sys 拥有更大的权限。
  3. Oracle提供了两种类型的权限:系统权限和  对象权限 
  4.   系统权限  提供了在Oracle数据库系统范围内执行某种任务的操作能力,
  5.   对象权限  则是一种赋予用户在指定的数据库对象(如表、视图、过程等)。
  6. SQL语言分类:DQL(数据查询语言)  、 DML(数据操纵语言)   DDL(数据定义语言)   、  DCL(数据控制语言)、  TCL(事务控制语言)  。
  7. SQL语言分类中DML指的是:数据操作语言例如  insert delete update   共三个语句。
  8. SQL语言分类中DQL指的是:数据查询语言  例如:   select  语句。
  9. 使用   order by   子句对查询结果进行排序。
  10. 排序方式包括升序(asc,缺省)和  降序(desc)   两种。
  11. 使用  is null  运算符进行空值判断。
  12. Oracle函数分为单行函数和   多行函数   两大类。
  13. 单行函数分类:字符函数、 数值函数、日期函数 、  转换函数  和 通用函数。
  14. 在需要滤除查询结果中重复的行时,必须使用关键字   distinct  
  15. 当进行模糊查询时,应使用关键字  like  和通配符问号(_)或百分号"%"。其中  %表示   任意个字符(包括零个)  ; _ 表示一个任意字符;
  16. 在SQL语句中,用于向表中插入数据的语句是  insert  
  17. 使用  desc  命令可以显示表的结构信息。
  18. 外连接的内连接的区别在于,  内连接  只能显示匹配的数据,而另外一个连接还可以显示不匹配的数据。
  19. 两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为  左外连接 
  20. 两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为   右外连接 

二、    选择题

1.数据库(DB),数据库系统(DBS)和数据库管理系统(DBMS)三者之间的关系是(A)。(选择一项)
A.DBS包括DB和DBMS
B.DBMS包括DB和DBS
C.DB包括DBS和DBMS
D.DBS就是DB,也就是DBMS
2.在下列 RDMBS 产品中,属于小型数据库系统的是(A)。(选择一项)
A.Access
B.Oracle
C.Sybase
D.Informix
3.下列哪种数据库系统更适合于在大、中型计算机系统上使用(C)。(选择一项)
A.FoxPro
B.Access
C.Oracle
D.Microsoft SQL Server
4.数据库系统的日志文件用于记录下述哪类内容(D)。(选择一项)
A.程序运行过程
B.数据查询操作
C.程序执行结果
D.数据更新操作
5. SQL语言是什么语言(C )。(选择一项)
A.层次数据库
B.网络数据库
C.关系数据库
D.非数据库
6.数据库管理系统的数据操纵语言(DML)所实现的操作一般包括(D)(选择一项)
A.建立、授权、修改
B.建立、授权、删除
C.建立、插入、修改、排序
D.插入、修改、删除
7.在数据库中可以创建和删除表、视图、索引,可以修改表。这是因为数据库管理系统提供了(A)。(选择一项)
A.数据定义功能
B.数据操纵功能
C.数据维护功能
D.数据控制功能
8.在数据操纵语言(DML)的基本功能中,不包括的是(B)。(选择一项)
A.插入新数据
B.描述数据库结构
C.对数据库中数据排序
D.删除数据库中数据
9.在SQL查询时,使用WHERE子句指出的是(B)。(选择一项)
A.查询目标
B.查询条件
C.查询视图
D.查询结果
10. 下面哪条SQL语句将为计算列SAL*12生成别名Annual Salary(B)。(选择一项)
A.SELECT ename,sal*12 ‘Annual Salary’ FROM emp;
B.SELECT ename,sal*12 “Annual Salary” FROM emp;
C.SELECT ename,sal*12 AS Annual Salary FROM emp;
D.SELECT ename,sal*12 AS INITCAP(“Annual Salary”) FROM emp;
11. 请根据PRODUCT_NAME列从PRODUCT表查询中过滤返回的数据。下列哪个子句包含相应过滤条件的引用(C)。(选择一项)
A.selectB.fromC.whereD.Having
12. 请从订单表中取得数据,包括三个列:客户名、订单时间与订单费用。可以用下列哪个where子句查询ORDERS表,取得客户A超过2700的订单(D)。(选择一项)
A.where 客户名= ‘A’;
B.where 客户名= ‘A’ and 订单费用 < 2700;
C.where 客户名= ‘A’ or 订单费用 > 2700;
D.where 客户名= ‘A’ and 订单费用 > 2700;
13. 在SELECT语句中使用哪个子句来只显示工资超过5000的员工(D)。(选择一项)
A.ORDER BY SALARY > 5000
B.GROUP BY SALARY > 5000
C.HAVING SALARY > 5000
D.WHERE SALARY > 5000
14. 在 SQL 语句中,与 X BETWEEN 20 AND 30 等价的表达式是(D)。(选择一项)
A.X>=20 AND X<30
B.X>20 AND X<30
C.X>20 AND X<=30
D.X>=20 AND X<=30
15. 用下列代码块回答问题:SQL> select ______(-45) as output from dual;OUTPUT-------45下列哪个单行函数无法产生这个输出(A)。(选择一项)
A.abs()
B.ceil()
C.floor()
D.round()
16. 对表中的某一行,VARCHAR2列包含数值SMITHY,应用程序在右侧填充七个空格。length()函数处理这个列值时,返回什么值(B)。(选择一项)
A.6
B.13
C.30
D.60
17. SQL *Plus中发出的下列语句:SQL> select ceil(256.342),floor(256.342),round(256.342),trunc(256.342)from dual;下列哪个函数不返回结果256(A)。(选择一项)
A.ceil()
B.floor()
C.round()
D.trunc()
18. 在Oracle中,下面哪条语句当COMM字段为空时显示0,不为空时显示COMM的值(A)。(选择一项)
A.select ename, nvl(comm,0) from emp;
B.select ename, null(comm.,0) from emp;
C.SELECT ename,NULLIF(comm,0)FROM emp;
D.SELECT ename,DECODE(comm.,NULL,0)FROM emp;
19. TEST表包含两个列,TESTCOL定义为数据类型NUMBER(10),TESTCOL_2定义为数据类型VARCHAR2(10)。在Oracle中发出下列语句:insert into test(testcol, testcol_2) values (null, ‘FRANCIS’),然后对表进行下列查询:select nvl(testcol, ‘EMPTY’) as testcol from test where testcol_2 = ‘FRANCIS’。下列选项哪个是得到的结果(D )。(选择一项)
A.Oracle返回结果0
B.Oracle返回结果EMPTY
C.Oracle返回结果NULL
D.Oracle返回错误结果
20. 在Oracle中,对分组函数的返回数据进行筛选的关键字是(B)。(选择一项)
A.WHRER
B.HAVING
C.ORDER BY
D.无法限定分组函数的返回
21. 如何删除sales表中产品类型为toys的profits列的列值(A)。(选择一项)
A.UPDATE sales SET profits = NULL WHERE product_type = 'TOYS'
B.DELETE profits FROM sales WHERE product_type = 'TOYS'
C.DELETE FROM sales WHERE product_type = 'TOYS'
D.DELETE FROM sales
22. DELETE FROM S WHERE 年龄>60语句的功能是(B)。(选择一项)
A.从S表中彻底删除年龄大于60岁的记录
B.S表中年龄大于60岁的记录被加上删除标记
C.删除S表
D.删除S表的年龄列
23. 哪行代码有错误(A)。(选择一项)
A.SELECT dname,ename
B.FROM emp e,dept d
C.WHERE emp.deptno=dept.deptno
D.ORDER BY 1,2
24. 以下查询语句是哪种连接,SELECT dname,ename FROM dept d,emp eWHERE d.deptno=e.deptno ORDER BY dname,ename;(B)。(选择一项)
A.自连接
B.等值连接
C.外连接
D.不等值连接
25. 如果查询表A(有3行数据)和表B(有4行数据),使用select * from a,b,返回的查询结果有多少行(D)。(选择一项)
A.7
B.1
C.0
D.12
26. 检查下列SQL的输出 select a.deptno,a.job,b.loc,sum(a.sal) from dmp a,dept b where a.deptno = b.depton group by a.deptno,a.job,b.loc order by sum(a.sal);这个查询按哪个列的顺序返回输出( D)。(选择一项)
A.Deptno
B.Job
C.Loc
D.sum(a.sal)
27. 已经存在学生信息表:s(sno, sname, sex, age, dept) 主码为sno
课程信息表:c(cno, cname, teacher) 主码为cno
学生选课信息表:sc(sno, cno, grade) 主码为(sno, cno)"从学生选课信息表中找出无成绩的元组"的SQL语句是(C)(选择一项)
A.SELECT * FROM sc WHERE grade=NULL
B.SELECT * FROM sc WHERE grade IS ' '
C.SELECT * FROM sc WHERE grade IS NULL
D.SELECT * FROM sc WHERE grade =' '
28. 已经存在学生信息表:s(sno, sname, sex, age, dept) 主码为sno
课程信息表:c(cno, cname, teacher) 主码为cno
学生选课信息表:sc(sno, cno, grade) 主码为(sno, cno)在"查询选修课程号为4,且成绩在80分以上的所有学生的学号和姓名"的SQL语句中,将使用的表是(D)(选择一项)
A.学生信息表S
B.学生信息表S和课程信息表c
C.学生信息表S、课程信息表c和学生选课信息表sc
D.学生信息表S和学生选课信息表sc
29. 关于子查询以下哪两种说法是正确的(BD)。(选择二项)
A.外层查询返回结果之后,执行内层查询
B.先执行子查询,再执行外层查询
C.对于子查询返回的结果,外层查询只执行一次
D.外层查询返回的每行结果都与内层查询结果进行比较

三、    判断题

1. 数据库系统提供了对数据库进行有效处理的方法。它由四大部分组成:数据库、数据库管理系统、数据库应用程序和数据库管理员。( T )
2. 数据完整性是指数据库中的数据在逻辑上的一致性和合理性。通过完整性约束机制,当用户对数据库数据进行操作时,系统可以在一定程序上保证数据的正确性。( T )
3. 建立数据库中的表时,将年龄字段值限制在18-25岁之间。这种约束属于参照完整性约束。( F )
4. Oracle数据库管理系统是Oracle公司的核心产品,是目前最流行的数据库,基于C/S系统结构。( T )
5. 每个启动的数据库都对应一个或者多个数据库实例,由这些实例来访问和控制数据库。( F )
6. Oracle采用服务器/客户端访问方式,服务器端使用监听器对客户端的访问进行监听。客户端访问服务器端时必须明确四个参数,包括:访问协议、服务器IP地址、服务器监听端口、服务器端的哪个数据库实例。( T )
7. 在安装Oracle服务器软件时自动配置一个监听器,并且自动创建了和数据库实例名相同的本地网络服务名。( T )
8. 数据操作语言针对表中的数据,而数据定义语言针对数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)。( T )
9. DML(数据操作语言)包括了:insert、update、delete、select。( F )
10. SQL(Structured Query Language)是最重要的关系数据库操作语言,是所有关系数据库管理系统的标准语言。许多数据库厂商在使用SQL的同时,都对SQL进行了扩展,比如ORACLE的PL/SQL语言,MS SQL-Server的T-SQL语言。( T )
11. 字段别名如果含有空格或其他特殊字符或大小写敏感,需用中括号括起来。( F )
12. 连接运算符‘||’可以把列与字符、或其它表达式连接在一起,得到一个新的字符串,实现‘合成’列的功能。( T )
13. 缺省情况下,查询结果中包含所有符合条件的记录行,但是不包括重复行。( F )
14. 运算符:BETWEEN...AND...含义:界于两值之间(不包括边界);LIKE含义:模糊查询。( F )
15. 使用LIKE运算符执行模糊查询(通配查询),’%’ 表示零或多个字符,‘_’ 表示一个字符.( T )
16. 函数只是将取出的数据进行处理,也会改变数据库中的值。( F )
17. 多行函数:sum() 和 avg() 仅适用数值型,count() 、max() 、min() 适用任何类型数据。( T )
18. Oracle的类型转换分为自动类型转换和强制类型转换。( T )
19. 数据类型之间可以进行自动转换,所以不建议使用显示转换函数,以保持良好的设计风格。常用类型转换函数有to_char(),、to_date(),、to_number()。( F )
20. NVL()函数用于将指定的某些值替换为指定的缺省值,适用于字符、数字、日期等类型数据。( F )
21. 多行函数:对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数。( T )
22. 对分组查询的结果进行过滤,要使用having从句。( T )
23. 往表中插入数据的语句是insert语句,方式有两种,一种是记录值的插入,一种是查询结果的插入。( T )
24. 如果想从表中删除所有的行,只能使用delete语句完成。( F )
25. 进行多表等值查询时,当被连接的多个表中存在同名字段时,须在该字段前加上"表名."前缀。使用表名(表别名)前缀不能提高查询效率。( F )
26. 为了连接n个表,至少需要n个连接条件。( F )
27. Natural join基于两个表中的全部同名列建立连接。从两个表中选出同名列的值均对应相等的所有行。自然连接的结果保留重复的属性。( F )
28. 在查询是基于未知值时应考虑使用子查询,子查询必须包含在括号内。( T )
29. 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符。( T )
30. 单行子查询只返回一行记录。对单行子查询可使用单行记录比较运算符。( T )

四、    编码题

1.已知Oracle的Scott用户中提供了三个测试数据库表,名称分别为dept,emp和salgrade。使用SQL语言完成以下操作
1)试用SQL语言完成下列查询(单表查询):
a)查询20号部门的所有员工信息:
select * from emp e where e.deptno=20;
b)查询奖金(COMM)高于工资(SAL)的员工信息:
select * from emp where comm>sal;
c) 查询奖金高于工资的20%的员工信息:
select * from emp where comm>sal*0.2;
d)查询10号部门中工种为MANAGER和20号部门中工种为CLERK的员工的信息:
select * from emp e
where (e.deptno=10 and e.job='MANAGER')
or (e.deptno=20 and e.job='CLERK') ;
e) 查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息:
select * from emp
where job not in('MANAGER','CLERK') and sal>=2000;
f) 查询没有奖金或奖金低于100的员工信息:
select * from emp where comm is null or comm<100;
g) 查询员工工龄大于或等于10年的员工信息:
select * from emp where (sysdate-hiredate)/365>=10;
h) 查询员工信息,要求以首字母大写的方式显示所有员工的姓名:
第一种写法:
select initcap(ename) from emp;
第二种写法:
select upper(substr(ename,1,1))||lower(substr(ename,2)) from emp;
i) 查询在2月份入职的所有员工信息:
select * from emp where to_char(hiredate,'MM')='02';
j) 显示所有员工的姓名、入职的年份和月份,按入职日期所在的月份排序,若月份相同则按入职的年份排序:
select ename,to_char(hiredate,'yyyy') year,to_char(hiredate,'MM')
month
from emp
order by month,year;
k)查询'JONES'员工及所有其直接、间接下属员工的信息:
select e.* from emp e
start with ename='JONES'
connect by prior empno=mgr;
l)查询SCOTT员工及其直接、间接上级员工的信息:
select e.* from emp e
start with ename='SCOTT'
connect by prior mgr=empno;
2)试用SQL语言完成下列查询(多表查询):
a) 查询从事同一种工作但不属于同一部门的员工信息:
select a.ename,a.job,a.deptno,b.ename,b.job,b.deptno
from emp a,emp b
where a.job=b.job and a.deptno<>b.deptno;
b) 查询各个部门的详细信息以及部门人数、部门平均工资:
select d.deptno,count(e.empno),avg(e.sal),d.dname,d.loc
from emp e ,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname,d.loc;
3)试用SQL语言完成下列查询(嵌套子查询):
a)查询10号部门员工以及领导的信息:
select * from emp where empno in(
select mgr from emp where deptno=10) or deptno=10;
b) 查询工资为某个部门平均工资的员工信息:
select * from emp
where sal in(select avg(sal) from emp group by deptno);
c)查询工资高于本部门平均工资的员工的信息:
select * from emp e1
where sal >(select avg(sal) from emp e2 where e2.deptno=e1.deptno);
d)查询工资高于本部门平均工资的员工的信息及其部门的平均工资:
select e.*,a.avgsal
from emp e,
(select deptno,avg(sal) as avgsal from emp group by deptno) a where a.deptno=e.deptno and e.sal>a.avgsal;
4)试用SQL语言完成下列查询(聚合函数):
a) 统计各个工种的人数与平均工资:
select count(*),e.job,avg(e.sal) from emp e
group by e.job;
b) 统计每个部门中各个工种的人数与平均工资:
select deptno,job,count(empno),avg(sal) from emp e
group by e.deptno,e.job;
c)查询所有员工入职以来的工作期限,用“**年**月**日”的形式表示。
select e.ename,floor((sysdate-e.hiredate)/365)|| '年'|| floor(mod((sysdate-e.hiredate),365)/30) || '月'|| floor(mod(mod((sysdate-e.hiredate),365),30))|| '日'from emp e;
d) 查询人数最多的部门信息:
select * from dept
where deptno in
(select deptno from
(select count(*) count,deptno from emp group by deptno)
where count in
(select max(count) from
(select count(*) count ,deptno from emp group by deptno)
)
);
e) 以树状结构查询所有员工与领导之间的层次关系:
select substr(sys_connect_by_path(ename,'->'),3),level
from emp
start with mgr is null
connect by prior empno=mgr;
f) 部门平均薪水最高的部门编号:
第一种方法:
select * from(
select avg(sal) avgsal,deptno
from emp group by deptno order by avgsal desc)
where rownum=1;

 

第二种方法:
select deptno,avg(sal) from emp group by deptno having avg(sal)=(
select max(avg(sal)) avgsal
from emp group by deptno)
g)部门平均薪水最高的部门名称:
select d.* from dept d where deptno
in(select deptno from emp group by deptno having avg(sal)=
(select max(avg(sal)) avgsal from emp group by deptno))
h)平均薪水最低的部门的部门名称:
select d.* from dept d where deptno
in(select deptno from emp group by deptno having avg(sal)=
(select min(avg(sal)) avgsal from emp group by deptno))
i) 平均薪水等级最低的部门的部门名称:
select d.dname from dept d
where d.deptno in (select a.deptno from
(select e.deptno from emp e,salgrade s
where (e.sal between s.losal and s.hisal)
group by e.deptno order by avg(s.grade)) a
where rownum=1);
j) 部门经理人中,薪水最低的部门名称:
select dname from dept where deptno=
(select deptno from
(select deptno from emp where job='MANAGER' group by deptno
order by min(sal)) where rownum=1);
k) 比普通员工的最高薪水还要高的经理人名称:
select ename from emp where sal>
(select max(sal) from emp where job not in
('MANAGER','PRESIDENT')) and job='MANAGER' or job='PRESIDENT';
5)试用SQL语言完成下列查询(嵌套子查询):
a) 查询所有员工工资都大于1000的部门的信息:
select * from dept where deptno in
(select deptno from emp
where deptno not in
(select distinct deptno from emp where sal<1000));
b) 查询所有员工工资都大于1000的部门的信息及其员工信息:
select * from emp e join dept d
on d.deptno
in (select deptno from emp
where deptno not in
(select distinct deptno from emp where sal<1000))
and d.deptno=e.deptno;
c) 查询所有员工工资都在900~3000之间的部门的信息:
select * from dept
where deptno not in
(select deptno from emp
where sal not between 900 and 3000);
d) 查询所有工资都在900~3000之间的员工所在部门的员工信息:
select * from emp a
where a.deptno in
(select distinct e.deptno from emp e
where e.sal between 900 and 3000);
e) 查询每个员工的领导所在部门的信息:
select d.* from dept d
where d.deptno in
(select distinct e2.deptno from emp e1,emp e2
where e1.empno=e2.mgr);
f)查询30号部门中工资排序前3名的员工信息:
select * from
(select sal from emp where deptno=30 order by sal desc) e
where rownum<4
g) 查询工作等级为2级,1985年以后入职的工作地点为DALLAS的员工编号、姓名和工资:
select e.ename,e.empno,e.sal from emp e,salgrade s,dept d
where (e.sal between s.losal and s.hisal)
and (s.grade=2)
and to_char(e.hiredate,'yyyy')>1985
and e.deptno=d.deptno
and d.loc='DALLAS';
6)用SQL语句完成下列操作:
a) 将各部门员工的工资修改为该员工所在部门平均工资加1000:
update emp e set sal=
1000+(select avg(sal) from emp where deptno=e.deptno);
b) 删除重复部门,只留下一项:
delete from dept d
where rowid<>
(select min(rowid) from dept where dname=d.dname and d.loc=loc);
c)更新员工工资为他的主管的工资,奖金:
第一种方法:
update emp e set sal=(select sal from emp where empno=e.mgr), comm=(select comm from emp where empno=e.mgr)
第二种方法:
update emp e set (sal,comm)=(select sal,comm from emp whereempno=e.mgr);
2.(可选题)某大学图书馆为了更好管理图书,使用Oracle数据库建立了三个表:
CARD 借书卡表: CNO(卡号),NAME (姓名),CLASS (班级);
BOOKS 图书表: BNO(书号),BNAME (书名), AUTHOR (作者),PRICE (单价),QUANTITY (库存册数);
BORROW 借书记录表: CNO (借书卡号),BNO (书号),RDATE (还书日期);
备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。
1)试用SQL语言完成下列操作:
a)写出建立BORROW表的SQL语句,要求定义主码完整性约束和引用完整性约束:
CREATE TABLE BORROW(
CNO NUMBER REFERENCES CARD(CNO),
BNO NUMBER REFERENCES BOOKS(BNO),
RDATE date,
PRIMARY KEY(CNO,BNO)
);
b)假定在建BOOKS表时没有定义主码,写出为BOOKS表追加定义主码的语句:
ALTER TABLE BOOKS ADD PRIMARY KEY(BNO) ;
c)将CARD 表的NAME最大列宽增加到10个字符(假定原为6个字符):
ALTER TABLE CARD MODIFY NAME varchar2(10) ;
d)为该表增加1列NAME(系名),可变长,最大20个字符:
ALTER TABLE CARD ADD 系名 varchar2(20) ;
2)试用SQL语言完成下列查询:
a)找出借书超过5本的读者,输出借书卡号及所借图书册数:
SELECT CNO, COUNT(*) FROM BORROW GROUP BY CNO HAVING COUNT(*)>5;
b)查询借阅了"水浒"一书的读者,输出姓名及班级:
SELECT NAME, CLASS FROM CARD WHERE CNO IN (SELECT CNO FROM BORROW BW, BOOKS BK WHERE BW.BNO=BK.BNO AND BK.BNAME='水浒') ;
c)查询过期未还图书,输出借阅者(卡号)、书号及还书日期:
SELECT * FROM BORROW WHERE RDATE<SYSDATE;
d)查询书名包括"网络"关键词的图书,输出书号、书名、作者:
SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE '%网络%';
e)查询现有图书中价格最高的图书,输出书名及作者:
SELECT BNAME,AUTHOR FROM BOOKS WHERE PRICE=(SELECT MAX(PRICE) FROM BOOKS) ;
f)查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出:
SELECT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME='计算方法' AND a.CNO NOT IN( SELECT aa.CNO FROM BORROW aa,BOOKS bb WHERE aa.BNO=bb.BNO AND bb.BNAME='计算方法习题集')ORDER BY a.CNO DESC;
g)查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出:
SELECT DISTINCT a.CNO FROM BORROW a,BOOKS b WHERE a.BNO=b.BNO AND b.BNAME IN('计算方法','组合数学') ORDER BY a.CNO;
3)试用SQL语言完成下列操作:
a)将"C01"班同学所借图书的还期都延长一周:
UPDATE BORROW SET RDATE=RDATE+7 WHERE CNO IN (SELECT DISTINCT CNO FROM CARD WHERE CLASS='C01');
b)从BOOKS表中删除当前无人借阅的图书记录:
DELETE FROM BOOKS WHERE BNO NOT IN(SELECT DISTINCT BK.BNO FROM BORROW BR, BOOKS BK WHERE BR.BNO=BK.BNO);
4)试用SQL语言完成下列操作:
a)如果经常按书名查询图书信息,请建立合适的索引:
CREATE INDEX IDX_BOOKS_BNAME ON BOOKS(BNAME) ;
b)在BORROW表上建立一个触发器,完成如下功能:如果读者借阅的书名是"数据库技术及应用",就将该读者的借阅记录保存在BORROW_SAVE表中(注ORROW_SAVE表结构同BORROW表):
CREATE TRIGGER TR_SAVE ON BORROWFOR INSERT,UPDATEASIF @@ROWCOUNT>0 INSERT BORROW_SAVE SELECT i.*FROM INSERTED i,BOOKS b WHERE i.BNO=b.BNO AND b.BNAME=N'数据库技术及应用';
c)建立一个视图,显示"力01"班学生的借书信息(只要求显示姓名和书名):
CREATE VIEW V_VIEWASSELECT a.NAME,b.BNAMEFROM BORROW ab,CARD a,BOOKS bWHEREab.CNO=a.CNO AND ab.BNO=b.BNO AND a.CLASS=N'力01';

posted @ 2016-11-14 20:07  光何  阅读(9184)  评论(0编辑  收藏  举报