文档库 最新最全的文档下载
当前位置:文档库 › Oracle面试题及答案

Oracle面试题及答案

Oracle面试题及答案
Oracle面试题及答案

模块一SQL(DQL)

l 基本SQL 查询

l 运算符与函数

l 子查询

l 连接查询

建表语句emp.sql

Part I(第一天)

01. 查询员工表所有数据, 并说明使用*的缺点

答:

select * from emp;

使用*的缺点有

a) 查询出了不必要的列

b) 效率上不如直接指定列名

02. 查询职位(JOB)为'PRESIDENT'的员工的工资

答:

select * from emp where job = 'PRESIDENT';

03. 查询佣金(COMM)为0 或为NULL 的员工信息

答:重点是理解0 与null 的区别

select * from emp where comm = 0 or comm is null;

04. 查询入职日期在1981-5-1 到1981-12-31 之间的所有员工信息

答:通过此题掌握常用日期函数

select * from emp where hiredate

between to_date('1981-5-1','yyyy-mm-dd') and to_date('1981-12-31','yyyy-mm-dd');

05. 查询所有名字长度为4 的员工的员工编号,姓名

答:

select * from emp where length(ename) = 4;

06. 显示10 号部门的所有经理('MANAGER')和20 号部门的所有职员('CLERK')的详细信息答:

select * from emp where deptno = 10 and job = 'MANAGER' or deptno = 20 and job ='CLERK';

07. 显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息

答:考察知识点模糊查询

select * from emp where ename not like '%L%' or ename like '%SM%';

08. 显示各个部门经理('MANAGER')的工资

答:

select sal from emp where job = 'MANAGER';

09. 显示佣金(COMM)收入比工资(SAL)高的员工的详细信息

答:

select * from emp where comm > sal;

10. 把hiredate 列看做是员工的生日,求本月过生日的员工(考察知识点:单行函数)

答:

select * from emp where to_char(hiredate, 'mm') = to_char(sysdate , 'mm');

11. 把hiredate 列看做是员工的生日,求下月过生日的员工(考察知识点:单行函数)

答:

select * from emp where to_char(hiredate, 'mm') = to_char(add_months(sysdate,1) , 'mm');

12. 求1982 年入职的员工(考察知识点:单行函数)

答:

select * from emp where to_char(hiredate,'yyyy') = '1982';

13. 求1981 年下半年入职的员工(考察知识点:单行函数)

答:

select * from emp where hiredate

between to_date('1981-7-1','yyyy-mm-dd') and to_date('1982-1-1','yyyy-mm-dd') - 1; 14. 求1981 年各个月入职的的员工个数(考察知识点:组函数)

答:

select count(*), to_char(trunc(hiredate,'month'),'yyyy-mm')

from emp where to_char(hiredate,'yyyy')='1981'

group by trunc(hiredate,'month')

order by trunc(hiredate,'month');

Part II(第二天)

01. 查询各个部门的平均工资

答:考察知识点:分组

select deptno,avg(sal) from emp group by deptno;

02. 显示各种职位的最低工资

答:考察知识点:分组

select job,min(sal) from emp group by job;

03. 按照入职日期由新到旧排列员工信息

答:考察知识点:排序

select * from emp order by hiredate desc;

04. 查询员工的基本信息,附加其上级的姓名

答:考察知识点:自连接

select e.*, e2.ename from emp e, emp e2 where e.mgr = e2.empno;

05. 显示工资比'ALLEN'高的所有员工的姓名和工资

答:考察知识点:子查询

select * from emp where sal > (select sal from emp where ename='ALLEN');

分析:当查询结果是一行一列时,可以将此结果看做一个值,参与条件比较。

06. 显示与'SCOTT'从事相同工作的员工的详细信息

答:考察知识点:子查询

select * from emp where job = (select * from emp where ename='SCOTT');

分析:同第5 题

07. 显示销售部('SALES')员工的姓名

答:考察知识点:连接查询

select ename from emp e, dept d where e.deptno = d.deptno and d.dname='SALES';

08. 显示与30 号部门'MARTIN'员工工资相同的员工的姓名和工资

答:考察知识点:子查询

select ename, sal from emp

where sal = (select sal from emp where deptno=30 and ename='MARTIN');

分析:同第5 题

09. 查询所有工资高于平均工资(平均工资包括所有员工)的销售人员('SALESMAN')

答:考察知识点:子查询

select * from emp where job='SALESMAN' and sal > (select avg(sal) from emp);

10. 显示所有职员的姓名及其所在部门的名称和工资

答:考察知识点:表连接

select ename, job, dname from emp e, dept d where e.deptno = d.deptno;

11. 查询在研发部('RESEARCH')工作员工的编号,姓名,工作部门,工作所在地

答:考察知识点:表连接

select empno,ename,dname,loc from emp e, dept d

where e.deptno = d.deptno and danme='RESEARCH';

12. 查询各个部门的名称和员工人数

答:考察知识点:子查询,表连接

select * from (select count(*) c, deptno from emp group by deptno) e

inner join dept d on e.deptno = d.deptno;

分析:主要思路是要将子查询结果看做一个临时表,此临时表又可以与其他表做表连接13. 查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位

答:考察知识点:子查询

select job, count(*) from emp where sal > (select avg(sal) from emp) group by job;

分析:查询结果是一行一列,可以将查询结果看做一个值,进行条件比较

14. 查询工资相同的员工的工资和姓名

答:考察知识点:子查询

select * from emp e where (select count(*) from emp where sal = e.sal group by sal) > 1;

分析:此题目类似于17 题,见17 题分析。

15. 查询工资最高的3 名员工信息

答:考察知识点:子查询,rownum

select * from (select * from emp order by sal desc) where rownum <= 3;

分析:见21 题要点一

16. 按工资进行排名,排名从1 开始,工资相同排名相同(如果两人并列第1 则没有第2 名,从第

三名继续排)

答:考察知识点:子查询

select e.*, (select count(*) from emp where sal > e.sal)+1 rank from emp e order by rank;

分析:

此题的要点在于理解select count(*) from emp where sal > e.sal+1 的含义,e.sal 代表当前员工,该子查询的含义就是求比当前员工工资高的人数个数:比此员工工资高的人数个数如果为0,表示此人排名第一,比此员工工资高的人数个数如果为1,表示此人排名第二…所以该子查询结果就表示排名。

17. 求入职日期相同的(年月日相同)的员工

答:考察知识点:子查询

select * from emp e where (select count(*) from emp where e.hiredate=hiredate)>1;

分析:常见的一个误解就是把此题当做自连接做:

select * from emp e1, emp e2 where e1.hiredate = e2.hiredate and e1.empno <> e2.empno;

这样做的结果中对于只有两个日期相等的没有错误,查询结果有 2 条,但如果有三个日期相

等的查询结果就是6 条,其中3 条是重复的。

要点也是理解子查询的含义select count(*) from emp where e.hiredate=hiredate,代表取得与当

前员工入职日期相等的人数个数,如果个数大于1 表示此日期有相等的。

18. 查询每个部门的最高工资

答:考察知识点:分组

select deptno, max(sal) maxsal from emp group by deptno order by deptno;

19. 查询每个部门,每种职位的最高工资

答:考察知识点:分组

select deptno, job, max(sal) from emp group by deptno, job order by deptno, job;

分析:要点是理解多列分组:部门与职位都相同的分为一组,求每组的最高工资,其实就是表示每个部门,每种职位的最高工资

20. 查询每个员工的信息及工资级别(用到表Salgrade)

答:考察知识点:不等值连接

select * from salgrade;

select e.*, sg.grade from emp e, salgrade sg where sal between losal and hisal;

21. 查询工资最高的第6-10 名员工

答:考察知识点:子查询, rownum

select * from (

select e.*,rownum rn from

(select * from emp order by sal desc) e

where rownum <=10)

where rn > 5;

分析:

要点一是rownum 不能直接和order by 连用,因为rownum 先产生,order by 后执行,因此需要将

select * from emp order by sal desc

先排序之后的结果看做一个临时表,再对此临时表产生rownum 编号。

要点二是rownum 不能用作>或>=的比较条件,因此不能够直接这样写

select e.* from

(select * from emp order by sal desc) e

where rownum > 5 and rownum <=10;

因此需要将

select e.*,rownum rn from

(select * from emp order by sal desc) e

where rownum <=10

查询结果看做一个临时表,这个临时表除了有表e 中的所有列之外,多添加一个rownum 列并取别名为rn,这时rn 已经作为临时表中一个真实的列存在了,因此可以使用>或>=比较条件:

select * from (

select e.*,rownum rn from

(select * from emp order by sal desc) e

where rownum <=10)

where rn > 5;

两次查询示例图如下:第一次取前10 条,第二次排除前5 条

22. 查询各部门工资最高的员工信息

答:考察知识点:子查询

select * from emp e where e.sal = (select max(sal) from emp where (deptno = e.deptno));

分析:要点同样是理解子查询select max(sal) from emp where (deptno = e.deptno)获取当前部门(e.deptno)的最高工资,再将此最高值与当前工资(e.sal)进行比较。

思路2:

select e.* from (select max(sal) maxsal, deptno from emp group by deptno) b, emp e

where e.deptno = b.deptno and b.maxsal = e.sal;

将子查询看做一个临时表,临时表中有最高工资列maxsal,以及deptno 列,此临时表与真实表emp 做表连接,连接条件为emp 表中的工资要等于临时表的最高工资并且两表的部门

编号要相等。

23. 查询每个部门工资最高的前2 名员工

答:考察知识点:子查询

select * from emp e where

(select count(*) from emp where sal > e.sal and e.deptno = deptno) < 2

order by deptno, sal desc;

分析:此题类似于第16 题,需要理解select count(*) from emp where sal > e.sal and e.deptno =

deptno 的含义:求工资大于当前员工工资(e.sal)并且部门编号等于当前员工部门编号(e.deptno)的员工的个数,此个数+1 表示排名,< 2 表示取前两名。

思路2:

使用oracle 提供的分析函数rank:

select * from (

select rank() over (partition by deptno order by sal desc) rank, e.* from emp e

) where rank < 3;

rank 函数的作用是产生排名,与普通函数不同,高亮部分都是函数语法部分,其中over 是关键字,总体意思是指按部门编号分组(partition by deptno),按工资降序(order by sal desc)排名。

思路3:

步骤1:按照部门,工资降序排列,并产生编号

select e.*,rownum rn from (select * from emp order by deptno,sal desc) e;

步骤2:在此基础上再按照部门编号分组,求每组的编号的最小值

select min(rn) minrank,deptno from

(select e.*,rownum rn from (select * from emp order by deptno,sal desc) e)

group by deptno;

步骤3:将两步产生的结果看做是临时表分别称为t1,t2,做连接,连接条件时t1 表中

部门编号等于t2 部门编号且t1.rn>= t2.minrank and t1.rn <= t2.minrank+1

select t1.* from

(select e.*,rownum rn from (select * from emp order by deptno,sal desc) e) t1,

(select min(rn) minrank,deptno from

(select e.*,rownum rn from (select * from emp order by deptno,sal desc) e)

group by deptno) t2

where t1.deptno = t2.deptno and t1.rn >= t2.minrank and t1.rn <= t2.minrank+1;

24. 查询出有3 个以上下属的员工信息

答:考察知识点:自连接,子查询

select * from emp e where

(select count(*) from emp where e.empno = mgr) > 2;

分析:关键是理解连接条件e.empno = mgr 是表示连接当前员工(e.empno)和他的下属(mgr)25. 查询所有大于本部门平均工资的员工信息()

答:考察知识点:子查询

select * from emp e where sal >

(select avg(sal) from emp where (deptno = e.deptno))

order by deptno;

分析:思路与22 题相同。

26. 查询平均工资最高的部门信息

答:考察知识点:子查询,组函数,连接查询

select d.*, avgsal from dept d, (select avg(sal) avgsal, deptno from emp group by deptno) se where avgsal = (select max(avg(sal)) from emp group by deptno) and d.deptno = se.deptno;

分析:

步骤1:求每个部门的平均工资:

select avg(sal) avgsal, deptno from emp group by deptno;

步骤2:求最高的平均工资:

select max(avg(sal)) from emp group by deptno;

步骤3:求平均工资最高的部门信息,连接步骤1 产生的临时表与真实表dept:

select d.*, avgsal from dept d, (select avg(sal) avgsal, deptno from emp group by deptno) se where avgsal = (select max(avg(sal)) from emp group by deptno) and d.deptno = se.deptno;

27. 查询大于各部门总工资的平均值的部门信息

答:考察知识点:子查询,组函数,连接查询

select d.*,sumsal from dept d, (select sum(sal) sumsal, deptno from emp group by deptno) se where sumsal >(select avg(sum(sal)) from emp group by deptno) and se.deptno = d.deptno;

分析:

步骤1:求每个部门总工资

select sum(sal) sumsal, deptno from emp group by deptno;

步骤2:求每总工资平均值

select avg(sum(sal)) from emp group by deptno;

步骤3:求大于总工资平均值的部门信息,连接步骤1 产生的临时表与真实表dept:

select d.*,sumsal from dept d, (select sum(sal) sumsal, deptno from emp group by deptno) se where sumsal >(select avg(sum(sal)) from emp group by deptno) and se.deptno = d.deptno;

28. 查询大于各部门总工资的平均值的部门下的员工信息(考察知识点:子查询,组函数,连接

查询)

答:考察知识点:子查询,组函数,连接查询

select e.*,sumsal from emp e, (select sum(sal) sumsal, deptno from emp group by deptno) se where sumsal >(select avg(sum(sal)) from emp group by deptno) and se.deptno = e.deptno;

分析:类似于26 题,27 题

29. 查询没有员工的部门信息

答:考察知识点:表连接

select d.* from dept d left join emp e on (e.deptno = d.deptno) where empno is null;

分析:利用了左外连接的特点,部门连接员工时,没有匹配记录的部门对应的员工编号列肯定为null

30. 查询用户(users 表)huxz 所下所有订单编号,下单日期,总价格(orders 表),并包括订

单中的商品数量(orderitem 表),名称(product 表),价格(product 表)

答:考察知识点:多表连接

select https://www.wendangku.net/doc/765404393.html,ername, o.orderid, o.orderdate, o.totalprice, p.productname, p.price, i.qty

from users u inner join orders o on (https://www.wendangku.net/doc/765404393.html,ername = https://www.wendangku.net/doc/765404393.html,ername)

inner join orderitem i on (o.orderid = i.orderid)

inner join product p on (p.productid = i.productid)

where https://www.wendangku.net/doc/765404393.html,ername = 'huxz';

31. 查询100001 号商品被哪些顾客(users 表)购买过,下单日期(orders 表),每人购买的数

量(orderitem 表),购买时的价格(product 表)

答:考察知识点:多表连接

select https://www.wendangku.net/doc/765404393.html,ername, o.orderdate, p.productname, p.price, i.qty

from product p inner join orderitem i on (p.productid = i.productid)

inner join orders o on (o.orderid = i.orderid)

inner join users u on (https://www.wendangku.net/doc/765404393.html,ername = https://www.wendangku.net/doc/765404393.html,ername)

where p.productid = 100001;

32. 查询出哪些商品从未被订购过

答:考察知识点:连接查询

select p.* from product p left join orderitem i on(i. productid = p. productid)

where i.orderitemid is null;

分析:同29 题

33. 查询出被订购过2 次以上的商品信息

答:考察知识点:连接查询,子查询

select p.* from product p

where (select count(*) from orderitem where productid = p. productid) >= 2;

分析:子查询select count(*) from orderitem where productid = p. productid 的含义是:当前商

品在orderitem 表中出现的次数,即被订购的次数

Part III(面试题目)

01. tmp 表中有如下记录(建表SQL 见emp.sql)

要求结果格式为:

答:考察知识点:case…when…count 函数

select rq,

count(case when shengfu='WIN' then 1 else null end) WIN,

count(case when shengfu='LOSE' then 1 else null end) LOSE from tmp group by rq ;

分析:

要点:在计数时,配合case…when…语句只统计取值为WIN 或LOSE 的个数。case 语句返回不为null 的值即会加入count 计数,返回null 则不会加入count 计数。

02. 查询当前月有多少天

答:考察知识点日期函数的灵活运用

select trunc(add_months(sysdate,1),'month') - trunc(sysdate,'month') from dual;

03. pages 表有四个字段,id, url,title,body。如图:

现要求将url 匹配的排在最前,title 匹配的其次,body 匹配最后,没有任何字段匹配的,不

返回。现要求查询所有匹配baidu 的记录,最终查询结果如图:

建表语句在emp.sql 中

答:考察知识点:union

select id,content from (

select id, 3 mark, url content from pages where url like '%baidu%'

union

select id, 2, title from pages where title like '%baidu%'

union

select id, 1, body from pages where body like '%baidu%'

) order by mark desc;

要点:union 可以用来合并多次查询结果。这里需要注意多次查询的结果列的个数和类型必须相同,合并后的结果集也可以看做一张表,表的列的类型和名称由union 的第一条查询结

果来决定。

这里用到一个技巧:手工指定一个优先级mark 列,最后根据mark 列排序。

04. 现有STUDENT(学生), COURSE(课程), SC(成绩)表,完成以下需求(建表语句在emp.sql

中,综合考察)

a) 查询选修课程为web 的学员学号和姓名

答:

select s.sid,https://www.wendangku.net/doc/765404393.html, from student s

inner join sc on(s.sid=sc.sid) inner join course c on (c.cid=sc.cid)

where https://www.wendangku.net/doc/765404393.html, = 'web';

分析:课程与学生表没有直接联系,必须通过中间成绩表做2 次表连接

b) 查询课程编号为2 的学员姓名和单位

答:

select https://www.wendangku.net/doc/765404393.html,,s.dept from student s inner join sc on (s.sid=sc.sid)

where sc.cid = 2;

c) 查询不选修4 号课程的学员姓名和单位

答:

select name,dept from student where sid not in

(select s.sid from student s left join sc on s.sid = sc.sid where cid = 4);

或:

select name,dept from student

where not exists(select sid from sc where sc.sid = s.sid and cid = 4);

分析:要点是先要查询出选修了4 号课程的学员id,再从所有学员中排除这些id 的学员。方法2 效率较高。

d) 查询选修全部课程的学员姓名和单位

答:

select https://www.wendangku.net/doc/765404393.html,,s.dept from student s where sid in

(select sid from sc group by sid having (count(*) = (select count(*) from course)));

分析:

步骤1:查询出所有课程的数目

select count(*) from course;

步骤2:在成绩(sc)表,按学员id 分组,看每组的个数,该个数等于步骤1 课程总数的sid 即为选修了所有课程的学员id

select sid from sc group by sid having (count(*) = (select count(*) from course));

步骤3:再根据该sid 查询学员的详细信息

select https://www.wendangku.net/doc/765404393.html,,s.dept from student s where sid in

(select sid from sc group by sid having (count(*) = (select count(*) from course)));

e) 查询选修课程超过3 门的学员姓名和单位

答:

select https://www.wendangku.net/doc/765404393.html,,s.dept from student s

where sid in (select sid from sc group by sid having (count(*) > 3));

f) 找出没有选修过Teacher LI 讲授课程的所有学生姓名

答:

select https://www.wendangku.net/doc/765404393.html, from student s where sid not in

(select sid from course c left join sc on (c.cid = sc.cid) where c.teacher='Teacher LI');

g) 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

答:

select s.*, b.avgsal from student s,

(select sc.sid,avg(score) avgscore from sc ,

(select sid from sc where score < 60 group by sid having(count(*) >=2)) a

where sc.sid = a.sid group by sc.sid) b

where s.sid = b.sid;

分析:

步骤1:查询所有两门以上不及格的学员id

select sid from sc where score < 60 group by sid having(count(*) >=2);

步骤2:步骤1 结果与真实表sc 做连接,算平均成绩

select sc.sid,avg(score) avgscore from sc,

(select sid from sc where score < 60 group by sid having(count(*) >=2)) a

where sc.sid = a.sid group by sc.sid;

步骤3:步骤2 结果与真实表student 做连接,查学员姓名

select s.*, b. avgscore from student s,

(select sc.sid,avg(score) avgscore from sc ,

(select sid from sc where score < 60 group by sid having(count(*) >=2)) a

where sc.sid = a.sid group by sc.sid) b

where s.sid = b.sid;

思路2:

步骤1:同上

步骤2:步骤1 结果与真实表sc,student 共3 张表做连接

select s.*,avg(sc.score) avgscore from student s, sc,

(select sid from sc where score < 60 group by sid having(count(*) >=2)) a

where s.sid = sc.sid and s.sid = a.sid;

步骤3:可以发现,该结果中sid, name, dept, age 都是取值都相同,按照这些列直接进

行分组即可:

select s.*,avg(sc.score) avgscore from student s, sc,

(select sid from sc where score < 60 group by sid having(count(*) >=2)) a

where s.sid = sc.sid and s.sid = a.sid group by s.sid, https://www.wendangku.net/doc/765404393.html,, s.dept, s.age;

h) 列出既学过1 号课程,又学过2 号课程的所有学生姓名

答:

select https://www.wendangku.net/doc/765404393.html, from student s inner join

(select sc.sid from sc where sc.cid in (1,2) group by sid having (count(*) = 2)) a

on (s.sid = a.sid);

分析:要点是不仅要学过1,2 号课程in (1,2),并且要求同时学过此两门课count(*) = 2 i) 列出1 号课成绩比2 号课成绩高的所有学生的学号,姓名和1 号课和2 号课的成

答:

select s.sid, https://www.wendangku.net/doc/765404393.html,, sc1.score, sc2.score from sc sc1,sc sc2,student s

where s.sid = sc1.sid and sc1.sid = sc2.sid

and sc1.cid = 1 and sc2.cid = 2 and sc1.score > sc2.score;

分析:要点在于自连接,把成绩表拆成两张表来看,sc1 中只考虑1 号课,sc2 中只考虑2 号课且sc1.score > sc2.score;最后再考虑将结果与student 表连接查询姓名。

05. 现有test 表,表中数据如图所示:

要求按照格式如下输出结果:

a) 连续的编号要求如下格式

b) 不连续的编号要求如下格式

答:

a) 求连续的,考察知识点:rownum,子查询

分析:查看连续id 与rownum 之间的关系,运行

select id, rownum, id-rownum from test;

参考下图看出规律:

可以发现,id-rownum 取值相同的,就是那些id 编号连续的。按照id-rownum 分组并求每组的最大,最小值即可。

select a.* from

(select min(id) begin, max(id) end from test group by (id - rownum) order by id - rownum) a; b) 不连续的,考察知识点,rownum,子查询

分析:

步骤一:

查询有上一条记录的个数

select id, (select count(*) from test where id+1 = t1.id) from test t1;

查询有下一条记录的个数

select id, (select count(*) from test where id-1 = t1.id) from test t1;

分析结果可知,个数为0 的即为我们所需要的。

步骤二:

select id, rownum r1 from test t1 where (select count(*) from test where id+1 = t1.id) = 0; select id, rownum r2 from test t1 where (select count(*) from test where id-1 = t1.id) = 0;

分析结果可知,要求如上图格式的数据将查询1 中的r1-1 = 查询2 中的r2 列即可:select b.id begin, a.id end from

(select id, rownum r1 from test t1 where (select count(*) from test where id+1 = t1.id) = 0) a, (select id, rownum r2 from test t1 where (select count(*) from test where id-1 = t1.id) = 0) b where r1-1=r2;

06. 根据EMP 表数据产生如下格式的报表(统计各部门,各职位的人数)

答:方法1 考察知识点case

select deptno,

count(case when job = 'PRESIDENT' then 1 else null end) PRESIDENT,

count(case when job = 'MANAGER' then 1 else null end) MANAGER,

count(case when job = 'CLERK' then 1 else null end) CLERK,

count(case when job = 'SALESMAN' then 1 else null end) SALESMAN,

count(case when job = 'ANALYST' then 1 else null end) ANALYST

from emp group by deptno order by deptno;

方法2 考察知识点:自连接

select d.deptno,

count(distinct PRESIDENT.empno) PRESIDENT,

count(distinct MANAGER.empno) MANAGER,

count(distinct CLERK.empno) CLERK,

count(distinct SALESMAN.empno) SALESMAN,

count(distinct ANALYST.empno) ANALYST from dept d

left join emp PRESIDENT

on (d.deptno=PRESIDENT.deptno and PRESIDENT.job='PRESIDENT')

left join emp MANAGER

on (d.deptno=MANAGER.deptno and MANAGER.job='MANAGER')

left join emp CLERK

on (d.deptno=CLERK.deptno and CLERK.job='CLERK')

left join emp SALESMAN

on (d.deptno=SALESMAN.deptno and SALESMAN.job='SALESMAN')

left join emp ANALYST

on (d.deptno=ANALYST.deptno and ANALYST.job='ANALYST')

group by d.deptno order by d.deptno;

分析:通过dept 表多次左外连接emp 表,比如说

select d.deptno, d.dname, e.empno, e.job from dept d

left join emp e on (d.deptno = e.deptno and e.job='CLERK');

结果如下:

可以看出这是求出每个部门职位为CLERK 的员工,将此结果按deptno 分组求个数:select d.deptno, count(empno) CLERK from dept d

left join emp e on (d.deptno = e.deptno and e.job='CLERK')

group by d.deptno order by d.deptno;

其中CLERK 列即为最终结果所需列。

如此类推,连接一次,求出一列,但需要注意,多表连接后,最后结果中会有重复记录,因此使用count(distinct empno)排除重复记录后再计算个数才为正确结果。

07. 根据EMP 表数据产生如下格式的报表(统计各职位,各部门的人数)(06 题的变体)

答:方法1 考察知识点case

select job,

count(case when deptno = 10 then 1 else null end) "10",

count(case when deptno = 20 then 1 else null end) "20",

count(case when deptno = 30 then 1 else null end) "30"

from emp group by job order by job;

思路:同第06 题,注意列别名如果为数字开头必须使用双引号。

方法2 考察知识点:自连接

select e.job, count(distinct d10.empno) "10",count(distinct d20.empno) "20", count(distinct

d30.empno) "30" from

(select job from emp group by job) e

left join emp d10 on (e.job=d10.job and d10.deptno = 10)

left join emp d20 on (e.job=d20.job and d20.deptno = 20)

left join emp d30 on (e.job=d30.job and d30.deptno = 30) group by e.job order by job;

08. 按照如下格式显示7369 号员工的信息

答:考察知识点UNION

select empno, 'ENAME' as KEY, ename VALUE from emp where empno = 7369

union

select empno, 'JOB', job from emp where empno = 7369

union

select empno, 'HIREDATE', to_char(hiredate,'yyyy-mm-dd') a from emp where empno = 7369 union

select empno, 'MGR', to_char(mgr) from emp where empno = 7369

union

select empno, 'SAL', to_char(sal) from emp where empno = 7369

union

select empno, 'COMM', to_char(comm) from emp where empno = 7369

union

select empno, 'DEPTNO', to_char(deptno) from emp where empno = 7369;

分析:使用UNION 可以将多次查询结果连接起来,要注意,每条查询的列的个数和数据类型必须一致。因此在查询时都使用了to_char 函数将第二列同一转换为字符型。

Part IV(扩展知识点)

01. 分级查询

Oracle 提供其他数据库没有的分级查询操作:

例如:希望通过一次查询以树状结构显示EMP 表中的所有上下级关系

select level, lpad(' ',level-1) || empno empno, ename, mgr,deptno from emp start with

empno=7839 connect by prior empno = mgr;

level 是ORACLE 关键字表示分级级别,其中lpad(' ',level-1) 函数是根据level 的值生成level-1 个空格

又如:希望通过某个员工回溯它的所有上级,包括上级的上级

select level, lpad(' ',level-1) || empno, ename, mgr, deptno from emp start with empno=7369 connect by empno = prior mgr;

02. CUBE(立方查询)

如果想统计EMP 表中的所有职员数,每个部门的职员数,每种职位的职员数,每个部

门每种职位的职员数,使用普通分组查询需要查询4 次。但利用ORACLE 的增强语法,

可以非常方便的完成此类查询(经常用于生成报表)

例如:

select count(*),deptno,job,grouping_id(deptno,job) from emp group by cube (deptno,job) order by grouping_id(deptno,job) ;

可以生成如下形式的报表:

03. 如何考察查询效率

1) 在SQL-PLUS 中执行set autotrace on explain

2) 执行查询

返回结果中cost(成本)与bytes(字节数)都是越低越好。

04. 闪回查询

ORACLE 的特点还有能够更快速的恢复之前误操作的数据,这是通过闪回日志完成的例如:查询20 分钟之前的emp 表

select * from emp as of timestamp sysdate - interval '20' minute;

再如:恢复5 分钟之前的7369 号员工姓名

update emp e set ename =

(select ename from emp

as of timestamp systimestamp - interval '5' minute where empno=e.empno )

where empno=7369;

甚至可以查询及恢复被删除的表

select * from user_recyclebin;

flashback table 表to before drop;

05. 正则表达式

ORACLE 在建表或查询时提供正则表达式支持:

例如:查询名字以S 作为开头字母的员工

select * from emp where regexp_like(ename ,'^S');

例如:替换电话号码显示方式

select regexp_replace('123.321.1234', '([0-9]{3})\.([0-9]{3})\.([0-9]{4})', '(\1) \2-\3')

from dual;

例如:取得email 地址中的用户名

select regexp_substr('yihang@https://www.wendangku.net/doc/765404393.html,', '^[^@]+') from dual;

例如:取得email 地址中的域名

select regexp_substr('yihang@https://www.wendangku.net/doc/765404393.html,', '[^@]+$') from dual;

06. 如何加注释

建表时给表和列加注释是一个比较好的数据库编程习惯

例如:表加注释

comment on table 表is '表注释';

例如:列加注释

comment on column 表.列is '列注释';

例如:查表注释

select * from user_tab_comments where table_name = 表名;

例如:查列注释

select * from user_col_comments where table_name = 表名;

几个Oracle的笔试题

Oracle笔试试题 1. SQL必备 <选择题每空 1 分共 14题> 1. 如果在where子句中有两个条件要同时满足,应该用以下哪个逻辑符来连接 ( ) A.OR B.NOT C.AND D.NONE 2. 外连接的条件可以放在以下的那一个子句中( ) A.FROM B.WEHRE C.SELECT D.HAVING E.GROUP BY F.ORDER BY 3. 在从两个表中查询数据时,连接条件要放在哪个子句中( ) A.FROM B.WHERE C.SELECT D.HAVING E.GROUP BY 4. 用以下哪个子句来限制分组统计结果信息的显示( ) A.FROM B.WEHRE C.SELECT D.HAVING E.GROUP BY F.ORDER BY 5. 以下需求中哪个需要用分组函数来实现( ) A.把ORDER表中的定单时间显示成 'DD MON YYYY' 格式 B.把字符串 'JANUARY 28, 2000' 转换成日期格式 C.显示PRODUCT 表中的COST 列值总量 D.把PRODUCT表中的DESCRIPTION列用小写形式显示 6. 以下那些命令可以暗含提交操作( )

A.GRANT B.UPDATE C.SELECT D.ROLLBACK 7.RDBMS是下列哪一项的缩写( ) A. Relational DataBase Management System(关系数据库管理系统) B. Relational DataBase Migration System(关系数据库移植系统) C. Relational Data Migration System(关系数据移植系统) D. Relational DataBase Manage System(关系数据库管理系统) 8.INSERT 是( ) A. DML语句 B. DDL语句 C. DCL语句 D. DTL语句 9.SELECT CHR(66) FROM DUAL的结果是( ) A. Z B. S C. B D. 都不是 10.函数返回一个值除以另一个值后的余数( ) A. MOD B. ABS C. CEIL D. 以上都不是 11. 什么锁用于锁定表,仅允许其他用户查询表中的行,行不允许插入,更新, 或删除行( ) A. 共享 B. 排他 C. 共享更新 D. 以上都不是 12.什么是oracle提供的一个对象,可以生成唯一的连续的整数( ) A. 同义词 B. 序列 C. 视图 D. 没有 13. 那种类型的约束可以自动创建索引( ) A.CHECK B.UNIQUE

华为面试题(附答案)Oracle

一、技术问题部分(数据库部分) 1、表空间的管理方式有哪几种? 数据字典管理方式 本地文件管理方式 2、谈谈你对索引的理解? 索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据块的I/O次数,因此可以显著提高性能。 3、说说索引的组成? 索引列、rowid 4、分区表用过么?谈谈分区表的应用? 分区表在对表的DML的并行处理上有极大得优势,而且可以一部分设为只读,用在销售记录,医院处方等地方!! 5、你对分区表的理解?怎样截断分区表一个分区的记录? 一个分区表有一个或多个分区,每个分区通过使用范围分区、散列分区、或组合分区分区的行 分区表中的每一个分区为一个段,可各自位于不同的表空间中 对于同时能够使用几个进程进行查询或操作的大型表分区非常有用 alter table table_name truncate partition partition_name; 6、物理文件有哪几种?控制文件包含了什么信息? 1)数据文件2)控制文件3)日志文件 包含维护和验证有选举权据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个有选举权据库至少需要一个控制文件 7、表空间用完了如何增加? 三种种扩展方式: 1 增加数据文件alter tablespace name add datafile …路径? size 4M; 2 扩展数据文件大小alter database datafile …路径? resize 4M; 3 把数据文件设为自动增长 alter database datafile …路径? autoextend on next 1M maxsize 20M; 8、SGA包含几部分? Shared pool(共享池),DataBase Buffer Cache(数据缓冲区) Redo Log Buffer(重做日志缓冲区), Large Pool,大池,JAVA池。 9、DECODE函数的用法? DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。初看一下,DECODE 只能做等于测试,但刚才也看到了,我们通过一些函数或计算替代value,是可以使DECODE函数具备大于、小于或等于功能。还可以转化表结构! 10、DELETE和TRUNCATE的区别? 答:1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有

java、sql、oracle面试题汇总

1.(口述题)请简述迅雷、BT等p2p下载软件的实现原理。如何资源分布。解释:A想来B家做客,但是遭到了B的管家NAT B的拒绝,理由是:我从来没有听我家B提过你的名字,这时A找到了A,B都认识的朋友server,要求server 给B报一个信,让B去跟管家说A是我的朋友,于是,B跟管家NAT B说,A是我认识的朋友,这样A的访问请求就不会再被管家NAT B所拒绝了.简而言之,UDP打洞就是一个通过server保存下来的地址使得彼此之间能够直接通信的过程,server只管帮助建立连接,在建立间接之后就不再介入了. 2.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么解释:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。 3.A=10,b=20在不使用第三变量使两值互换 解释: a=10,b=8 a=a-b b=b+a a=b-a 4. override与重载的区别 解释:override是把继承于父类的方法给覆盖掉 重载是同一个函数名接受不同类型、个数的参数,完成不同的功能,调用起来方便 5.抽象类跟接口的区别 解释:抽象类可以有非抽象方法,接口中只能有抽象方法。接口可以实现多继承。 6.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code 会不会被执行,什么时候被执行,在return前还是后? 解释:inally里的代码会执行,在return之前执行 7.实现一个冒泡排序 解释: ArrayList list=new ArrayList(); list.add(76); list.add(4); list.add(786); list.add(43); list.add(21); list.add(432); list.add(10); for(int i=0;i

Oracle_DBA面试题

一. SQL tuning 类 1:列举几种表连接方式 hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms_xplan.display); 或者: SQL>EXPLAIN PLAN FOR SELECT * FROM EMP; SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE')); 3:如何使用CBO,CBO与RULE的区别 Rule Based Optimizer(RBO):基于规则 Cost Based Optimizer (CBO):基于成本,或者讲统计信息。 在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。RBO遵循简单的分级方法学,使用15种级别要点,当接收到查询,优化器将评估使用到的要点数目, 然后选择最佳级别(最少的数量)的执行路径来运行查询。 CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。 4:如何定位重要(消耗资源多)的SQL select sql_text from v$sql where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000); 5:如何跟踪某个session的SQL exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace); select sid,serial# from v$session where sid = (select sid from v$mystat where rownum = 1); exec dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,'');

Oracle面试题

连接用户: 超级用户:conn sys 用户名/密码as sysdba 普通用户:conn system 用户名/密码 创建表空间: CREATE TABLESPACE epet_tablespace DATAFILE 'E:\app\Administrator\oradata\orcl\' SIZE 100M autoextend on next 32m maxsize 2048m 删除表空间、对象及数据文件: ( drop tablespace study including contents and datafiles; 为表空间创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] CONNECT:临时用户 RESOURCE:更为可靠和正式的用户 DBA:数据库管理员角色,拥有管理数据库的最高权限 #分配权限或角色 GRANT privileges or role TO user; ~ #撤销权限或角色 REVOKE privileges or role FROM user; CONNECT角色:--是授予最终用户的典型权利,最基本的

CREATE SESSION --建立会话 RESOURCE 角色:--是授予开发人员的 CREATE CLUSTER --建立聚簇 CREATE PROCEDURE --建立过程 CREATE SEQUENCE --建立序列 CREATE TABLE --建表 CREATE TRIGGER --建立触发器 《 CREATE TYPE --建立类型 数据查询语言 (DQL:Data Query Language)用于检索数据库表中存储的行。可以使用SQL的SELECT语句编写查询语句。 数据操作语言 (DML:Data Manipulation Language)用于修改表的内容。DML语句有三种,分别为Insert,Update,Delete。 事务控制语言 (TCL:Transaction Control Language)用于将对行所作的修改永久性的存储到表中,或者取消这些修改操作。TC语句共有3种:Commit 永久性的保存对行所作的修改。Rollback 取消对行所作的修改。SavePoint 设置一个“保存点”,可以将对行所作的修改回滚到此处。 数据定义语言 (DDL:Data Definition Language)用于定义构成数据库的数据结构,例如表。DDL语句有5种基本类型:分别为 Create 创建数据库结构。Alter 修改数据库结构。Drop 删除数据库结构。 ¥ 数据控制语言

Oracle精选面试题(附答案及分析)

Oracle精选面试题 1.显示10 号部门的所有经理('MANAGER')和20 号部门的所有职员('CLERK')的详细信息 答案: Select * from emp where deptno=10 and job=’MANAGER’ or deptno=20 and job=’clerk’; select * from emp where deptno = 10 and job = 'MANAGER' or deptno = 20 and job ='CLERK'; 2.显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息 答案: Select * from emp where ename note like ‘%L%’ or ename like ‘%SM%’; select * from emp where ename not like '%L%' or ename like '%SM%'; 3.显示各个部门经理('MANAGER')的工资 答案: select deptno,emname, salary from emp_wqq where job='MANAGER'; 4.显示佣金(COMM)收入比工资(SAL)高的员工的详细信息 答案: select * from emp where comm > sal; 5.把hiredate 列看做是员工的生日,求本月过生日的员工 答案: select * from emp where to_char(hiredate, 'mm') = to_char(sysdate , 'mm'); 6.把hiredate 列看做是员工的生日,求下月过生日的员工 答案: select * from emp where to_char(hiredate, 'mm') = to_char(add_months(sysdate,1) , 'mm'); 7.求1982 年入职的员工 答案: select * from emp where to_char(hiredate,'yyyy') = '1982'; 8.求1981 年下半年入职的员工 答案: select * from emp where hiredate between to_date('1981-7-1','yyyy-mm-dd') and to_date('1982-1-1','yyyy-mm-dd') - 1; 9.求1981 年各个月入职的的员工个数 答案: select count(*), to_char(trunc(hiredate,'month'),'yyyy-mm')

ORACLE数据库工程师面试题目

1. 解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘) 2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢? 解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。 3. 如何转换init.ora到spfile? 解答:使用create spfile from pfile 命令. 4. 解释data block , extent 和segment的区别(这里建议用英文术语) 解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment. 5. 给出两个检查表结构的方法 解答:1.DESCRIBE命令 2.DBMS_METADATA.GET_DDL 包 6. 怎样查看数据库引擎的报错 解答:alert log. 7. 比较truncate和delete 命令 解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动HWK,不需要rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时间. 8. 使用索引的理由 解答:快速访问表中的data block 9. 给出在STAR SCHEMA中的两种表及它们分别含有的数据 解答:Fact tables 和dimension tables. fact table 包含大量的主要的信息而dimension t ables 存放对fact table 某些属性描述的信息

oracle数据库面试题目汇总

1. 对字符串操作的函数? 答:ASCII()--函数返回字符表达式最左端字符的ASCII 码值 CHR()--函数用于将ASCII 码转换为字符 --如果没有输入0 ~ 255 之间的ASCII 码值CHR 函数会返回一个NULL 值 --应该是必须给chr()赋数字值 concat(str,str)连接两个字符串 LOWER()--函数把字符串全部转换为小写 UPPER()--函数把字符串全部转换为大写 LTRIM()--函数把字符串头部的空格去掉 RTRIM()--函数把字符串尾部的空格去掉 TRIM() --同时去掉所有两端的空格 实际上LTRIM(),RTRIM(),TRIM()是将指定的字符从字符串中裁减掉 其中LTRIM(),RTRIM()的格式为xxxx(被截字符串,要截掉的字符串), 但是TRIM()的格式为TRIM(要截掉的一个字符from 被截的字符串) SUBSTR()--函数返回部分字符串 INSTR(String,substring) --函数返回字符串中某个指定的子串出现的开 始位置,如果不存在则返回0 REPLACE(原来的字符串,要被替换掉的字符串,要替换成的字符串) SOUNDEX()--函数返回一个四位字符码 --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数

对数字和汉字均只返回NULL 值 2、事务概念 答案:事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。事务具有以下的作用: * 一致性:同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据。 * 可恢复性:一旦系统故障,数据库会自动地完全恢复未完成的事务。 3、oracle中查询系统时间 答:select sysdate from dual 4、触发器的作用,什么时候用触发器,创建触发器的步骤,触发器里是否可以有 commit, 为什么? 答案:触发器是可以由事件来启动运行的,存在于数据库服务器中的一 个过程。 他的作用:可以实现一般的约束无法完成的复杂约束,从而实现更为复 杂的完整性要求。 使用触发器并不存在严格的限定,只要用户想在无人工参与的情况下完 成一般的定义约束不可以完成的约束,来保证数据库完整性,那么就可 以使用触发器。 由于触发器主要是用来保证数据库的完整性的,所以要创建一个触发器,首先要明确该触发器应该属于那一种(DML,INSTEAD OF,SYSTEM)

Oracle面试题库_3

Oracle面试题库 END LOOP;7. 当在一个PLSQL块中通过查询得到一个值,但是没有任何值返回时,会产生异常吗?如果产生,是什么异常?A 不会有异常,只不过没有结果而已B 有异常,异常为No_data_foundC 有异常,异常为Value_erroD 编译都不通过8. 在PLSQL块中处理异常的语句是 A EXCEPTIONIF EXCEPTION_NAME THENDBMS_OUTPUT.PUT_LINE();END;B EXCEPTIONWHEN EXCEPTION_NAME THENDBMS_OUTPUT.PUT_LINE();END EXCEPTION ;C WHEN EXCEPTION_NAME THENDBMS_OUTPUT.PUT_LINE();D BEGINNULL;EXCEPTIONWHEN EXCEPTION_NAME THENDBMS_OUTPUT.PUT_LINE();END ;9. 当用户在PLSQL块中,像抛出自定义异常或者是系统异常时,所使用的关键字是 A THROWB RAISEC RAISE_APPLICATION_ERRORD EXCEPTION10. 在自定义异常中,用户可用的错误号范围在A 20000 ~ 29999B -20000 ~ -20999C 1~65535D 没有限制11. 阅读代码DECLAREBEGINDBMS_OUTPUT.PUT_LINE(‘外不快’);DECLAREMYEXCE EXCEPTION;BEGINRAISE MYEXCE;END;EXCEPTIONWHEN MYEXCE THENDBMS_OUTPUT.PUT_LINE(‘异常捕获’);END;出现的结果是

oracle常见面试题及答案

需求: 写一个邮件系统, 采用oracle+jsp+servlet来完成. 1.创建一个表空间。 2.创建一个用户,将用户赋到表空间上. 3.给用户赋权限. 4.以新建用户登录,创建一个程序包. 5.在表空间上建表,两个表 用户表 Id int Uname varchar Upass varchar 邮件表 eId int Title varchar Contents varchar Uid int 外键 附件表 Id int Filepath varchar Eid int 外键 6.作增,删,改,查的操作,全部封装到存储过程中 7.写一个java程序来调用. 1.解释FUNCTION,PROCEDURE和PACKAGE区别 答:function 和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure 不需要返回任何值, 而function将返回一个值. 在另一方面,Package是为了完成一个商业功能的一组function和procedure的集合。

2.取某个序列的当前值的PL/SQL语句怎么写? 答:SELECT 序列名.CURRVAL FROM DUAL; Create sequence 名字 start with x increment by y maxvalue z nocycle 3.说明ORACLE数据库实例与ORACLE用户的关系? 答:实例可以包含多个用户,一个用户只能在一个实例下 4.创建用户时,需要赋予新用户什么权限才能使它连上数据库? 答:grant CONNECT [on 表名] to 用户名 5.比较truncate和delete命令? 答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL(data defining language数据定义语言),它移动HWK,不需要rollback segment(处理事务回滚操作)而Delete是DML(data manufacturing language数据操作语言)操作,需要rollback segment(处理事务回滚操作)且花费较长时间 6.给出数据的相关约束类型? 答:主键约束,外键约束,非空约束,唯一约束,检查约束。 7.说明索引的类型与作用? 答:索引类型上分为聚集索引,非聚集索引. 其作用是加快查询速度。 8.获取某个字符字段的最后3个字符的函数是什么? 答:select substr (字段,(length(字段)-3)) from 表 9.取当前系统时间点日期(不包括年月)的SQL写法是怎样的? 答:Select substr (to_char(sysdate,’YYYYMMDDh24hh:MM:SS’),5) from dual; to_char(sysdate,’YYYYMMDDh24hh:MM:SS’) 10.返回大于等于N的最小整数值? 答:select ceil(1.5) from dual; floor(1.5) 11.将根据字符查询转换后结果,规则为:’A’转换为’男’,’B’转换为’女’,其他字符转换为’未知’,请用一个SQL语句写出。 答:select decode(字符,’A’,’男’,’B’,’女’,’未知’) from dual; 12.如何搜索出前N条记录? 答:select * from 表 where Rownum <= N;

Oracle面试题库1

1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANGUAGE SQL D 都不对 2 _____引擎执行PL/SQL块 A SQL B PL/SQL C ORACLE D 都不对 3 一个对象可以呈现多种形式的能力称为 A 多态 B 继承 C 封装 D 以上都不对 4 PLSQL块是由哪几个部分组成 A DECLARE BEGIN END B BEGIN END C EXCEPTION BEGIN END D DECLAR E BEGIN EXCEPTION END 5 看下面代码,正确的是 A DECLARE (‘定义部分’); BEGIN (‘语句部分’); END; B BEGIN NUM NUMBER:=100; (‘NUM 的值为:’||NUM); END; C DECLARE NUM NUMBER:=100; BEGIN NUM:=NUM+NUM/2; (‘NUM 的值为:’||NUM); END; D BEGIN NUM NUMBER:=100; DECLARE NUM:=NUM+NUM/2; (‘NUM 的值为:’||NUM); END;

6 看下面语句正确的是 A IF(N%M=0) THEN (‘这是一个偶数’); ELSEIF(N%M=1) THEN (‘这是一个奇数’); END IF; B DECLARE VAR NUMBER:=0; BEGIN VAR:=&V; CASE WHEN VAR=1 THEN (‘A’); WHEN VAR=2 THEN (‘B’); ELSE (‘O’); END CASE; END; C DECLARE I NUMBER:=0; BEGIN FOR I IN 10..20 LOOP (I); END LOOP; END; D LOOP (I); END LOOP; 7. 当在一个PLSQL块中通过查询得到一个值,但是没有任何值返回时,会产生异常吗如果产生,是什么异常? A 不会有异常,只不过没有结果而已 B 有异常,异常为No_data_found C 有异常,异常为Value_erro D 编译都不通过 8. 在PLSQL块中处理异常的语句是 A EXCEPTION IF EXCEPTION_NAME THEN (); END; B EXCEPTION WHEN EXCEPTION_NAME THEN

Oracle数据库面试题目

Oracle常见面试题 1、对数据库SQL2005、ORACLE熟悉吗? SQL2005是微软公司的数据库产品。是一个RDBMS数据库,一般应用在一些中型数据库的应用,不能跨平台。 ORACLE是ORACLE公司的数据产品,支持海量数据存储,支持分布式布暑,支持多用户,跨平台,数据安全完整性控制性能优越,是一个ORDBMS,一般用在大型公司。 2、能不能设计数据库?如何实现数据库导入与导出的更新 使用POWERDISINE工具的使用,一般满足第三范式就可以了。EXP与IMP数据库的逻辑导入与导出 3、如何只显示重复数据,或不显示重复数据 显示重复:select * from tablename group by id having count(*)>1 不显示重复:select * from tablename group by id having count(*)=1 4、什么是数据库的映射 就是将数据库的表与字段对应到模型层类名与属性的过程. 5、写分页有哪些方法,你一般用什么方法?用SQL语句写一个分页? 如何用存储过程写分页? 在SQLSERVER中使用TOP分页,在ORACLE中用ROWNUM,或分析函数 ROW_NUMBER 使用TOP: select top 20,n.* from tablename n minus select top 10,m.* from tablename m 使用分析函数: select * from (select n.*,row_number() over(order by columnname) num from tablename n) where num>=10 and num <=20; 使用过程时,只要将分页的范围用两个参数就可以实现。在ORACLE中,要将过程封装在包里,还要用动态游标变量才能实现数据集的返回。 6、ORACLE中左连接与右连接 左连接:LEFT JOIN 右连接:RIGHT JOIN select n.column,m.column from tablename1 n left join tablename2 m on n.columnname=m.columnname 用WHERE实现: select n.column,m.column from tablename1 n,tablename2 m where n.columnname(+)=m.columnname

Oracle_sql面试题及答案整理

Oracle面试题及答案整理 1、表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,显示班级,成绩两个字段。 select fclass,max(fscore) from table1 group by fclass,fid 2、有一个表table1有两个字段FID,Fno,字都非空,写一个SQL语句列出该表中一个FID对应多个不同的Fno的纪录。 类如: 101a1001 101a1001 102a1002 102a1003 103a1004 104a1005 104a1006 105a1007 105a1007 105a1007 结果: 102a1002 102a1003 104a1005 104a1006 select t2.* from table1 t1, table1 t2 where t1.fid = t2.fid and t1.fno <> t2.fno; 3、有员工表empinfo ( Fempno varchar2(10) not null pk, Fempname varchar2(20) not null, Fage number not null, Fsalary number not null ); 假如数据量很大约1000万条;写一个你认为最高效的SQL,用一个SQL计算以下四种人: fsalary>9999 and fage > 35 fsalary>9999 and fage < 35 fsalary <9999 and fage > 35 fsalary <9999 and fage < 35 每种员工的数量; select sum(case when fsalary>9999 and fage>35 then 1 else 0 end), sum(case when fsalary>9999 and fage<35 then 1 else 0 end), sum(case when fsalary<9999 and fage>35 then 1 else 0 end),

Oracle数据库面试题汇总

Oracle数据库面试题汇总 答:ASCII() –函数返回字符表达式最左端字符的ASCII 码值CHR() –函数用于将ASCII 码转换为字符–如果没有输入0 ~ 255 之间的ASCII 码值CHR 函数会返回一个NULL 值–应该是必须给chr()赋数字值concat(str,str)连接两个字符串LOWER() –函数把字符串全部转换为小写UPPER() –函数把字符串全部转换为大写LTRIM() –函数把字符串头部的空格去掉RTRIM() –函数把字符串尾部的空格去掉TRIM() –同时去掉所有两端的空格实际上LTRIM(),RTRIM(),TRIM()是将指定的字符从字符串中裁减掉其中LTRIM(),RTRIM()的格式为xxxx(被截字符串,要截掉的字符串),但是TRIM()的格式为TRIM(要截掉的一个字符from 被截的字符串)SUBSTR() –函数返回部分字符串INSTR(String,substring) –函数返回字符串中某个指定的子串出现的开始位置,如果不存在则返回0REPLACE(原来的字符串,要被替换掉的字符串,要替换成的字符串)SOUNDEX() –函数返回一个四位字符码–SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回NULL 值2、事务概念答案:事务是这样一种机制,它确保多个SQL 语句被当作单个工作单元来处理。事务具有以下的作用:* 一致性:同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据。* 可恢复性:一旦系统故障,数据库会自动

地完全恢复未完成的事务。3、oracle中查询系统时间答:select sysdate from dual4、触发器的作用,什么时候用触发器,创建触发器的步骤,触发器里是否可以有commit, 为什么?答案:触发器是可以由事件来启动运行的,存在于数据库服务器中的一个过程。他的作用:可以实现一般的约束无法完成的复杂约束,从而实现更为复杂的完整性要求。使用触发器并不存在严格的限定,只要用户想在无人工参与的情况下完成一般的定义约束不可以完成的约束,来保证数据库完整性,那么就可以使用触发器。由于触发器主要是用来保证数据库的完整性的,所以要创建一个触发器,首先要明确该触发器应该属于那一种(DML,INSTEAD OF,SYSTEM)因为他们各有个的用途;其次就是要确定触发器被触发以后所设计到的数据。出发器中不可以使用COMMIT。5.数字函数abs()绝对值exp(value)e的value次幂ceil()大于等于该值的最小整数floor()小于等于该值的最大整数trunc(value,precision)保留precision个小数截取value round(value,precision)保留precision个小数对value进行四舍五入sign()根据值为正负零返回1,-1,0 mod()取模操作power(value,exponent)value的exponent次幂sqrt()求平方根1. 初级4、关系数据库系统与文件数据库系统的区别在那里?关系数据库系统一般适用那些方面?答案:关系数据库系统文件系统的区别在于:首先,关系性数据库的整体数据是结构化的,采用关系数据模型来描述,这是它与文件系统的根本区别。(数据模型包括:数据结构,数据操作以及完整性约束条件)其次,关系数据库系统的共享性高,

oracle面试题集锦

本文是Oracle技术人员求职面试题集锦,答案仅供参考…… 1. 解释冷备份和热备份的不同点以及各自的优点 解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘) 2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢? 解答:重建控制文件,用带backup control file 子句的recover 命令恢复 数据库。 3. 如何转换init.ora到spfile? 解答:使用create spfile from pfile 命令. 4. 解释data block , extent 和segment的区别(这里建议用英文术语) 解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象 拥有的所有extents被称为该对象的segment. 5. 给出两个检查表结构的方法 解答:1。DESCRIBE命令 2. DBMS_METADATA.GET_DDL 包 6. 怎样查看数据库引擎的报错 解答:alert log. 7. 比较truncate和delete 命令 解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动HWK,不需要rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时间. 8. 使用索引的理由 解答:快速访问表中的data block 9. 给出在STAR SCHEMA中的两种表及它们分别含有的数据 解答:Fact tables 和dimension tables. fact table 包含大量的主要的信息而dimension tables 存放对fact table 某些属性描述的信息 10. FACT Table上需要建立何种索引? 解答:位图索引(bitmap index) 11. 给出两种相关约束? 解答:主键和外键 12. 如何在不影响子表的前提下,重建一个母表 解答:子表的外键强制实效,重建母表,激活外键 13. 解释归档和非归档模式之间的不同和它们各自的优缺点 解答:归档模式是指你可以备份所有的数据库transactions并恢复到任意一个时间点。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能上的少许提高 . 14. 如何建立一个备份控制文件? 解答:Alter database backup control file to trace. 15. 给出数据库正常启动所经历的几种状态? 解答:

Oracle数据库DBA面试题

数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复 操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘) 2. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢 解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。 3. 如何转换到spfile 解答:使用create spfile from pfile 命令 . 4. 解释data block , extent 和segment的区别(这里建议用英文术语) 解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一 个数据库对象拥有的所有extents被称为该对象的segment. 5. 给出两个检查表结构的方法 解答:1、DESCRIBE命令 2、包 6. 怎样查看数据库引擎的报错 解答:alert log. 7. 比较truncate和delete 命令 解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动HWK,不需要rollback segment .而Delete是DML操作 , 需要rollback segment 且花费较长时间. 8. 使用索引的理由 解答:快速访问表中的data block 9. 给出在STAR SCHEMA中的两种表及它们分别含有的数据 解答:Fact tables 和dimension tables. fact table 包含大量的主要的信息而dimension tables 存放对fact table 某些属性描述的

极详细oracle数据库面试题目汇总

1.对字符串操作的函数? 答:ASCII() --函数返回字符表达式最左端字符的ASCII 码值 CHR() --函数用于将ASCII 码转换为字符 --如果没有输入0 ~ 255 之间的ASCII 码值CHR 函数会返回一个NULL 值 --应该是必须给chr()赋数字值 concat(str,str)连接两个字符串 LOWER() --函数把字符串全部转换为小写 UPPER() --函数把字符串全部转换为大写 LTRIM() --函数把字符串头部的空格去掉 RTRIM() --函数把字符串尾部的空格去掉 TRIM() --同时去掉所有两端的空格 实际上LTRIM(),RTRIM(),TRIM()是将指定的字符从字符串中裁减掉 其中LTRIM(),RTRIM()的格式为xxxx(被截字符串,要截掉的字符串),但是TRIM()的格式 为TRIM(要截掉的一个字符from 被截的字符串) SUBSTR() --函数返回部分字符串 INSTR(String,substring) --函数返回字符串中某个指定的子串出现的开始位置,如果不存在 则返回0 REPLACE(原来的字符串,要被替换掉的字符串,要替换成的字符串) SOUNDEX() --函数返回一个四位字符码 --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回NULL 值 2、事务概念 答案:事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。 事务具有以下的作用: * 一致性:同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据。 * 可恢复性:一旦系统故障,数据库会自动地完全恢复未完成的事务。 3、oracle中查询系统时间 答:select sysdate from dual 4、触发器的作用,什么时候用触发器,创建触发器的步骤,触发器里是否可以有commit, 为 什么? 答案:触发器是可以由事件来启动运行的,存在于数据库服务器中的一个过程。 他的作用:可以实现一般的约束无法完成的复杂约束,从而实现更为复杂的完整性 要求。 使用触发器并不存在严格的限定,只要用户想在无人工参与的情况下完成一般的定 义约束不可以完成的约束,来保证数据库完整性,那么就可以使用触发器。 由于触发器主要是用来保证数据库的完整性的,所以要创建一个触发器,首先要明 确该触发器应该属于那一种(DML,INSTEAD OF,SYSTEM)因为他们各有个的 用途;其次就是要确定触发器被触发以后所设计到的数据。 出发器中不可以使用COMMIT。 5.数字函数 abs()绝对值exp(value)e的value次幂ceil()大于等于该值的最小整数floor()小于

相关文档