Oracle的一些经典SQL面试题
实例1:测试数据:
create table nba(
team varchar2(20),
year number(4)
)
SQL> select * from nba;
TEAM YEAR
-------------------- -----
活塞 1990
公牛 1991
公牛 1992
公牛 1993
火箭 1994
火箭 1995
公牛 1996
公牛 1997
公牛 1998
马刺 1999
湖人 2000
湖人 2001
湖人 2002
马刺 2003
活塞 2004
马刺 2005
热火 2006
马刺 2007
凯尔特人 2008
湖人 2009
湖人 2010
21 rows selected
请写出一条 SQL 语句,查询出在此期间连续获得冠军的有哪些,其连续的年份的起止时间是多少,结果如下:
TEAM BEGIN END
---------------
公牛 1991 1993
火箭 1994 1995
公牛 1996 1998
湖人 2000 2002
湖人 2009 2010
求解:
SQL> select team, min(t2y), max(t1y)
2 from (select t2.team, t2.year as t2y, t1.year as t1y
3 from nba t1, nba t2
4 where t1.team = t2.team
5 and t1.year = (t2.year + 1)) t
6 group by t.team, (t.t1y - rownum);
TEAM MIN(T2Y) MAX(T1Y)
-------------------- ---------- ----------
公牛 1996 1998
湖人 2009 2010
湖人 2000 2002
公牛 1991 1993
火箭 1994 1995
分析:这个SQL要做的有两件事:
1)求出连续获得冠军的team
2)求出起止年份
关系:根据分析1可知,存在关系team相同的球队(year=year+1),满足这个关系的球队即是连续获得冠军的球队。可以得到SQL如下:
SQL> select t2.team, t2.year as t2y, t1.year as t1y
2 from nba t1, nba t2
3 where t1.team = t2.team
4 and t1.year = (t2.year + 1);
TEAM T2Y T1Y
-------------------- ----- -----
公牛 1991 1992
公牛 1992 1993
火箭 1994 1995
公牛 1996 1997
公牛 1997 1998
湖人 2000 2001
湖人 2001 2002
湖人 2009 2010
8 rows selected
sql中t2y字段表示球队获得冠军每连续两行之间的最小年份,t1y为连续两行记录间的最大年份,最终满足分析1,和2的结果集到此都可以从这个临时表中取得了。
下面我们需要对这个临时表做一个分组,即连续获得冠军的球队我们只需要1行记录用做显示,分组字段是什么呢?观察临时表结构,这里我们采用(team,t1y-rownum)作为分组条件,这样连续获得冠军的球队team就可以用一行显示了。那么我们还差起止年份需要处理一下,就可以出具最终的查询结果了!从临时表结构可以看出通过(team,t1y-rownum)分组后,可以由t2y字段我们求出开始年份,即(min(t2y)),可以由t1y字段求出结止年份,即(max(t1y))!继续处理SQL如下:
SQL> select t.team, min(t2y), max(t1y)
2 from (select t2.team, t2.year as t2y, t1.year as t1y
3 from nba t1, nba t2
4 where t1.team = t2.team
5 and t1.year = (t2.year + 1)) t
6 group by t.team, t1y - rownum
7 order by min(t2y);
TEAM MIN(T2Y) MAX(T1Y)
-------------------- ---------- ----------
公牛 1991 1993
火箭 1994 1995
公牛 1996 1998
湖人 2000 2002
湖人 2009 2010
总结一下,对于这套面试题,对于DBA出身的我,没有处理过类似问题,如果是我遇到了,估计在纸上是写不出来,但是自己处理,是可以求出如上结果的。所以写SQL是一个循序渐进的过程,不是一蹴而就的结果。
Oracle的一些经典SQL面试题的更多相关文章
- 经典SQL面试题(转)
以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...
- 经典SQL面试题(转)
http://www.cnblogs.com/kcher90/archive/2013/03/13/2957932.html 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录 ...
- 经典sql面试题(学生表_课程表_成绩表_教师表)
转载:https://www.cnblogs.com/qixuejia/p/3637735.html 表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna ...
- [转帖]分享Oracle的四道经典面试题,值得收藏
分享Oracle的四道经典面试题,值得收藏 原创 波波说运维 2019-07-20 00:02:00 https://www.toutiao.com/i6713901660919300621/ 概述 ...
- Oracle经典SQL
最近本人整理了一些Oracle sql,现分享给大家,后续还会更新.如果有错误的地方,请指正,共同学习.贴上去的sql都是我测试过的,大家可以粘贴在自己的电脑上试试. 1.查询部门的名称,及最低收入雇 ...
- MySql_34道经典Sql试题
MySql_34道经典Sql试题 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiaouncle/article/details/799390 ...
- (转)经典SQL查询语句大全
(转)经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql s ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- 经典sql语句大全,【转载】
经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql se ...
随机推荐
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(全部权转移)
C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ...
- ES 安装 head安装
https://www.elastic.co/downloads/elasticsearch http://www.cnblogs.com/xuxy03/p/6039999.html https:// ...
- HashMap中的hash算法总结
前言 算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的. 数学知识回顾 << : 左移运算 ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
- pycharm开发python利器入门
内容包含:pycharm学习技巧 Learning tips.PyCharm3.0默认快捷键(翻译的).pycharm常用设置.pycharm环境和路径配置.Pycharm实用拓展功能:pycharm ...
- SAP Study Notes: BW Queriy-Variables(变量)
About Variable:1.Variable 是和InfoObject绑定的,可用于任何含有该IO的query中.2.Variable有以下几种类型:Characteristic:用于限制Cha ...
- 全面理解Java内存模型(JMM)
理解Java内存区域与Java内存模型Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区 ...
- stm32+rx8025
// 设备读写地址 #define RX8025_ADDR_READ 0x65 #define RX8025_ADDR_WRITE ...
- Java知多少(80)图形界面设计基础
早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上.现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单.按钮等,用户通过鼠 ...
- 避免在构造函数中调用虚方法(Do not call overridable methods in constructors)
CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的 ...