您当前的位置:首页 > 电脑百科 > 数据库 > Oracle

分享Oracle的四道经典面试题

时间:2019-08-20 17:44:47  来源:  作者:

概述

今天主要整理了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;
分享Oracle的四道经典面试题,值得收藏

 

2、需求:

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

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

 

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;
分享Oracle的四道经典面试题,值得收藏

 

2、需求:

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

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

 

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;
分享Oracle的四道经典面试题,值得收藏

 

2、需求:

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

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

 

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;
分享Oracle的四道经典面试题,值得收藏

 

2、需求:

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

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

 

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;

这四个表都是有点难度的,值得深入学习一下。后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~



Tags:Oracle   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
安装环境Linux服务器:Centos 6 64位Oracle服务器:Oracle11gR2 64位 系统要求说明:内存必须高于1G的物理内存;交换空间,一般为内存的2倍(1G的内存可以设置swap 分区为3G大小);硬...【详细内容】
2021-12-27  Tags: Oracle  点击:(2)  评论:(0)  加入收藏
1、 登陆CentOS 2、 查看备份脚本,脚本放在\usr\local目录下 3、 编写数据库备份脚本,内容如下 前提是需要在Oracle创建directory文件,如果没有,可以create创建并授权给相应的用...【详细内容】
2021-12-10  Tags: Oracle  点击:(14)  评论:(0)  加入收藏
之前写了个Oracle12c在Redhat6.8下的静默安装,操作系统版本太老了而且没配插图,今天重新写个centos 7 下静默安装。 准备环境:centos 7 虚拟机一台,Oracle12c安装包。1、检查防...【详细内容】
2021-10-12  Tags: Oracle  点击:(29)  评论:(0)  加入收藏
JDK 17 正式发布+免费牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。虽然 iPho...【详细内容】
2021-09-16  Tags: Oracle  点击:(88)  评论:(0)  加入收藏
2021年免费vps服务器申请,oracle永久免费使用。Oracle 云免费套餐只需注册 Oracle 云帐户即可获取,不仅包含丰富的 Always Free 云服务,还提供 300 美元的免费试用储值,让您可以...【详细内容】
2021-09-08  Tags: Oracle  点击:(109)  评论:(0)  加入收藏
Oracle日志文件是Oracle数据库存储信息的重要文件,主要用来存储数据库变化的操作信息。Oracle日志文件可以分为两种:重做日志文件(redo log file)、归档日志文件,其中重做日志文...【详细内容】
2021-08-19  Tags: Oracle  点击:(101)  评论:(0)  加入收藏
本例子在真实环境应用过,获得了很好的体验,特将其分享出来供各位朋友使用。后续我会持续把相关的知识一点一点的更新,请各位多多关注,多多支持。测试速度:导出速度大概800M/s,如...【详细内容】
2021-08-17  Tags: Oracle  点击:(88)  评论:(0)  加入收藏
天冒险重启下Oracle rac,分三个步骤,停实例---停集群---重启服务器。 1、关闭实例检查状态su - gridcrsctl status res -t 注意:只在一个节点执行就行,或者为了保险期间,使用shut...【详细内容】
2021-07-16  Tags: Oracle  点击:(128)  评论:(0)  加入收藏
两个字符串相似度的比较:SYS.UTL_MATCH.edit_distance_similarity用法:select SYS.UTL_MATCH.edit_distance_similarity('河北沧州东塑股份有限公司','河北沧州东...【详细内容】
2021-07-07  Tags: Oracle  点击:(112)  评论:(0)  加入收藏
现在有一个用户A,想把这个用户A下面的所有的表查询权限都赋予用户X,该怎么做?同样的问题,如果有4个用户A、B、C、D,需要把这4个用户下面所有的表的只读权限赋予用户X、Y、Z三个用...【详细内容】
2021-06-23  Tags: Oracle  点击:(103)  评论:(0)  加入收藏
▌简易百科推荐
安装环境Linux服务器:Centos 6 64位Oracle服务器:Oracle11gR2 64位 系统要求说明:内存必须高于1G的物理内存;交换空间,一般为内存的2倍(1G的内存可以设置swap 分区为3G大小);硬...【详细内容】
2021-12-27  守护梦想2022    Tags:Oracle   点击:(2)  评论:(0)  加入收藏
1、 登陆CentOS 2、 查看备份脚本,脚本放在\usr\local目录下 3、 编写数据库备份脚本,内容如下 前提是需要在Oracle创建directory文件,如果没有,可以create创建并授权给相应的用...【详细内容】
2021-12-10  JasonTang    Tags:Oracle   点击:(14)  评论:(0)  加入收藏
之前写了个Oracle12c在Redhat6.8下的静默安装,操作系统版本太老了而且没配插图,今天重新写个centos 7 下静默安装。 准备环境:centos 7 虚拟机一台,Oracle12c安装包。1、检查防...【详细内容】
2021-10-12  it运维小土豆  今日头条  Tags:Oracle   点击:(29)  评论:(0)  加入收藏
JDK 17 正式发布+免费牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。虽然 iPho...【详细内容】
2021-09-16  Java技术栈  掘金  Tags:Oracle   点击:(88)  评论:(0)  加入收藏
Oracle日志文件是Oracle数据库存储信息的重要文件,主要用来存储数据库变化的操作信息。Oracle日志文件可以分为两种:重做日志文件(redo log file)、归档日志文件,其中重做日志文...【详细内容】
2021-08-19  free教程    Tags:Oracle日志   点击:(101)  评论:(0)  加入收藏
本例子在真实环境应用过,获得了很好的体验,特将其分享出来供各位朋友使用。后续我会持续把相关的知识一点一点的更新,请各位多多关注,多多支持。测试速度:导出速度大概800M/s,如...【详细内容】
2021-08-17  大树唛包    Tags:oracle   点击:(88)  评论:(0)  加入收藏
天冒险重启下Oracle rac,分三个步骤,停实例---停集群---重启服务器。 1、关闭实例检查状态su - gridcrsctl status res -t 注意:只在一个节点执行就行,或者为了保险期间,使用shut...【详细内容】
2021-07-16  死磕IT    Tags:Oracle rac   点击:(128)  评论:(0)  加入收藏
两个字符串相似度的比较:SYS.UTL_MATCH.edit_distance_similarity用法:select SYS.UTL_MATCH.edit_distance_similarity('河北沧州东塑股份有限公司','河北沧州东...【详细内容】
2021-07-07  Onceagain75783189    Tags:比较函数   点击:(112)  评论:(0)  加入收藏
现在有一个用户A,想把这个用户A下面的所有的表查询权限都赋予用户X,该怎么做?同样的问题,如果有4个用户A、B、C、D,需要把这4个用户下面所有的表的只读权限赋予用户X、Y、Z三个用...【详细内容】
2021-06-23  程序猿集锦    Tags:Oracle   点击:(103)  评论:(0)  加入收藏
oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间。...【详细内容】
2021-04-27  SQL小帅哥  今日头条  Tags:Oracle   点击:(200)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条