oracle 面试题做了做



这个是在 晚上 无聊, 由于是自己做, 所以没有必要在网上收答案,能做一点就一点,  没必要自己骗自己。希望能得到指点, 小弟感谢不尽......


1、表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,显示班级,成绩两个字段。 

   

   select max(Fscore), Fclass  from tab1 group by  Fscore;也可以用分析函数解,但是按照题目的意思没有必要了,但我相信面试的人写出 select max(score) over(partition by fclass), fclass from tab1 肯定会加分的.....



2、有一个表table1有两个字段FID,Fno,字都非空,写一个SQL语句列出该表中一个FID对应多个不同的Fno的纪录。 
类如: 
101a1001 
101a1001 
102a1002 
102a1003 
103a1004 
104a1005 
104a1006 
105a1007 
105a1007 
105a1007 
结果: 
102a1002 
102a1003 
104a1005 
104a1006 


  这个典型的   not exists 案例

   select aa.FID,aa.Fno from table1 aa where not exits ( select 1 from  table2  bb  where  aa.fid= bb.fid)



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 
每种员工的数量; 

这个最典型的 case when 应用,  扫描全表, case when 分情况 


  select count( case when fsalary>9999 and fage > 35 then 1 else null end),

         count( case when fsalary>9999 and fage < 35 then 1 else null end)

         。。。。。。。。。。。

  from tab1 where fsalary !=9999 and fage!=35 ..   反正现在只扫描1张表。。。。所以这样效率最高




4、表A字段如下 
month person income 
月份 人员 收入 
要求用一个SQL语句(注意是一个)的处所有人(不区分人员)每个月及上月和下月的总收入 
要求列表输出为 
月份 当月收入 上月收入 下月收入 


 这个典型的 分析函数的应用,   哥还记得哥用来做 环比的, 同比的。。 什么比上个月增加 百分之多少....


 

Select  income,  lag(income) over( partition by  person) 上个月, 

 Lead(income) over( partition by  person) 下个月 from  tab1; 




5,表B 
C1 c2 
2005-01-01 1 
2005-01-01 3 
2005-01-02 5 

要求的处数据 
2005-01-01 4 
2005-01-02 5 
合计 9 
试用一个Sql语句完成。 


这个典型的小记完成, 也可以用union all 但是没有必要,   


Select C1, sunm(C2) from  tab1 group by  rollup(C1);   rollup(a, b, c) 很有意思    a b c 统计 union all  a b 统计,然后 a 统计, 然后 统计所有...........




6,数据库1,2,3 范式的概念与理解。 

  这个哥有点知道, 什么高内聚, 低耦合, 我们改数据往往只改其中的一个.....

7,简述oracle行触发器的变化表限制表的概念和使用限制,行触发器里面对这两个表有什么限制。 


 这个哥真不知道



8、oracle临时表有几种。 
临时表和普通表的主要区别有哪些,使用临时表的主要原因是什么? 

 这个哥知道点, 但真心说不出来...   有点模糊, 

9,怎么实现:使一个会话里面执行的多个过程函数或触发器里面都可以访问的全局变量的效果,并且要实现会话间隔离? 


这个哥彻底的不知道了



10,aa,bb表都有20个字段,且记录数量都很大,aa,bb表的X字段(非空)上有索引, 
请用SQL列出aa表里面存在的X在bb表不存在的X的值,请写出认为最快的语句,并解译原因。 


这个用 not in 很多人会想到最快莫 用 not exists 当然这里不是的, 记录很大的,

select * from aa where not exists  ( select 1 from bb where aa.x = bb.X ); 这个有索引, 用not exists 的时候

 会用到 hash 不等 半链接,  这样速度会好点,

 但这个用到 分页中  我加  hint 强制oracle 走nest loop 。 这样一到满足的条数立马先出来数据, 这个场景是 我们系统要做给领导看的时候, 我们会加上这个hint 。。 这个第一页数据出来非常快的.... 



11,简述SGA主要组成结构和用途? 


    SGA 系统全局区,share_catch ( libary_catch  存放解析的执行计划,SQL语句等, 字典区 存放oracle 字典表信息),  buffer_catch  存放 存储的数据, redo log 区,日志相关的....

大型池, java 池 还有流池....




12什么是分区表?简述范围分区和列表分区的区别,分区表的主要优势有哪些? 


 分区表,逻辑上是一个表, 但实际上有一个或者多个 表空间 

   list  区分是 =

   rang 区分是一个 范围

  方便数据查询, 管理, 比如查询哪个分区的数据,  只要指定哪个分区即可, 还有我们的执行计划 会区分数据在哪些分局,加快 查询速度,  也可以删除某个分区, 备份某个分区等等...




13,背景:某数据运行在archivelog,且用rman作过全备份和数据库的冷备份, 
且所有的归档日志都有,现控制文件全部损坏,其他文件全部完好,请问该怎么恢复该数据库,说一两种方法。 

  这个哥试着回答下, 先在日志文件中跑出 控制文件( 或者恢复 控制文件), 然后在根据logminer 跑日志恢复数据??



14,用rman写一个备份语句:备份表空间TSB,level 为2的增量备份。 

 这个哥也不懂

15,有个表a(x number(20),y number(20))用最快速高效的SQL向该表插入从1开始的连续的1000万记录。 

 这个哥方法很多, 真正的做起来 哥一个个是试试, 总有一个适合哥

  这个典型的 递归查询

 insert into t /* append  */  ( 这个是绕过回滚段 )

 select level, level+22 from dual connect level<=1000 0000 

  insert /*+parallel(t,4) */ into ******* (  这个是 4 个 进程并行)
  alter table  t  nologing ;  ( 不要记录日志模式 )

还有 就是如果我们可以重建 表, 可以把它的 表空间改成 非自动增长的....这个哥在以前的 文章中说过, 这个方法肯定会快的

甚至块十几倍的....

 


 



 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值