1. 在表中找出指定字段重复记录个数
答案:SELECT [Field1],[Field2],[Field3],[...],COUNT(*) FROM [TableName] WHERE [Condition] GROUP BY [Field1],[Field2],[Field3],[...] HAVING COUNT(*)>1
2. 表中每个Y的最新X(ID为主健且自增)
答案:SELECT ID, Y, X FROM TableName T WHERE (NOT EXISTS (SELECT 1 FROM TableName T2 WHERE (T2.Y = T.Y) AND (T2.X > T.X OR T2.X = T.X AND T2.ID > T.ID)))
3. 表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,显示班级,成绩两个字段。
答案:select fclass,max(fscore) from table1 group by fclass
4. 有一个表table1有两个字段FID,Fno,字都非空,写一个SQL语句列出该表中一个FID对应多个不同的Fno的纪录。
答案:select t2.* from table1 t1, table1 t2 where t1.fid = t2.fid and t1.fno <> t2.fno;
5. 有员工表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
每种员工的数量;
答案
select sum(case when fsalary > 9999 and fage > 35 then 1 else 0end) as "fsalary>9999_fage>35",
sum(case when fsalary > 9999 and fage < 35 then 1 else 0 end) as "fsalary>9999_fage<35",
sum(case when fsalary < 9999 and fage > 35 then 1 else 0 end) as "fsalary<9999_fage>35",
sum(case when fsalary < 9999 and fage < 35 then 1 else 0 end) as "fsalary<9999_fage<35"
from empinfo;
6. 表A字段如下
month person income
月份 人员 收入
要求用一个SQL语句(注意是一个)得出所有人(不区分人员)每个月及上月和下月的总收入
要求列表输出为
月份 当月收入 上月收入 下月收入
MONTHS PERSON INCOME
200807 mantisXF 5000
200806 mantisXF2 3500
200806 mantisXF3 3000
200805 mantisXF1 2000
200805 mantisXF6 2200
200804 mantisXF7 1800
200803 8mantisXF 4000
200802 9mantisXF 4200
200802 10mantisXF 3300
200801 11mantisXF 4600
200809 11mantisXF 6800
答案:
Select (Select Month From A Where Month = To_Char(Sysdate, 'mm')) 月份,
(Select Sum(Income) From A Where Month = To_Char(Sysdate, 'mm')) 当月收入,
(Select Sum(Income) From A Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) - 1) 上月收入,
(Select Sum(Income) From A Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) + 1) 下月收入
200801 4600 0 7500
200802 7500 4600 4000
200803 4000 7500 1800
200804 1800 4000 4200
200805 4200 1800 6500
200806 6500 4200 5000
200807 5000 6500 0
200809 6800 0 0
7. 表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语句完成。
答案:
SELECT tt.c1 as '日期',SUM(tt.c2) AS '合计'
FROM B tt
GROUP BY tt.c1
union
SELECT '合计' as '日期',SUM(tt.c2) AS '合计'
FROM B tt
8. 数据库1,2,3 范式的概念与理解。
关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式1NF(第一范式),2NF(第二范式),3NF(第三范式).
9. 简述oracle行触发器的变化表限制表的概念和使用限制,行触发器里面对这两个表有什么限制。
10. ORACLE临时表有几种?临时表和普通表的主要区别有哪些,使用临时表的主要原因是什么?
11. 怎么实现:使一个会话里面执行的多个过程函数或触发器里面都可以访问的全局变量的效果,并且要实现会话间隔离?
Oracle数据库程序包中的变量,在本程序包中可以直接引用,但是在程序包之外,则不可以直接引用。对程序包变量的存取,可以为每个变量配套相应的存储过程<用于存储数据>和函数<用于读取数据>来实现。
12. aa,bb表都有20个字段,且记录数量都很大,aa,bb表的X字段(非空)上有索引,请用SQL列出aa表里面存在的X在bb表不存在的X的值,请写出认为最快的语句,并解译原因。
select aa.x from aa where not exists (select 'x' from bb where aa.x = bb.x) ;
同时使用了aa和bb中的X索引
13. 简述SGA主要组成结构和用途?
SGA是Oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信息。SGA在实例启动时被自动分配,当实例关闭时被收回。数据库的所有数据操作都要通过SGA来进行。
SGA中内存根据存放信息的不同,可以分为如下几个区域:
14. 什么是分区表?简述范围分区和列表分区的区别,分区表的主要优势有哪些?
使用分区方式建立的表叫分区表
范围分区:每个分区都由一个分区键值范围指定(对于一个以日期列作为分区键的表,“2005 年 1 月”分区包含分区键值为从“2005 年 1 月 1 日”
到“2005 年 1 月 31 日”的行)。
列表分区:每个分区都由一个分区键值列表指定(对于一个地区列作为分区键的表,“北美”分区可能包含值“加拿大”“美国”和“墨西哥”)。
分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务。通过分区,数据库设计人员和管理员能够解决前沿应用程序带来的一些难题。分区是构建千兆字节数据系统或超高可用性系统的关键工具。
15. 背景:某数据运行在archivelog,且用rman作过全备份和数据库的冷备份,且所有的归档日志都有,现控制文件全部损坏,其他文件全部完好,请问该怎么恢复该数据库,说一两种方法。
16. 用rman写一个备份语句:备份表空间TSB,level 为2的增量备份。
17. 有个表a(x number(20),y number(20))用最快速高效的SQL向该表插入从1开始的连续的1000万记录。
alter table a nologging;
insert /*+append*/ a select /*+parallel(t,8)*/ rownum from dual t connect by level <= 10000000;commit;
18. 查询优化
19. 数据库事务的四大特性
原子性
一致性
分离性
持久性
待阅读:http://www.cnblogs.com/tylerdonet/archive/2011/10/10/2205859.html
SQL中ROLLUP 用法:http://blog.csdn.net/dyufei/article/details/4801283
引自:http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852252.html