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,'');
- insert into test values(101,1,2,'刘二');
- insert into test values(201,2,2,'男');
- insert into test values(301,3,2,'');
- insert into test values(102,1,3,'刘三');
- insert into test values(202,2,3,'女');
- insert into test values(302,3,3,'');
- 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
- --------------------------------
- 01 国内业务一部
- 02 国内业务二部
- 03 国内业务三部
- 04 国际业务部
- table3 (result)
- 部门dep 一月份 二月份 三月份
- --------------------------------------
- 01 10 null null
- 02 10 8 null
- 03 null 5 8
- 04 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;
Oracle 经典面试题的更多相关文章
- [转帖]分享Oracle的四道经典面试题,值得收藏
分享Oracle的四道经典面试题,值得收藏 原创 波波说运维 2019-07-20 00:02:00 https://www.toutiao.com/i6713901660919300621/ 概述 ...
- spring的15个经典面试题
总结Spring框架的15个经典面试题. 什么是Spring框架? Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性. 我们一般说的Spring框架就是Spring Fram ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- 李洪强iOS经典面试题154- 通知与推送
李洪强iOS经典面试题154- 通知与推送 通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...
- 李洪强iOS经典面试题153- 补充
李洪强iOS经典面试题153- 补充 补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...
- 李洪强经典面试题152-Runtime
李洪强经典面试题152-Runtime Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...
- 李洪强iOS经典面试题147-WebView与JS交互
李洪强iOS经典面试题147-WebView与JS交互 WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...
- 李洪强经典面试题145-Runloop
李洪强经典面试题145-Runloop Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...
随机推荐
- Android官方开发文档下载
Android官方开发文档 docs-24_r02.rar(链接:https://pan.baidu.com/s/12xC998JeUHj3ndfDXPM2ww 密码:bxyk) ADT下载.Andr ...
- 通过jstack与jmap分析一次cpu打满的线上故障
一.发现问题 下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复. 二.排查思路 简单分析下可能出问题 ...
- tomcat第一次使用正常启动后访问8080端口报404错误
问题:tomcat第一次使用正常启动后访问8080端口报404错误 解决办法:双击tomcat调出tomcat的xml文件页面,Server Locations 默认是选第一行即Use Workspa ...
- Linux时间子系统之(五):POSIX Clock
专题文档汇总目录 Notes: 本章主要介绍了若干种类的静态时钟,这些时钟都可以通过k_clock表示,注册到posix_clocks中.这些都是静态时钟,可以分为三大类:各种REALTIME时钟.带 ...
- Linux时间子系统之(十五):clocksource
专题文档汇总目录 Notes:clocksource基本概念,struct clocksource详解:注册和注销clocksource:内核如何选取clocksource:clocksource相关 ...
- 'version' contains an expression but should be a constant
[WARNING] Some problems were encountered while building the effective model for com.app:cache:jar:4. ...
- 配置phpstorm自动上传代码
本地的项目目录是 D:\www\guandan 虚拟机上的项目目录是 /var/www/guandan
- Bootstrap3 多个模态对话框无法显示的问题
http://blog.csdn.net/oarsman/article/details/51387426
- javascript系列2 -- 闭包详解
转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html 请尊重笔者的劳动成果 --John Hou 今天我们从内存结构上来讲解下 java ...
- Linux下快速比较两个目录的不同
曾多次想要在Linux下比较目录a和目录b中文件列表的差别,然后对目录a比目录b中多出的文件.少掉的文件分别做处理.但是,在网上搜索了多次也都没找到能直接处理好的工具. 所以想了很多不少方法,自我感觉 ...