Oracle经典实例——高级查询

1.结果集分页

窗口函数ROW_NUMBER将会为每一行记录分配一个唯一的数字编号(从1开始递增):

select row_number() over(order by field1) rn, field1 from table_name;

有了行编号,通过指定的RN值就可以返回任意区间的值
窗口函数ROW_NUMBER用于删除重复记录:

delete from table_name
 where t.rowid in (
    select t1.rowid from (select t2.rowid,
        t2.*,row_number() over(partition by t2.field1, t2.field2 order by t2.field3) rn
            from table_name t2) t1
                where t2.rn > 1);
2.跳过n行记录

使用窗口函数ROW_NUMBER和MOD跳过编号为偶数的行:

select field1 from(select row_number() over(order by field1) rn,field1) x
where mod(rn,2)=1;
3.在外连接查询里使用OR逻辑

查询部门编号为10和20的员工名字和部门信息,以及部门编号为30和40的部门信息(但不包含员工信息),
考虑将OR条件放到JOIN子句里:

select e.ename,d.deptno,d.dname,d.loc from dept d
left join emp e on (d.deptno=e.deptno
and (e.deptno=10 or e.deptno=20))
order by 2;

也可以使用内嵌视图过滤EMP.DEPTNO,然后再执行外连接:

select e.ename,d.deptno,d.name,d.loc from dept d
left join (select ename,deptno from emp 
     where deptno in (10,20)) e
on e.deptno=d.deptno
order by 2;
4.提取最靠前的n行记录

使用窗口函数DENSE_RANK对每个Tie进行一次计数:

select field1,field2 from (
 select field1,field2 dense_rank() over (order by field2 desc) dr
    from table_name) x where dr<=5;

在排序计算的过程中,如果一个名次上出现了多个候选项,则每一个候选项称为“一个Tie”,
以上查询可能返回函数可能超过5,但只有5种不同的值

5.找出最大和最小的记录

使用窗口函数MIN OVER和MAX OVER分别找出最大和最小小工资的记录:

select ename
  from (select ename, sal, min(sal) over() min_sal, max(sal) over() max_sal
          from emp) x
 where sal in (min_sal, max_sal);
6.查询未来的行

使用窗口函数LEAD OVER查询下一个员工的工资,且工资为递增:

select ename,sal,hirdate from (
  select ename,sal,hirdate,
  lead(sal)over(order by hirdate) next_sal
    from emp
) where sal<next_sal;
7.对结果进行排序

使用窗口函数DENSE_RANK OVER、ROW_NUMBER OVER、RANK OVER,排序变得极其简单方便:

select dense_rank over(order by field1) rnk,field1,field2 from table_name;
8.删除重复项

传统去重的方法是使用DISTINCT或者GROUP BY,另外一种替代方法是使用窗口函数ROW_NUMBER OVER:

select field from (
  select field,row_number()over(partition by field order by field) rn
    from table_name
) x where rn=1;

整理自《SQL经典实例》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • 分析函数,也称为窗口函数,通常被认为仅对数据仓库SQL有用。使用分析函数的查询,基于对数据行的分组来计算总量值。与...
    猫猫_tomluo阅读 3,323评论 3 18
  • 这一周主要学习了 Hive 的一些基础知识,学习了多个 Hive 窗口函数,虽然感觉这些窗口函数没有实际的应用...
    大石兄阅读 2,750评论 2 8
  • row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意...
    奶茶007阅读 1,280评论 0 1
  • over在聚合函数中的使用:一般格式:聚合函数名(列) over(选项)over必须与聚合函数或排序函数一起使用...
    酸甜柠檬26阅读 5,409评论 0 5