oracle常见面试题(10级学员 赵成举整理)

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’指定的类型来截取日期,比如2012321日用trunk()函数根据月截取的结果就为201231日,根据年截取的话就为201211日。

 

 

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 列排序。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值