红联Linux门户
Linux帮助

经典oracle面试题(附有答案)

发布时间:2009-04-24 18:55:02来源:红联作者:kevin_2009
T_STU表:S_ID、S_NAME、S_SEX、S_BIRTHDAY 、S_AGE、S_MOENY、C_ID
T_CLASS表:C_ID、C_NAME
sequence序列:seq_id;
★、学生表:学号、姓名、性别、出生日期、入学年龄、缴费
★、班级表:班级编号、班级名称
1、查询入学年龄在18-20的女生或者未输入性别的,实际年龄小的要排在后面
select * from T_STU
where (S_AGE between 18 and 20 and S_SEX='女')or(S_SEX is null)
order by S_BIRTHDAY

或者:
order by (sysdate-S_BIRTHDAY) desc

2、查询班级名称、学生姓名、性别、缴费(要求显示单位:元),相同班级的要放在一起,姓名根据字典顺序排列。
select c.C_NAME,s.S_NAME,s.S_SEX,s.S_MOENY||'元' as S_MOENY
from T_STU s,T_CLASS C
where s.C_ID=c.c_id
order by c.c_id,s.S_NAME

3、查询各班名称和人数
select c.C_NAME,count(*) as rs
from T_STU s,T_CLASS C
where s.C_ID=c.c_id
group by c.C_ID,c.C_NAME
或者:
select c.C_ID,c.C_NAME,count(*) as rs
from T_STU s,T_CLASS C
where s.C_ID=c.c_id
group by c.C_ID,c.C_NAME

4、★★查询各班名称和人数,但人数必须不少于2,人数多的放在前面
select c.C_NAME,count(*) as rs
from T_STU s,T_CLASS C
where s.C_ID=c.c_id
group by c.C_ID,c.C_NAME
having count(*)>=2
order by count(*) desc

5.1、查询1980年出生的有哪些学生。
select * from t_stu s
where to_char(s.S_BIRTHDAY,'yyyy')='1980'

5.2、查询男生和女生人数,没有输入性别的当作男
select nvl(s.s_sex,1) as x,count(*)
from t_stu s
group by nvl(s.s_sex,1) --必须把null值当作1来分组

易错:
select nvl(s.s_sex,1) as x,count(*) --将null当作1来显示
from t_stu s
group by s.s_sex


6.1、查询没有人员的班级
效率低:
select * from T_CLASS c
where c.c_id not in
(
select distinct s.C_ID from t_stu s
)

优化:
select * from T_CLASS c
where not exists
(
select * from t_stu s
where c.C_ID=s.C_ID
)
或者:
select * from T_CLASS c
where not exists
(
select 'x' from t_stu s
where c.C_ID=s.C_ID
)
理解:查询班级表不存在这种情况:班级编号与学生表中班级编号相等的情况。

或者:用左连接(效率低),只有对等连接,效率最高。

6.2、查询入学年龄在20以上的同学信息
select * from T_STU where S_AGE>20

7、查询班级平均入学年龄在20及以上的班级
select c.C_NAME,avg(s.s_age)
from T_STU s,T_CLASS C
where s.C_ID=c.c_id
group by c.C_ID,c.C_NAME
having avg(s.s_age)>=20


8、★★有工资表salary(e_id,e_date,e_money),求本月发了2笔以上工资的员工信息。
select e_id,count(*)
from salary
where to_char(e_date,'yyyy.mm')=to_char(sysdate,'yyyy.mm')
group by e_id
having count(*)>=2
或者:
select e_id
from salary
where to_char(e_date,'yyyy.mm')=to_char(sysdate,'yyyy.mm')
group by e_id
having count(*)>=2

有部门表、人员表、工资表。
1、查询:人员名称、部门名称、个人总工资
首先要自己定义表名和字段名,如:
bm 部门表:bid,bname
ry 人员表:rid,rname,bid
gz 工资表:rid,money,rq,memo

select bname,rname,sum(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
group by bid,bname,rid,rname


2、查询所有部门的总工资
select bm.bid,sum(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
group by bm.bid

或者:
select bm.bid,bm.bname,sum(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
group by bm.bid,bm.bname

或者:
select bm.bid,sum(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
group by bm.bid,bm.bname

3、查询2008年8月份各部门工资最高的员工信息:部门名称、员工姓名、员工总工资
分析:
1.先找出2008年8月份各部门最高的工资
部门 最高工资
a 12000
b 8000
2.找出哪些员工的工资等于这些工资
找:a部门谁的工资=12000
b部门谁的工资=8000

执行:
1.先找出2008年8月份各部门最高的工资

select bm.bid,bm.bname,max(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
and to_char(gz.rq,'yyyy.mm')='2008.08'
group by bm.bid,bm.bname

类似:
部门 名称 最高工资
a xx1 12000
b xx2 8000

执行:
2.找出哪些员工的工资等于这些工资

select bm.bid,bm.bname,gz.money
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
and to_char(gz.rq,'yyyy.mm')='2008.08'
and (bm.bid,gz.money) in
(
select bm.bid,max(gz.money)
from bm,ry,gz
where bm.bid=ry.bid
and gz.rid=ry.rid
and to_char(gz.rq,'yyyy.mm')='2008.08'
group by bm.bid,bm.bname
)
文章评论

共有 48 条评论

  1. linux2013_xzg 于 2013-11-03 20:08:29发表:

    顶,正在学习呢

  2. caiwanguo 于 2013-03-13 15:49:36发表:

    似乎太过于简单

  3. 无怀 于 2013-01-12 16:01:59发表:

    很经典!!!!!

  4. wht521gjl 于 2013-01-09 14:40:35发表:

    不错感谢分享

  5. lxl0245 于 2013-01-08 21:34:08发表:

    楼主辛苦 测测水平

  6. lvpeng9696 于 2012-12-24 20:51:06发表:

    很好的?目,??奉?

  7. youxinzhai 于 2012-12-17 11:49:37发表:

    good.

  8. lppwendy 于 2012-09-12 18:42:17发表:

    学习了

  9. nanst 于 2012-08-28 14:58:55发表:

    不错哦,狂顶

  10. 抬头滴汗 于 2012-08-10 11:47:02发表:

    好东西,拿来整理成文档!

  11. Johnny_F_Lin 于 2012-07-29 22:30:51发表:

    入门真的好难呀

  12. adslmmmm 于 2012-06-05 12:29:26发表:

    [code][/code]

  13. wei2012dt 于 2012-05-30 19:50:20发表:

    thx

  14. sunguo40 于 2012-05-11 06:06:34发表:

    收藏了 好好研究下

  15. admin_hl 于 2011-12-31 13:39:47发表:

    支持下

  16. admin_hl 于 2011-12-31 13:39:46发表:

    支持下

  17. admin_hl 于 2011-12-31 13:39:46发表:

    支持下

  18. mylove_hu 于 2011-11-22 00:35:22发表:

    谢谢

  19. dongyichen 于 2011-08-04 14:24:00发表:

    偏向于sql语言了~没有太多涉及到oracle其他东西~

  20. guodingdong 于 2011-03-11 17:29:35发表:

    优化的语句可以研究一下!!!

  21. wuyunhong111 于 2011-02-10 10:48:24发表:

    谢谢楼主分享

  22. wuyunhong111 于 2011-01-25 09:27:46发表:

    谢谢,分享

  23. sun2004 于 2011-01-24 23:56:38发表:

    感谢楼主 辛苦了

  24. sun2004 于 2011-01-24 23:56:37发表:

    感谢楼主 辛苦了

  25. sun2004 于 2011-01-24 23:56:33发表:

    感谢楼主 辛苦了

  26. sun2004 于 2011-01-24 23:56:33发表:

    感谢楼主 辛苦了

  27. sun2004 于 2011-01-24 23:56:29发表:

    感谢楼主 辛苦了

  28. sun2004 于 2011-01-24 23:56:29发表:

    感谢楼主 辛苦了

  29. sportlottery 于 2010-04-22 15:14:41发表:

    不错,很好的联系,辛苦LZ了。

  30. lpy_study 于 2010-04-15 16:15:48发表:

    下下来看看

  31. lihongniu 于 2010-04-12 14:43:18发表:

    好好珍惜每一次难得的机会 抓住一次你就可以飞起来!

  32. billmoney 于 2009-12-08 08:43:01发表:

    学习一下。

  33. sunhy1021 于 2009-12-03 17:23:50发表:

    看一下!

  34. spectery 于 2009-11-21 00:23:45发表:

    收下了。。。 多谢。

  35. xiaomingjian003 于 2009-11-20 23:12:56发表:

    果然是好题

  36. mentgmery 于 2009-11-20 14:38:56发表:

    恩,不错哦

  37. mentgmery 于 2009-11-20 14:38:55发表:

    恩,不错哦

  38. spectery 于 2009-11-20 10:16:45发表:

    辛苦了 。。。

  39. stefanjing 于 2009-11-03 02:13:42发表:

    学习一下!

  40. panpan071126 于 2009-10-31 14:31:13发表:

    不错 谢谢 收藏了