Oracle 面试题 (附带部分答案,仅供参考)

嘿嘿,因为今天在公司闲得无聊,在网上找了一份oracle面试题做,并附上本人自己写的答案,希望和大家一起讨论讨论。

题目如下:

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

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

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

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


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语句完成。


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

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

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

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

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

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

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

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

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

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

嘿嘿,本人相关答案:

1:

select t1.fclass,
       max(t1.fscore)
  from table1 t1
 group by t1.fclass;


2:
方法1:
 
 select *
   from
       table1 t1,
       table1 t2
 where t1.fid = t2.fid
   and t1.fno <> t2.fno;


方法2:

select *
  from table1 tt
where tt.fid in (
                  select yy.fid
                    from (
                          select distinct * from table1 tt
                          )yy        
                   group by yy.fid
                  having count(*) > 1
                );


3:

               
select sum(case when tt.fsalary>9999 and fage > 35
                then 1
                else 0
            end) as "fsalary>9999 and fage > 35",
       sum(case when tt.fsalary>9999 and fage < 35
                then 1
                else 0
            end) as "fsalary>9999 and fage < 35",
       sum(case when tt.fsalary<9999 and fage > 35
                then 1
                else 0
            end) as "fsalary<9999 and fage > 35",
       sum(case when tt.fsalary<9999 and fage < 35
                then 1
                else 0
            end) as "fsalary>9999 and fage < 35"
  from empinfo tt;


4: 无语,不知道是我想的有问题还是需求不对 ...


5:

select tt.c1,
       sum(tt.c2)
  from B tt
 group by rollup(tt.c1);


8:

ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法


临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。

两种临时表的语法:
create global temporary table 临时表名 on commit preserve|delete rows
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表

例:
1、SESSION级临时表
--建立临时表
create global temporary table temp_tbl
(col_a varchar2(30))
on commit preserve rows
--插入数据
insert into temp_tbl values('test session table')
--提交
commit
--查询数据
select *from temp_tbl
可以看到数据'test session table'记录还在
--结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录

2、TRANSACTION级临时表
--建立临时表
create global temporary table temp_tbl
(col_a varchar2(30))
on commit delete rows
--插入数据
insert into temp_tbl values('test transaction table')
--提交
commit
--查询数据
select *from temp_tbl
这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。


10:

 select a.x
   from aa a
  where not exists (
                    select 1
                      from bb b
                     where a.x = b.x
                   );

 

哎,本人能力和水平有限,剩下的题不知道有那位高手知道,我们共同学习一下。 TQ! :-)

 

 

你可能感兴趣的:(Oracle 面试题 (附带部分答案,仅供参考))