oracle常见面试题
01.tmp 表中有如下记录
要求结果格式为:
答:这个题主要考察的是case.. when..和group by的用法
select rq,
count(case when shengfu='WIN' then 1 else null end) WIN,
count(case when shengfu='LOSE' then 1 else null end) LOSE from tmp group by rq ;
分析:我们看到输出结果了,此题是统计每天胜负的场次,所以我们要根据日期来分组,在此基础上在用count()函数统计胜负的场次。
讲解:由于有胜负两种情况,所以count()函数中必须有相应的条件例如(shengfu=’WIN’或shengfu=’LOSE’),但是count()函数中不支持这样的表达式,所以在此我们要用到case.. when..语句。
Case..when..的用法:
Case when 条件then 表达式1 else 表达式2 end;
当条件成立时该语句的值为表达式1如条件不成立则值为表达式2。
case when shengfu='WIN' then 1 else null end这条语句的意思是把shengfu列为’WIN’的那些值设为1,,否则设为null,又由于count()函数不统计null值和已经根据日期分组了,所以统计出来的就是当天胜场的次数。同理统计负场的次数。。。
02. 查询当前月有多少天
答:
select trunc(add_months(sysdate,1),'month') - trunc(sysdate,'month') from dual;
分析:这个题相对来说比较简单,考察的就是你对日期函数的熟练程度,如果你对日期函数用的比较熟练,那么恭喜你白加分的题。但如果不熟练,也是会把你绕进去的。此题的思路就是先得到下个月的第一天的日期,再得到当前月的第一天的日期,用下个月第一天的日期减去当前月第一天的日期得到的就是这两个日期中间相差多少天,也就是当前月有多少天。
讲解:add_months(date,n)这个函数是用来添加月份的,其中date是一个日期,n是代表date要加几个月,得到的结果就是date这个日期再过n个月的日期。
Trunk(date,’xxx’)这个是日期截取的函数,根据’xxx’指定的类型来截取日期,比如2012年3月21日用trunk()函数根据月截取的结果就为2012年3月1日,根据年截取的话就为2012年1月1日。
03. pages 表有四个字段,id, url,title,body。如图:
现要求将url 匹配的排在最前,title 匹配的其次,body 匹配最后,没有任何字段匹配的,不返回。现要求查询所有匹配baidu 的记录,最终查询结果如图:
答:
select id,content from (
select id, 3 mark, url content from pages where url like '%baidu%'
union
select id, 2, title from pages where title like '%baidu%'
union
select id, 1, body from pages where body like '%baidu%'
) order by mark desc;
分析:这个题主要考察的就是union的用法,做题的思路就是先查出url中与’baidu’匹配的记录,再找出title中与’baidu’匹配的记录,再找出body中与’baidu’匹配的记录,三个结果做一个并集,得到的这张表就是我们想要的结果。
这里面还有需要我们注意的:
union 可以用来合并多次查询结果。这里需要注意多次查询的结果列的个数和类型必
须相同,合并后的结果集也可以看做一张表,表的列的类型和名称由union 的第一条查询结果来决定。
这里用到一个技巧:手工指定一个优先级mark 列,最后根据mark 列排序。