前言
本文整理了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;
代码生成表格如:
根据以上代码生成的表写出一条查询语句,查询结果如下:
姓名 | 性别 | 年龄 |
张三 | 男 | 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;
第四题(这道题难度相对较高)
/*4.请用一个sql语句得出结果 从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确, 只是作为一个格式向大家请教。 table1 月份mon 部门dep 业绩yj ------------------------------- 一月份 01 10 一月份 02 10 一月份 03 5 二月份 02 8 二月份 04 9 三月份 03 8 table2 部门dep 部门名称dname -------------------------------- 国内业务一部 国内业务二部 国内业务三部 国际业务部 table3 (result) 部门dep 一月份 二月份 三月份 -------------------------------------- 10 null null 10 8 null null 5 8 null null 9 ------------------------------------------ create table yj01( month varchar2(10), deptno number(10), yj number(10) ) insert into yj01(month,deptno,yj) values('一月份',01,10); insert into yj01(month,deptno,yj) values('二月份',02,10); insert into yj01(month,deptno,yj) values('二月份',03,5); insert into yj01(month,deptno,yj) values('三月份',02,8); insert into yj01(month,deptno,yj) values('三月份',04,9); insert into yj01(month,deptno,yj) values('三月份',03,8); create table yjdept( deptno number(10), dname varchar2(20) ) insert into yjdept(deptno,dname) values(01,'国内业务一部'); insert into yjdept(deptno,dname) values(02,'国内业务二部'); insert into yjdept(deptno,dname) values(03,'国内业务三部'); insert into yjdept(deptno,dname) values(04,'国际业务部'); */ select * from yj01; select * from yjdept; --使用分组 select deptno, max(decode(month,'一月份',yj)) 一月份, max(decode(month,'二月份',yj)) 二月份, max(decode(month,'三月份',yj)) 三月份 from yj01 group by deptno order by deptno; --这道题给出了两张表,而用分组做,使用yj01表就能做出来了,所以这道题考察的应该是连表的知识 /*这两张表中有的月份有的部门业绩是空的,而用前几道题的做法,不匹配条件的值会被过滤掉, 例如month=一月份的只有1部门,形成的表里deptno只有1和二月份、三月份形成的表中的deptno无法匹配 而yjdept表中包含了所有部门编号deptno,这时就可以用到外连接的特性 (在满足一张表的内容都显示的基础上,连接另外一张表,如果连接匹配则正常显示,连接不匹配,另外一张表补null) */ select t1.deptno, t1.yj 一月份, t2.yj 二月份, t3.yj 三月份 from (select y2.deptno,y1.yj from (select yj, deptno from yj01 where month='一月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t1 join (select y2.deptno,y1.yj from (select yj, deptno from yj01 where month='二月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t2 on t1.deptno=t2.deptno join (select y2.deptno,y1.yj from (select yj, deptno from yj01 where month='三月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t3 on t1.deptno=t3.deptno order by t1.deptno;
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。
年后一大波找工作浪潮就要来临~ Android岗位对工程师的要求比较高,再加上就业环境的逼迫,想要找到满意的工作确实有难度! 想要从事Android岗位的朋友注意了,决定不能放松,要做到对知识举一反三,整理学习经验,那么机会就是你的! 寰福科技 1.项目重构方案 2.项目重构以后的优势 3.线上崩溃和OOM统计 4.MVVM架构的优点 5.ViewModel在Activity横竖屏切换时保存属性原
本文向大家介绍经典的20道AJAX面试题(必知必会),包括了经典的20道AJAX面试题(必知必会)的使用技巧和注意事项,需要的朋友参考一下 1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。 Ajax包含下列技术: 基于web标准(
主要内容:1.多级缓存,2.为什么大厂在大表做水平分表时严禁使用自增主键,3.布隆过滤器应用,4.IP直连的问题以及如何解决,5.负载均衡器是什么/类型/策略,6.为何禁用外健约束,7.慢SQL,8.redis,9.锁,10.oom,11.如何解决幂等性操作,12.hashmap和hashtable得到区别,13.hashmap有哪些线程安全的方法,14.5种IO,15.wait和sleep区别,,,,,,,,,,1.多级缓存 1.客户端缓存 页面缓存,浏览器缓存,APP缓存 2.应用缓存 CD
本文向大家介绍5个JavaScript经典面试题,包括了5个JavaScript经典面试题的使用技巧和注意事项,需要的朋友参考一下 1:Scope作用范围 什么会被打印在控制台上? 回答 上面的代码会打印 5。 这个问题的诀窍是,这里有两个变量声明,但 a 使用关键字var声明的。代表它是一个函数的局部变量。与此相反,b 变成了全局变量。 这个问题的另一个诀窍是,它没有使用严格模式 (‘use s
本文向大家介绍15道非常经典的Java面试题 附详细答案,包括了15道非常经典的Java面试题 附详细答案的使用技巧和注意事项,需要的朋友参考一下 试题如下: 参考答案: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
目录 1. MySQL 索引使用有哪些注意事项呢? 2. MySQL 遇到过死锁问题吗,你是如何解决的? 3. 日常工作中你是怎么优化SQL的? 4. 说说分库与分表的设计 5. InnoDB与MyISAM的区别 6. 数据库索引的原理,为什么要用 B+树,为什么不用二叉树? 7. 聚集索引与非聚集索引的区别 8. limit 1000000 加载很慢的话,你是怎么解决的呢? 9. 如何选择合适的