一、 填空题
- Not Only SQL数据库 泛指 非关系型数据库 。
- SYS和SYSTEM用户都是Oracle 的系统用户,它们都使用SYSTEM表空间,其中
sys 拥有更大的权限。
- Oracle提供了两种类型的权限:系统权限和 对象权限 。
- 系统权限 提供了在Oracle数据库系统范围内执行某种任务的操作能力,
- 对象权限 则是一种赋予用户在指定的数据库对象(如表、视图、过程等)。
- SQL语言分类:DQL(数据查询语言) 、 DML(数据操纵语言)、 DDL(数据定义语言) 、 DCL(数据控制语言)、 TCL(事务控制语言) 。
- SQL语言分类中DML指的是:数据操作语言例如 insert delete update 共三个语句。
- SQL语言分类中DQL指的是:数据查询语言 例如: select 语句。
- 使用 order by 子句对查询结果进行排序。
- 排序方式包括升序(asc,缺省)和 降序(desc) 两种。
- 使用 is null 运算符进行空值判断。
- Oracle函数分为单行函数和 多行函数 两大类。
- 单行函数分类:字符函数、 数值函数、日期函数 、 转换函数 和 通用函数。
- 在需要滤除查询结果中重复的行时,必须使用关键字 distinct 。
- 当进行模糊查询时,应使用关键字 like 和通配符问号(_)或百分号"%"。其中 %表示 任意个字符(包括零个) ; _ 表示一个任意字符;
- 在SQL语句中,用于向表中插入数据的语句是 insert 。
- 使用 desc 命令可以显示表的结构信息。
- 外连接的内连接的区别在于, 内连接 只能显示匹配的数据,而另外一个连接还可以显示不匹配的数据。
- 两个表在连接过程中除返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为 左外连接 。
- 两个表在连接过程中除返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为 右外连接 。
二、 选择题
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. |
select |
|
B. |
from |
|
C. |
where |
|
D. |
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 e WHERE 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 "从学生选课信息表中找出无成绩的元组"的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 在"查询选修课程号为4,且成绩在80分以上的所有学生的学号和姓名"的SQL语句中,将使用的表是( D )(选择一项) |
|
|
|
|
|
A. |
学生信息表S |
|
B. |
学生信息表S和课程信息表c |
|
C. |
学生信息表S、课程信息表c和学生选课信息表sc |
|
D. |
学生信息表S和学生选课信息表sc |
29. |
关于子查询以下哪两种说法是正确的( BD )。(选择二项) |
|
|
|
|
|
A. |
外层查询返回结果之后,执行内层查询 |
|
B. |
先执行子查询,再执行外层查询 |
|
C. |
对于子查询返回的结果,外层查询只执行一次 |
|
D. |
外层查询返回的每行结果都与内层查询结果进行比较 |
三、 判断题
- 数据库系统提供了对数据库进行有效处理的方法。它由四大部分组成:数据库、数据库管理系统、数据库应用程序和数据库管理员。( T )
- 数据完整性是指数据库中的数据在逻辑上的一致性和合理性。通过完整性约束机制,当用户对数据库数据进行操作时,系统可以在一定程序上保证数据的正确性。( T )
- 建立数据库中的表时,将年龄字段值限制在18-25岁之间。这种约束属于参照完整性约束。( F )
- Oracle数据库管理系统是Oracle公司的核心产品,是目前最流行的数据库,基于C/S系统结构。( T )
- 每个启动的数据库都对应一个或者多个数据库实例,由这些实例来访问和控制数据库。( F )
- Oracle采用服务器/客户端访问方式,服务器端使用监听器对客户端的访问进行监听。客户端访问服务器端时必须明确四个参数,包括:访问协议、服务器IP地址、服务器监听端口、服务器端的哪个数据库实例。( T )
- 在安装Oracle服务器软件时自动配置一个监听器,并且自动创建了和数据库实例名相同的本地网络服务名。( T )
- 数据操作语言针对表中的数据,而数据定义语言针对数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)。( T )
- DML(数据操作语言)包括了:insert、update、delete、select。( F )
- SQL(Structured Query Language)是最重要的关系数据库操作语言,是所有关系数据库管理系统的标准语言。许多数据库厂商在使用SQL的同时,都对SQL进行了扩展,比如ORACLE的PL/SQL语言,MS SQL-Server的T-SQL语言。( T )
- 字段别名如果含有空格或其他特殊字符或大小写敏感,需用中括号括起来。( F )
- 连接运算符‘||’可以把列与字符、或其它表达式连接在一起,得到一个新的字符串,实现‘合成’列的功能。( T )
- 缺省情况下,查询结果中包含所有符合条件的记录行,但是不包括重复行。( F )
- 运算符:BETWEEN...AND...含义:界于两值之间(不包括边界);LIKE含义:模糊查询。( F )
- 使用LIKE运算符执行模糊查询(通配查询),’%’ 表示零或多个字符,‘_’ 表示一个字符.( T )
- 函数只是将取出的数据进行处理,也会改变数据库中的值。( F )
- 多行函数:sum() 和 avg() 仅适用数值型,count() 、max() 、min() 适用任何类型数据。( T )
- Oracle的类型转换分为自动类型转换和强制类型转换。( T )
- 数据类型之间可以进行自动转换,所以不建议使用显示转换函数,以保持良好的设计风格。常用类型转换函数有to_char(),、to_date(),、to_number()。( F )
- NVL()函数用于将指定的某些值替换为指定的缺省值,适用于字符、数字、日期等类型数据。( F )
- 多行函数:对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数。( T )
- 对分组查询的结果进行过滤,要使用having从句。( T )
- 往表中插入数据的语句是insert语句,方式有两种,一种是记录值的插入,一种是查询结果的插入。( T )
- 如果想从表中删除所有的行,只能使用delete语句完成。( F )
- 进行多表等值查询时,当被连接的多个表中存在同名字段时,须在该字段前加上"表名."前缀。使用表名(表别名)前缀不能提高查询效率。( F )
- 为了连接n个表,至少需要n个连接条件。( F )
- Natural join基于两个表中的全部同名列建立连接。从两个表中选出同名列的值均对应相等的所有行。自然连接的结果保留重复的属性。( F )
- 在查询是基于未知值时应考虑使用子查询,子查询必须包含在括号内。( T )
- 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符。( T )
- 单行子查询只返回一行记录。对单行子查询可使用单行记录比较运算符。( 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';