您的位置:首页 > 数据库 > Oracle

oracle 开窗函数的使用,表的外关联,子查询的封装以及where使用的注意事项

2017-02-17 10:12 435 查看
  WHERE 后面的条件中不能有聚集函数,比如SUM(),AVG()等,而HAVING 可以 所以在运算的时候要注意聚集函数主要有:最大,最小,总数,总和,平均 ,这些是无法跟在WHERE后面的,left join  左边的表为基表 右表参照左边搜索符合的条件   左边也就是left左边的表,同理右关联的基表是right 右边的表(那个关联 就把基表放在那边)
+在左边就是右关联,+在右边就是左关联。
with as  也叫子查询部分,就是将查到的一大堆结果集封装到一个虚拟视图中取一个别名,WITH as 方法的优点:
  增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。

基本语法是 with  temname  as(select..............  from  table....) as 别名
select ...............  from  别名.....加一些条件

重点
over开窗函数:  首先  区分有无partition by
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和(最后只出现每个部门的总和 类似于第三个)
sum(sal) over (partition by deptno) 按部门求总和(只求每个部门的总和)
sum(sal) over (order by deptno,ename) 不按部门“连续”求总和(也就是累加的意思,在一个字段进行累加计算,第二个部门的总和等于第一个部门加第二个部门和)
sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。(也就是最后每个部门出现的值是所有部门的值的总相加)

rank()over是分级函数,比如我要求出每个部门的前四名就可以这样写

SELECT A.AREA_ID, A.ACCT_MONTH, A.FEE, A.ITEM_ID, A.USER_ID
  FROM (SELECT T.AREA_ID,
               T.ACCT_MONTH,
               T.FEE,
               T.ITEM_ID,
               T.USER_ID,
               RANK() OVER(PARTITION BY T.ITEM_ID ORDER BY T.FEE DESC) RK
          FROM TEST T) A
 WHERE RK < 4;
rank  就是将数据进行分级排序,如数据出现相同,  则并列 但是会占用后面的名字  如12245
dense_rank用法和rank相似 但是如果出现相同的数据 他们会并列  但是并列不占后面的名次如 12234
row_number  这个无需考虑数据是否相同,即使相同 他们也会正常排序  如12345
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: