oracle面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle面试题相关的知识,希望对你有一定的参考价值。

emp员工表
(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)
dept部门表
(deptno部门编号/dname部门名称/loc地点)工资 = 薪金 + 佣金
3.列出所有员工的姓名及其直接上级的姓名。(多次对自己查询,为表的取个别名,内部查询可以像对象一样引用外部的对象的字段,这里引用与编程中的作用域相似,即与类比)
select ename,(select ename from emp where empno in(a.mgr)) from emp a ;
在该语句中,a.mgr,emp a代表什么,有什么用
6.列出所有“CLERK”(办事员)的姓名及其部门名称。(域,注意())
select ename,(select dname from dept where deptno in(a.deptno)) as dname from emp a where JOB like’CLERK’;
dname列名在emp表中,怎么可以放在ename后
14.列出所有员工的姓名、部门名称和工资.(经典的两个表的连接查询,用具体的名称替换一个表中的主键的id (解决很多人在实际运用中会遇到的不能绑定多列的问题),也可用where来查询 ,与题5比较)
select ename,sal,(select dname from dept a where a.deptno=b.deptno)as dname from emp b;
a.deptno,b.deptno各代表什么,有什么用?emp b有什么用,为什么不写成emp a?
16.列出各种工作的最低工资。
select job,min(sal) from emp group by job ;
在该句中group by有什么用,怎么使用group by

3.select ename,(select ename from emp where empno in(a.mgr)) from emp a ;
整个查询分为子查询和父查询,(select ename from emp where empno in(a.mgr))为子查询,emp a指的是员工表,a为这个查询为emp表指定的别名,知道了a
代表什么,a.mgr就好理解了,a.mgr其实就是emp.mgr,表示emp员工表中的mgr(上级编号)字段,emp表中记录了员工及员工上级的信息,a.mgr就用来指明员工
的上级的编号,然后输出员工姓名及他上级姓名。
6.虽然dname和ename在不同的两张表中,但是通过语句where deptno in(a.deptno)将两张表的信息关联上了,这样就能得到员工姓名及该员工所在的部门名称。
14.a.deptno,b.deptno分别代表部门表中的部门编号字段和员工表中的部门编号字段,它们的作用是将独立的部门表和员工表中的信息关联起来,令两个表的信息
一一对应起来,emp b用来输出ename,sal字段,b为emp表在查询中的别名,可以任意命名,因为a这个名称已经赋予给dept这个表,若再将a赋予emp表,则会造成
数据库无法识别a代表的是dept表还是emp表,所以此处命名为b而不是a。
16.group by有分类作用,此处表示,安装job的类型将查询结果分为几类,每一类工作中包含很多不同的工资,然后用min函数从里面选出最小的工资,当需要对
查询结果进行聚合时,便可使用group by语句,其后紧跟聚合函数外的所有字段,比如此处的job字段。
参考技术A 3.emp a 代表emp表,a是该表的别名:select * from table_name 表别名(内可取可不取);
a.mgr:emp表中mgr这个字段的信息
6.(select dname from dept where deptno in(a.deptno)) as dname这个是个完整的语法,重新定义了d.name,而且dname是dept表中的列,不存在于emp表中

14.a.deptno和b.deptno是不同表中相同字段名的信息,a和b只是不同表的别名

16.groupby 是分组函数,该语句中是把检索出来的数据按照job分组

[转帖]分享Oracle的四道经典面试题,值得收藏

分享Oracle的四道经典面试题,值得收藏

原创 波波说运维 2019-07-20 00:02:00
https://www.toutiao.com/i6713901660919300621/

 

概述

今天主要整理了4道Oracle 经典面试题,与大家分享学习。下面一起看看详细的介绍吧


第一题

1、测试数据

create table test(
id number(10) primary key,
type number(10) ,
t_id number(10),
value varchar2(6)
);

insert into test values(100,1,1,‘张三‘);
insert into test values(200,2,1,‘男‘);
insert into test values(300,3,1,‘50‘);
insert into test values(101,1,2,‘刘二‘);
insert into test values(201,2,2,‘男‘);
insert into test values(301,3,2,‘30‘);
insert into test values(102,1,3,‘刘三‘);
insert into test values(202,2,3,‘女‘);
insert into test values(302,3,3,‘10‘);
commit;

select * from test;
技术图片

 

2、需求:

根据以上的表写出一条查询语句,查询结果如下:

技术图片

 

3、实现:

/*
根据表格可以分析出type列中1代表姓名、2代表性别、3代表年龄,而t_id中id一样的为同一个人的属性,查询结果中列依次为姓名、性别、年龄,而type列决定姓名、性别、年龄
*/

/*使用分组,先对t_id进行分组,然后用decode函数过滤数据,例:decode(type, 1, value) type=1就显示为value
由于分组后select后面的列字段只能是分组的字段或者组函数,所有使用max()。
同一个人的type没有重复数值所以 decode(type, 1, value)返回的值只有一个,最大值也就是这个值
*/
select max(decode(type, 1, value)) "姓名",
max(decode(type, 2, value)) "性别",
max(decode(type, 3, value)) "年龄"
from test
group by t_id;

/*使用连表,通过where过滤生成3张type分别等于1(姓名)、2(性别)、3(年龄)的3张虚拟表 再通过where 连接条件 三张表t_id相等的为同一个人或者说同一条记录(行)
*/
select t1.value "姓名",t2.value "性别",t3.value "年龄" from
(select value,t_id from test where type=1) t1,
(select value,t_id from test where type=2) t2,
(select value,t_id from test where type=3) t3
where t1.t_id=t2.t_id and t1.t_id=t3.t_id;

第二题

1、测试数据

create table tmp(rq varchar2(10),shengfu varchar2(5));

insert into tmp values(‘2019-07-09‘,‘胜‘);
insert into tmp values(‘2019-07-09‘,‘胜‘);
insert into tmp values(‘2019-07-09‘,‘负‘);
insert into tmp values(‘2019-07-09‘,‘负‘);
insert into tmp values(‘2019-07-10‘,‘胜‘);
insert into tmp values(‘2019-07-10‘,‘负‘);
insert into tmp values(‘2019-07-10‘,‘负‘);
commit;

select * from tmp;
技术图片

 

2、需求:

如果要生成下列结果, 该如何写sql语句?

技术图片

 

3、实现:

--使用分组
--按日期分组,用conut函数计算次数
select rq "日期",
count(decode(shengfu, ‘胜‘, 1)) "胜",
count(decode(shengfu, ‘负‘, 1)) "负"
from tmp
group by rq
order by rq;

--使用连表
--这道题本身就需要分组,不建议使用连表做
select t1.rq,t1.胜, t2.负 from
(select count(decode(shengfu, ‘胜‘, 1)) "胜", rq from tmp group by rq) t1
join
(select count(decode(shengfu, ‘负‘, 1)) "负", rq from tmp group by rq) t2
on t1.rq=t2.rq;

第三题

1、测试数据

create table STUDENT_SCORE
(
name VARCHAR2(20),
subject VARCHAR2(20),
score NUMBER(4,1)
);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三‘, ‘语文‘, 78.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三‘, ‘数学‘, 88.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三‘, ‘英语‘, 98.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四‘, ‘语文‘, 89.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四‘, ‘数学‘, 76.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四‘, ‘英语‘, 90.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五‘, ‘语文‘, 99.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五‘, ‘数学‘, 66.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五‘, ‘英语‘, 91.0);
commit;
select * from STUDENT_SCORE;
技术图片

 

2、需求:

有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路): 大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。

技术图片

 

3、实现

--使用分组
select name "姓名",
max(decode(subject, ‘语文‘ ,score)) "语文",
max(decode(subject, ‘数学‘ ,score)) "数学",
max(decode(subject, ‘英语‘ ,score)) 英语
from STUDENT_SCORE
group by name;

--使用连表
select t1.name 姓名, t1.score 语文, t2.score 数学, t3.score 英语 from
(select name,score from STUDENT_SCORE where subject=‘语文‘) t1
join
(select name,score from STUDENT_SCORE where subject=‘数学‘) t2
on t1.name=t2.name
join
(select name,score from STUDENT_SCORE where subject=‘英语‘) t3
on t1.name=t3.name;

--在分组的基础上使用 case when then esle end
select t.姓名,
(case when t.语文>=80 then ‘优秀‘
when t.语文>=60 then ‘及格‘
else ‘不及格‘ end) 语文,
(case when t.数学>=80 then ‘优秀‘
when t.数学>=60 then ‘及格‘
else ‘不及格‘ end) 数学,
(case when t.英语>=80 then ‘优秀‘
when t.英语>=60 then ‘及格‘
else ‘不及格‘ end) 英语
from
(select t1.name 姓名, t1.score 语文, t2.score 数学, t3.score 英语 from
(select name,score from STUDENT_SCORE where subject=‘语文‘) t1
join
(select name,score from STUDENT_SCORE where subject=‘数学‘) t2
on t1.name=t2.name
join
(select name,score from STUDENT_SCORE where subject=‘英语‘) t3
on t1.name=t3.name
) t;

第四题(这道题难度相对较高)

1、测试数据:

create table yj01(
month varchar2(10),
deptno number(10),
yj number(10)
);

insert into yj01(month,deptno,yj) values(‘一月份‘,01,10);
insert into yj01(month,deptno,yj) values(‘二月份‘,02,10);
insert into yj01(month,deptno,yj) values(‘二月份‘,03,5);
insert into yj01(month,deptno,yj) values(‘三月份‘,02,8);
insert into yj01(month,deptno,yj) values(‘三月份‘,04,9);
insert into yj01(month,deptno,yj) values(‘三月份‘,03,8);

create table yjdept(
deptno number(10),
dname varchar2(20)
);

insert into yjdept(deptno,dname) values(01,‘国内业务一部‘);
insert into yjdept(deptno,dname) values(02,‘国内业务二部‘);
insert into yjdept(deptno,dname) values(03,‘国内业务三部‘);
insert into yjdept(deptno,dname) values(04,‘国际业务部‘);

select * from yj01;
select * from yjdept;
技术图片

 

2、需求:

从前面两个表中取出如下图所列格式数据。

技术图片

 

3、实现:

--使用分组
select deptno,
max(decode(month,‘一月份‘,yj)) 一月份,
max(decode(month,‘二月份‘,yj)) 二月份,
max(decode(month,‘三月份‘,yj)) 三月份
from yj01 group by deptno
order by deptno;

--这道题给出了两张表,而用分组做,使用yj01表就能做出来了,所以这道题考察的应该是连表的知识
/*这两张表中有的月份有的部门业绩是空的,而用前几道题的做法,不匹配条件的值会被过滤掉,例如month=一月份的只有1部门,形成的表里deptno只有1和二月份、三月份形成的表中的deptno无法匹配
而yjdept表中包含了所有部门编号deptno,这时就可以用到外连接的特性
(在满足一张表的内容都显示的基础上,连接另外一张表,如果连接匹配则正常显示,连接不匹配,另外一张表补null)
*/
select t1.deptno, t1.yj 一月份, t2.yj 二月份, t3.yj 三月份
from
(select y2.deptno,y1.yj from
(select yj, deptno from yj01 where month=‘一月份‘) y1 right join yjdept y2 on y1.deptno=y2.deptno)t1
join
(select y2.deptno,y1.yj from
(select yj, deptno from yj01 where month=‘二月份‘) y1 right join yjdept y2 on y1.deptno=y2.deptno)t2
on t1.deptno=t2.deptno
join
(select y2.deptno,y1.yj from
(select yj, deptno from yj01 where month=‘三月份‘) y1 right join yjdept y2 on y1.deptno=y2.deptno)t3
on t1.deptno=t3.deptno
order by t1.deptno;

以上是关于oracle面试题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle面试题整理

[转帖]分享Oracle的四道经典面试题,值得收藏

oracle sql 语句 面试题

Oracle 经典面试题

ORACLE1.28 面试题

Oracle面试题(基础篇)