oracle 高级函数

2017年08月17日 16:44:19
阅读数:1731

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013278314/article/details/77335103

ORACLE常用SQL

工作两年了,一直使用的oracle,最近经常使用不常用的sql语句,索性就自己整理一下,发出来 供大家参考,后续会不断添加、整理,本文章不做详细的功能解释,主要集合描述目前接触过的一些函数

复制表结构和数据

CREATE TABLE table_name AS SELECT * FROM old_table_name;

只复制表结构

CREATE TABLE table_name AS SELECT * FROM old_table_name
WHERE 1=2

只复制表数据

两个表结构一毛一样:

INSERT INTO  table_name select * from old_table_name;

结构不完全一致:

Insert into table_name(column1,column2...) select column1,column2 from old_table_name;

递归查询

从根节点开始查询:

Select t.*,level  from table_name t  start with t.id=0 connect by prior t.id=t.pid order by level

从子节点开始查询:

把上面的开始节点换成开始的子节点,并且prior
放在子节点前面

Select t.*,level  from table_name t  start with t.id=10
connect by t.id= prior t.pid order by level

合并字符串(简单的行专列)

Select to_char(wm_concat(column1 || ‘-’ || column2))  from table group by column1

拆分字符串

select REGEXP_SUBSTR('01#02#03#04', '[^#]+', 1, rownum) as newport from dual connect by rownum <= REGEXP_COUNT('01#02#03#04', '[^#]+');

With as 临时表

With t as (select 1 id,2 pid from dual),

t2 as (select 1 id,22 pid from dual)

Select t2.* from t,t2 where t.id=t2.id

行专列查询

with t as (

Select ‘桃子’ name, 300 nums ,1 jidu from dual

Union

Select ‘苹果’ name, 200 nums ,1 jidu from dual

Union

Select ‘西瓜’ name, 100 nums ,1 jidu from dual

Union

Select ‘桃子’ name, 111 nums ,2 jidu from dual

Union

Select ‘西瓜’ name, 222 nums ,2 jidu from dual

Union

Select ‘苹果’ name, 333 nums ,2 jidu from dual

)

Select * from t pivot(sum(nums)  for name in (‘桃子’,’西瓜’,’苹果’))
order by jidu

列转行查询

With t as (

Select 1 id,’桃子’ name,100 q1,200 q2,300 q3,400 q4 from dual

Union

Select 2 id,’苹果’ name,111 q1,222 q2,333 q3 444 q4 from dual

Union

Select 3 id,’西瓜’ name,123 q1,234 q2,345 q3,456 q4 from dual

)

Select * from t unpivot(nums for jidu in (q1,q2,q3,q4)) order by id

排序函数

这里复制的别人的

原文链接:http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html

1     select region_id, customer_id, sum(customer_sales) total,

  2         rank() over(order by sum(customer_sales) desc) rank,
  3         dense_rank() over(order by sum(customer_sales) desc) dense_rank,
  4         row_number() over(order by sum(customer_sales) desc) row_number
  5    from user_order

  6   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER

---------- ----------- ---------- ---------- ---------- ----------

            

         8          18                1253840         11         11         11

         5           2                 1224992         12         12         12
         9          23                1224992         12         12         13
         9          24                1224992         12         12         14
        10          30               1216858         15           13            15

请注意上面的绿色高亮部分,这里生动的演示了3种不同的排名策略:

①对于第一条相同的记录,3种函数的排名都是一样的:12

②当出现第二条相同的记录时,Rank和Dense_rank依然给出同样的排名12;而row_number则顺延递增为13,依次类推至第三条相同的记录

③当排名进行到下一条不同的记录时,可以看到Rank函数在12和15之间空出了13,14的排名,因为这2个排名实际上已经被第二、三条相同的记录占了。而Dense_rank则顺序递增。row_number函数也是顺序递增

使用分析函数为记录进行分组排名:

上面的排名是按订单总额来进行排列的,现在跟进一步:假如是为各个地区的订单总额进行排名呢?这意味着又多了一次分组操作:对记录按地区分组然后进行排名。幸亏Oracle也提供了这样的支持,我们所要做的仅仅是在over函数中order by的前面增加一个分组子句:partition
by region_id。

select region_id, customer_id, sum(customer_sales) total,

 rank() over(partition by region_id

    order by sum(customer_sales) desc) rank,

 dense_rank() over(partition by region_id

    order by sum(customer_sales) desc) dense_rank,

 row_number() over(partition by region_id

   order by sum(customer_sales) desc) row_number

from user_order

 group by region_id, customer_id;

REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER
                                                         
                                                                  
                                                                  
                                                                  
                                                                  
                                
                               

现在我们看到的排名将是基于各个地区的,而非所有区域的了!Partition by 子句在排列函数中的作用是将一个结果集划分成几个部分,这样排列函数就能够应用于这各个子集。

存在则修改,不存在则新增

判断表里面是否有满足条件的数据,存在则修改,不存在则新增

MERGE INTO T T1

USING (SELECT '1001' AS a,2 AS b FROM dual) T2ON ( T1.a=T2.a)

WHEN MATCHED THEN

UPDATE SET T1.b = T2.b

WHEN NOT MATCHED THEN

INSERT (a,b) VALUES(T2.a,T2.b);

全连接

select * from dept full join employee on dept.deptid=employee.deptid

Nulls last/first

空值排最前面或者最后面

Select * from table_name order by id nulls first/last

取top N条数据

SELECT NO FROM (

SELECT ROW_NUMBER() OVER (ORDER BY NO) RNO, NO FROM ROWNUM_TEST

)WHERE RNO <= 5  ORDER BY NO ;

分组函数(rollup,cube,grouping sets)

 rollup

假设有一个表test,有A、B、C、D、E5列。

如果使用group by rollup(A,B,C),首先会对(A、B、C)进行GROUP
BY,然后对(A、B)进行GROUP
BY,然后是(A)进行GROUP BY,最后对全表进行GROUP
BY操作。roll up的意思是“卷起”,这也可以帮助我们理解group
by rollup个sql的结果集是一样的:

Select A,B,C,sum(E) from test group by rollup(A,B,C)

Select A,B,C,sum(E) from test group by A,B,C

union all

Select A,B,null,sum(E) from test group by A,B

union all

Select A,null,null,sum(E) from test group by A

union all

Select null,null,null,sum(E) from test

 cube

cube的意思是立方,对cube的每个参数,都可以理解为取值为参与grouping和不参与grouping两个值的一个维度,然后所有维度取值组合的集合就是grouping的集合,对于n个参数的cube,有2^n次的grouping。如果使用group
by cube(A,B,C),,则首先会对(A、B、C)进行GROUP
BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP
BY操作,一共是2^3=8次grouping。同rollup一样,也可以用基本的group
by加上结果集的union all写出一个与group
by cube结果集相同的sql:

Select A,B,C,sum(E) from test group by cube(A,B,C);

Select A,B,C,sum(E) from test group by A,B,C

union all

Select A,B,null,sum(E) from test group by A,B

union all

Select A,null,C,sum(E) from test group by A,C

union all

Select A,null,null,sum(E) from test group by A

union all

Select null,B,C,sum(E) from test group by B,C

union all

Select null,B,null,sum(E) from test group by B

union all

Select null,null,C,sum(E) from test group by C

union all

Select null,null,null,sum(E) from test;

 grouping sets

grouping sets就是对参数中的每个参数做grouping,也就是有几个参数做几次grouping,例如使用group
by grouping sets(A,B,C),则对(A),(B),(C)进行group
by,如果使用group by grouping sets((A,B),C),则对(A,B),(C)进行group
by次group
by,grouping sets的参数允许重复

Keep

ID MC SL
  
  
  
  
  
  
  
  
  

 rows selected

SQL> 

SQL    ;

ID MC SL     
    
    
    
    
    
    
    
    

ratio_to_report 占比函数

SELECT

empno,ename,ename,hiredate,sal,deptno,

ratio_to_report(sal) over () as pct1,

ratio_to_report(sal) over (partition by deptno) as pct2

FROM emp;

Pct1 是求sal在所有sal中的比率

Pct2是求sql在按deptno分组后 所占的比率

NVL2

Select nvl2(1,2,3) FROM DUAL 相当于三目运算符

如果第一个参数为null
返回3,否则返回2

COALESC

从左到右返回第1个非null值,若所有的列表元素都为null,则返回null.它有短路计算功能,

Select COALESC(null,null,null,2null) FROM DUAL

translate函数

translate(x, from_string, to_string)函数在x中查找from_string中的字符,并将其转换成to_string中对应的字符。

from_string和to_string中的字符是一一对应的,然后根据这种对应关系,将原字符串进行转换;

select translate('ab123', 'abcdefg123', '3456789abc') from dual;

结果是: 3b5abc

oracle 高级函数2的更多相关文章

  1. oracle 高级函数

    原 oracle 高级函数 2017年08月17日 16:44:19 阅读数:1731 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013278 ...

  2. Oracle高级函数

    http://www.cnblogs.com/chen1388/archive/2010/07/06/1771919.html decode函数: decode(aa, 1, 'xs', 2, 'ps ...

  3. Oracle高级函数篇之递归查询start with connect by prior简单用法

    路飞:" 把原来CSDN的博客转移到博客园咯!" 前段时间,自己负责的任务中刚好涉及到了组织关系的业务需求,自己用了oracle递归查询.下面简单来举个例子.在工作中我们经常会遇到 ...

  4. oracle 高级分组

    oracle 高级分组 博客分类: 数据库基础 oraclesql  10.高级分组 本章目标: 对于增强的group by需要掌握: 1.使用rollup(也就是roll up累计的意思)操作产生s ...

  5. oracle高级查询(实例基于scott用户四张表)

    oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ====================================================== ...

  6. oracle add_months函数

    oracle add_months函数 add_months 函数主要是对日期函数进行操作,举例子进行说明 add_months 有两个参数,第一个参数是日期,第二个参数是对日期进行加减的数字(以月为 ...

  7. Oracle to_date()函数的用法

    Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...

  8. Oracle over函数

    Oracle over函数   SQL code: sql over的作用及用法RANK ( ) OVER ( [query_partition_clause] order_by_clause )DE ...

  9. Oracle常用函数

    前一段时间学习Oracle 时做的学习笔记,整理了一下,下面是分享的Oracle常用函数的部分笔记,以后还会分享其他部分的笔记,请大家批评指正. 1.Oracle 数据库中的to_date()函数的使 ...

随机推荐

  1. hadoop SecondNamenode详解

    SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA. 真正的了解了SecondNamenode以后,才发 ...

  2. eclipse从svn导入静态文件

    1.从eclipse 选择 导入 2.选择仓库和项目,选择finish 3.选择project项目导出

  3. 前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)

    摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开 ...

  4. C#面向对象三大特性:多态

    什么是多态 公司最近为了陶冶情操,养了几种动物(Animal),有猫(Cat).狗(Dog).羊(Sheep),这些动物都有共同的特性,会吃(Eat).会叫(Shout),但是它们吃的不同,叫的也不同 ...

  5. wordpress 上传图片出现权限或者http错误

    首先上传图片的时候出现了 5.jpg 无法建立目录“wp-content/uploads”/2018/07.有没有上级目录的写权限? 然后啊,找方法啊 1.把var/www/wp-content/up ...

  6. Goland debug失败

    在使用goland使用debug调试代码出现 API server listening at: 127.0.0.1:56871could not launch process: debugserver ...

  7. Laravel Vuejs 实战:开发知乎 (2)用户登录

    1.安装一个给用户提示的扩展包: 二选一: https://github.com/laracasts/flash [我选的这个]https://github.com/oanhnn/laravel-fl ...

  8. Jmeter之cookie处理的2中方法

    不添加cookie会出现什么结果呢? 举例:1)登录 2)手机充值 2.登录HTTP请求 3.充值 4.查看结果树,登录是成功的,但是充值不成功,提示请先登录. 如何解决这个问题呢?添加Cookie管 ...

  9. Java面向对象封装优化1_this(Python中的self)

    1. 类 package cn.itcast.day06.demo03; /* 问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来. 解决方案:用private关键字将需要保护的成员变 ...

  10. 计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。

    //给定程序中fun函数的功能是:从低位开始取出长整形变量s中奇数位上的数,依次构成一个新的数放在t中.高位仍在高位,低位仍在低位.例如:当s中的数为7654321时,t中的数为7531. //重难点 ...