Oracle经典面试题,你都掌握了吗?

本文整理了4道Oracle 经典面试题,与大家分享学习。适合渴望转型DBA的技术人员。

第一题

 
 
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');	
	
select * from test;


代码生成表格如:


640?wx_fmt=png


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

 
 
姓名   性别   年龄	
张三   男   50	
刘二   男   30	
刘三   女   10

/*根据表格可以分析出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;


第二题



一道SQL语句面试题,关于group by


表内容:

2005-05-09 胜

2005-05-09 胜

2005-05-09 负

2005-05-09 负

2005-05-10 胜

2005-05-10 负

2005-05-10 负


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


 
 
         胜 负	
2005-05-09 2 2	
2005-05-10 1 2	
------------------------------------------	
create table tmp(rq varchar2(10),shengfu varchar2(5));	
	
insert into tmp values('2005-05-09','胜');	
insert into tmp values('2005-05-09','胜');	
insert into tmp values('2005-05-09','负');	
insert into tmp values('2005-05-09','负');	
insert into tmp values('2005-05-10','胜');	
insert into tmp values('2005-05-10','负');	
insert into tmp values('2005-05-10','负');	
	
select * from tmp;


--使用分组

--按日期分组,用conut函数计算次数

 
 
select rq "日期",	
       count(decode(shengfu, '胜', 1)) "胜",	
       count(decode(shengfu, '负', 1)) "负"	
  from tmp	
 group by rq	
 order by rq;


--使用连表

--这道题本身就需要分组,不建议使用连表做

--以下使用的是SQL1999的连表方式,语法不一样效果与第一题使用的SQL1992的一样

 
 
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;


第三题



生成所需的表


 
 
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);


得到结果


 
 
姓名   语文  数学  英语	
王五    89    56    89	
李四    xx    xx    xx	
select * from STUDENT_SCORE;


有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出思路):  


 
 
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。  	
       显示格式:  	
       语文              数学                英语  	
       及格              优秀                不及格    	
------------------------------------------	
*/


--使用分组

 
 
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;


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



请用一个sql语句得出结果


从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式展现


 
 
table1	
	
月份mon 部门dep 业绩yj	
-------------------------------	
一月份      01      10	
一月份      02      10	
一月份      03      5	
二月份      02      8	
二月份      04      9	
三月份      03      8	
	
table2	
	
部门dep      部门名称dname	
--------------------------------	
     国内业务一部	
     国内业务二部	
     国内业务三部	
     国际业务部	
	
table3 (result)	
	
部门dep 一月份      二月份      三月份	
--------------------------------------	
     10        null      null	
     10         8        null	
     null       5        8	
     null      null      9	
	
------------------------------------------	
	
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;	
--使用分组	
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;


出处:https://www.tuicool.com/articles/EzEbm2Q

编辑:尹文敏


公司简介 | 恩墨学院 | 招聘 | DTCC | 数据技术嘉年华 | 免费课程 | 入驻华为严选商城

   640?wx_fmt=jpeg

zCloud | SQM | Bethune Pro2 zData一体机 | Mydata一体机 | ZDBM 备份一体机

640?wx_fmt=jpeg

Oracle技术架构 | 免费课程 数据库排行榜 | DBASK问题集萃 | 技术通讯 

640?wx_fmt=jpeg

升级迁移 | 性能优化 | 智能整合 安全保障 | 

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群


640?wx_fmt=jpeg

请备注:云和恩墨大讲堂

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle 是目前世界上最流行的关系数据库管理系统之一,许多公司都会在面试中涉及 Oracle 相关的问。以下是 Oracle 面试必会的六道经典: 1. Oracle 中的事务 事务是数据库执行的基本单位,是一组逻辑操作单元,必须全部执行成功或全部不执行才能称之为一次事务。在 Oracle 中,开始事务需要使用命令 "BEGIN TRANSACTION",提交事务需要使用命令 "COMMIT",回滚事务需要使用命令 "ROLLBACK"。 2. Oracle 中的锁机制 Oracle 中的锁机制用于保证并发访问时数据的一致性。有共享锁(SHARED)和排他锁(EXCLUSIVE)两种锁模式。共享锁可以在其他会话读取数据的同时允许当前会话读取该数据,而排他锁在其他会话读取和修改数据时都会阻塞当前会话的访问。 3. Oracle 中的索引 索引是提高查询效率的重要手段。Oracle 中的索引分为 B 树索引和位图索引两种。B 树索引适合用于范围查询或排序操作,位图索引适合用于频繁更新的列或需要进行多列的复合查询。 4. Oracle 中的备份和恢复 备份和恢复是数据库管理中的重要工作。Oracle 提供了多种备份和恢复方式,如使用 RMAN 工具备份,通过 exp 和 imp 命令进行备份和恢复,以及使用 Oracle 数据库自身的类似于 SQL Server 的事务日志(redo log)进行增量备份和恢复。 5. Oracle 中的存储方式 Oracle 中的存储方式有三种:堆积表(heap table)、索引组织表(index-organized table,IOT)和分区表(partitioned table)。堆积表是最基本的表形式,数据存储在物理块上;索引组织表与堆积表类似,但是数据存储在一个按照主键排序的 B 树索引上,可以提高查询效率;分区表将表分成多个逻辑区域,可以提高查询效率并简化备份和恢复过程。 6. Oracle 中的性能优化 性能优化是 Oracle 数据库管理员和开发人员需要掌握的重要技能。可以通过多种方式进行优化,如使用索引,尽量减少数据库访问,使用 bind 变量替代字面值等。还可以通过分析 SQL 语句执行程序(在 SQL*Plus 中使用 EXPLAIN PLAN 命令)、使用 Oracle 数据库自带的 SQL Trace 模块等方式识别瓶颈点并调整优化方案。 ### 回答2: Oracle是当前最流行的关系数据库管理系统,具有高可靠性、高性能和强大的数据管理能力。在Oracle面试中,有6道经典面试,这些问往往被考官视为必考,对于应聘者来说必须掌握。 1.数据库范式是什么?有几种范式? 数据库范式是一种规范化的设计原则,用于优化数据库设计。范式的理念是将数据分为更小的“子集”,每个子集都可以单独处理。Oracle数据库中常用的范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF),BCNF(Boyce-Codd范式)。 2.索引是什么?有什么优势和劣势? 索引是一种用于提高数据库查询效率的数据结构,它存储了表数据中的某些列及其对应的行指针。优势在于大大提高了数据查询效率和性能,缺点在于占用更多的存储空间和增加数据更新的成本。 3.SQL语言中的DDL、DML、DCL分别是什么? DDL(Data Definition Language)是SQL的数据定义语言,用于定义、修改表、视图、约束等数据库结构;DML(Data Manipulation Language)是SQL的数据操作语言,用于增加、修改、删除数据;DCL(Data Control Language)是SQL的数据控制语言,用于控制数据库的访问权限、用户、角色等。 4.Oracle的存储结构是什么? Oracle的存储结构较为复杂,可分为:数据文件、控制文件、在线重做日志文件。数据文件存储实际的数据内容,控制文件保存数据库的结构信息和操作日志,在线重做日志文件记录数据库中所发生的变化。 5.Oracle中如何通过SQL语句进行数据备份和恢复? Oracle中有两种备份方式,分别是物理备份和逻辑备份。物理备份是指通过对数据文件的备份来保护数据库数据,常用工具为RMAN;逻辑备份是指通过生成SQL语句或复制现有表中的数据来作为备份,常用工具为exp和imp。 6.Oracle中采用的锁机制? Oracle中有共享锁和排他锁两种锁机制,共享锁是读锁,可被多个用户同时获取,但不能对数据进行修改;排他锁是写锁,只可一个用户获取,且可对数据进行修改。Oracle还采用了多版本并发控制(MVCC)机制,通过版本号和SCN号控制读写锁的获取,避免数据锁死的问

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值