Oracle 经典面试题分享

整理了4道Oracle 经典面试题,与大家分享学习。

第一题

create table test( id number(10) primary key, type number(10) , t_id number(10), value varchar2(6) ); insert into test values(100,1,1,'张三'); insert into test values(200,2,1,'男'); insert into test values(300,3,1,'50'); insert into test values(101,1,2,'刘二'); insert into test values(201,2,2,'男'); insert into test values(301,3,2,'30'); insert into test values(102,1,3,'刘三'); insert into test values(202,2,3,'女'); insert into test values(302,3,3,'10'); select * from test;

代码生成表格如:

Oracle 经典面试题分享

根据以上代码生成的表写出一条查询语句,查询结果如下:

姓名   性别   年龄  
张三     50  
刘二     30  
刘三     10  

/* 根据表格可以分析出type列中1代表姓名、2代表性别、3代表年龄,而t_id中id一样的为同一个人的属性 查询结果中列依次为姓名、性别、年龄,而type列决定姓名、性别、年龄 */ /*使用分组,先对t_id进行分组,然后用decode函数过滤数据,例:decode(type, 1, value) type=1就显示为value 由于分组后select后面的列字段只能是分组的字段或者组函数,所有使用max()。 同一个人的type没有重复数值所以 decode(type, 1, value)返回的值只有一个,最大值也就是这个值 */ select max(decode(type, 1, value)) "姓名", max(decode(type, 2, value)) "性别", max(decode(type, 3, value)) "年龄" from test group by t_id; /*使用连表,通过where过滤生成3张type分别等于1(姓名)、2(性别)、3(年龄)的3张虚拟表 如: 再通过where 连接条件 三张表t_id相等的为同一个人或者说同一条记录(行) */ select t1.value "姓名",t2.value "性别",t3.value "年龄" from (select value,t_id from test where type=1) t1, (select value,t_id from test where type=2) t2, (select value,t_id from test where type=3) t3 where t1.t_id=t2.t_id and t1.t_id=t3.t_id;

第二题

/* 2.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负 如果要生成下列结果, 该如何写sql语句? 胜 负 2005-05-09 2 2 2005-05-10 1 2 ------------------------------------------ create table tmp(rq varchar2(10),shengfu varchar2(5)); insert into tmp values('2005-05-09','胜'); insert into tmp values('2005-05-09','胜'); insert into tmp values('2005-05-09','负'); insert into tmp values('2005-05-09','负'); insert into tmp values('2005-05-10','胜'); insert into tmp values('2005-05-10','负'); insert into tmp values('2005-05-10','负'); select * from tmp; */ --使用分组 --按日期分组,用conut函数计算次数 select rq "日期", count(decode(shengfu, '胜', 1)) "胜", count(decode(shengfu, '负', 1)) "负" from tmp group by rq order by rq; --使用连表 --这道题本身就需要分组,不建议使用连表做 --以下使用的是SQL1999的连表方式,语法不一样效果与第一题使用的SQL1992的一样 select t1.rq,t1.胜, t2.负 from (select count(decode(shengfu, '胜', 1)) "胜", rq from tmp group by rq) t1 join (select count(decode(shengfu, '负', 1)) "负", rq from tmp group by rq) t2 on t1.rq=t2.rq;

第三题

/*3.生成题目所需的表 create table STUDENT_SCORE ( name VARCHAR2(20), subject VARCHAR2(20), score NUMBER(4,1) ); insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '语文', 78.0); insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '数学', 88.0); insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '英语', 98.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '语文', 89.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '数学', 76.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '英语', 90.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '语文', 99.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '数学', 66.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '英语', 91.0); 3.1得到类似下面的结果 姓名 语文 数学 英语 王五 89 56 89 李四 xx xx xx select * from STUDENT_SCORE; 3.2有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分, 请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路): 大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 显示格式: 语文 数学 英语 及格 优秀 不及格 ------------------------------------------ */ --3.1 --使用分组 select name "姓名", max(decode(subject, '语文' ,score)) "语文", max(decode(subject, '数学' ,score)) "数学", max(decode(subject, '英语' ,score)) 英语 from STUDENT_SCORE group by name; --使用连表 select t1.name 姓名, t1.score 语文, t2.score 数学, t3.score 英语 from (select name,score from STUDENT_SCORE where subject='语文') t1 join (select name,score from STUDENT_SCORE where subject='数学') t2 on t1.name=t2.name join (select name,score from STUDENT_SCORE where subject='英语') t3 on t1.name=t3.name; --3.2 --在3.1的基础上使用 case when then esle end select t.姓名, (case when t.语文>=80 then '优秀' when t.语文>=60 then '及格' else '不及格' end) 语文, (case when t.数学>=80 then '优秀' when t.数学>=60 then '及格' else '不及格' end) 数学, (case when t.英语>=80 then '优秀' when t.英语>=60 then '及格' else '不及格' end) 英语 from (select t1.name 姓名, t1.score 语文, t2.score 数学, t3.score 英语 from (select name,score from STUDENT_SCORE where subject='语文') t1 join (select name,score from STUDENT_SCORE where subject='数学') t2 on t1.name=t2.name join (select name,score from STUDENT_SCORE where subject='英语') t3 on t1.name=t3.name ) t;

第四题(这道题难度相对较高)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/676b9faf2d53c508a4a533102faa5ea5.html