本人周二去江苏富士通面试(经老师介绍去面试,此公司主要做linux平台下的c底层开发,而我想应聘的是java,一看面试题一脸蒙b,无奈硬着头皮做。。。),一上来做了五道面试题,其中四道是算法,一道是数据库,其中数据库的那道题比较复杂,面试当场我没能做出来,正好最近在自学oracle(好多公司都要求用oracle),顺便把这道题模拟一下,在同事帮助下终于解决,题目大致如下:
有两张表:用户表:身份证号、籍贯、出身年月等基本信息;贷款表:身份证号、应当还款日期、实际还款日期、借款金额。
问:用sql语句查询:籍贯是江苏苏州、出生年月在1980年初到1989年末、并且多次延迟还款的人的基本信息。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思考:
1、用户表-贷款表(一对多)
2、date类型比较大小
3、延迟还款:应当还款日期(早) < 实际还款日期(晚)
4、需比较个数
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实现:先创建了两张表person、loan,并模拟了写数据:
PERSON:
LOAN:
1、首先,先把简单的条件查询写好:
因为简单的查询(籍贯、出生时间)都为PERSON表中的字段,且返回的个人基本信息也都是PERSON表中的内容,所以:
select * from person
where jg='江苏苏州'
and birthday> to_date('1980/01/01','yyyy/mm/dd')
and birthday< to_date('1989/12/31','yyyy/mm/dd');
注意date类型的比较方式,需要使用to_date进行格式转换!
范围也可用between and:
select * from person
where jg='江苏苏州'
and birthday between to_date('1980/01/01','yyyy/mm/dd') and to_date('1989/12/31','yyyy/mm/dd');
查询结果如下:
2、在LOAN表中,查出延迟还款的,并返回他们的身份证号码及对应的条数:
select identify,count(*) as num from loan where ydhk<sjhk group by identify;
结果如下:
(重点!)以此表为查询元表,看做表A,查询出num>2的identify:
select identify from(
(
select identify,count(*) as num from loan where ydhk<sjhk group by identify
) A
) where num>1;
结果如下:
再在第一步(简单条件查询)的基础上增加此查询条件,最终结果为:
select * from person
where jg='江苏苏州'
and birthday> to_date('1980/01/01','yyyy/mm/dd')
and birthday< to_date('1989/12/31','yyyy/mm/dd')
and identify in (
select identify from(
(
select identify,count(*) as num from loan where ydhk<sjhk group by identify
) A
) where num>1
);
得到最终结果:
(以上sql仅适用于oracle在plsql上的查询,其他数据库稍做改变,但思想不变,如有更简洁的写法请评论或私信)