设为首页 收藏本站
查看: 688|回复: 0

[经验分享] oracle 高级SQL查询笔记12-01

[复制链接]

尚未签到

发表于 2016-7-28 09:48:54 | 显示全部楼层 |阅读模式
  <!-- [if !mso]>
<style>
v/:* {behavior:url(#default#VML);}
o/:* {behavior:url(#default#VML);}
w/:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->

  0
:coalesce
函数的用法?


  COALESCE(A,B,C,D) AS
别名

返回参数表中第一个不为空的值(
从左开始)

A B C D
可以是字段,
也可以是其他函数的返回值或者表达式的结果值

  1
:group by rollup
的用法。


  Oracle
数据库中的rollup
配合group by
命令使用,可以提供信息汇总功能(与"
小计"
相似)

  示例如下:
select

decode
(job,
''
,
'
合计
'
, job) job,



decode
(empno,
''
,
'
小计
'
,
'empno'
) empno,



sum
(sal)



from
emp



group

by

rollup
(job, empno)



可以看出:

用了
rollup

group by
子句所产生的所谓的超级聚合就是指在在产生聚合时会从右向左逐个对每一列进行小结,并在结果中生成独立的一行,同时也会对聚合列生成一个合计列。



例如在
scott
用户下面有一个
emp
表:


select deptno,job,sum(sal) from emp group by deptno,job;


会对每一个不同的
dept,job
生成一行独立的结果。





select deptno,job,sum(sal) from emp group by
rollup(deptno,job);


的结果中除了上述的结果结果之外,还会对每一个
deptno
进行一个小结,并单独生成一行,除此之外还会对所有的
sal
求和并生成一列。



2

having

字句的用法详解?


select
job,
sum
(sal)
from
emp
group

by
job



having

sum
(sal)>
5000





在这里,我们不能用
where
来筛选超过
5000
的薪水,因为表中不存在这样一条记录。

相反,
HAVING
子句可以让我们筛选成组后的各组数据


3


rollup
从右往左再聚合


用法和
1
一样。

cube
从左往右取



1
::
grouping sets

用法???????

分别求统计,再
union

分别求统计,再
union

select

id
,
num
,
sum
(age)
from

users

group

by

grouping

sets
((
id
),(
num
))

select

id
,
num
,
sum
(age)
from

users

group

by

rollup
((
id
,
num
));




SELECT A, B, C,


SUM( D )

FROM t

GROUP BY GROUPING SETS


( A, B, C )

等价于:


SELECT * FROM (

( SELECT A, NULL, NULL, SUM( D )

FROM t GROUP BY A )


UNION ALL

( SELECT NULL, B, NULL, SUM( D )

FROM t GROUP BY B )


UNION ALL

( SELECT NULL, NULL, C, SUM( D )

FROM t GROUP BY C )

)





成对的进行比较

select

student_id,teacher_id,class_id

from
students

where

(teacher_id,class_id)

in
(
select
teacher_id,class_id
from
students
where
student_id
in




(
222
,
332
))




from
中使用子查询
,
注意要加上别名

select

a.empno,a.ename

from
emp a,(
select
b.empno,b.sal
from
emp b) c
where

c.empno=a.empno



1

exists
,
not

exists




in
的效率问题?



select
t1.job
from
emp t1
where


exists
(
select
t2.job
from
emp t2
where
t2.job
like

'%T%'
);

--



T1

的数据量小而

T2

的数据量大的时候使用,查询的效率比较高。




select
T1.job
from
emp T1
where
T1.JOB

IN
(
select
T2.job
from
emp T2
where
T2.job
like

'%T%'
);



--



T1

的数据量非常大二

T2

的数据量小的时候



,查询的效率比较高。








Not in

和not exit
的效率问题?

数据库:oracle


数据量:52000
条记录

用not exists
比not in
执行的效率要高的多



select * from quyu_t a where a.version='256' and not exists(select
'x' from quyu_t_his b

where a.username=b.username);



-------
用not in
效率低

select * from quyu_t where username not in (select
username from quyu_t_his)

2
个一比较简直是太明显了







10
oracle rank()
函数总结






首先
,
要了解
rank
在英语的意思
:
等级
.
也就是说这是一个给数据确定等级的函数
.

rank()
对表中的数据进行分级排序
.

例如:

select

e.ename,e.job,e.mgr,e.sal,


rank
( )
over
(
PARTITION


by
e.job
order

by
e.sal
desc
) rank1

from
emp
e


执行结果图如下:









意思就是先按照
job
进行分级。


job
的每一个级别的数据进行排序。可以出现同一等级。

比如
analyst
都是并立第一则
rank1
都为
1


在每一个级别里边在按照
order by
进行排序。比如
clerk
rank1

分别就是
1,2,3,4.

如果要去每一个分组里的第一名的话则如下得到
SQL


select
*
from
(

select

e.ename,e.job,e.mgr,e.sal,


rank
( )
over
(
PARTITION


by
e.job
order

by
e.sal
desc
) rank1

from
emp
e




)
where
rank1=
'1'





效果如下:




这样
rank1
就取出每一个里边是第一个名的数据。重复的也存在。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250520-1-1.html 上篇帖子: (转发)PostgreSQL 与 Oracle 相异点 下篇帖子: jdbc sqlserver oracle 驱动问题集锦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表