Oracle常用函数总结

Oracle函数,当任意一个参数为空字符串或者null时,结果返回null

聚合函数

count

使用方式有5种

select count(*) from student;--统计总行数
select count(0) from student;--统计总行数,括号里面的0表示什么意思?
select count(id) from student;--统计列id不为null的总行数select count(rowid) from student;--统计总行数select count(distinct id) from student;--统计id不为null并且去掉id重复的总行数

ps:前面四种count的方式,在没有索引的情况是一样的,都会全表扫描。选中SQL按F5会打开解释计划窗口,可以看到前四种count的方式执行过程都是一样。如果有索引,一般情况下,count(*),count(0),count(rowid)会走索引,count(id)走索引扫描还是走全表扫描要看字段id是否有索引。

sum

select sum(idno) from student;--任意行的idno不能为非数字,可以为null

avg

select avg(idno) from student;--计算之前会把null值排除在外

max

select max(idno) from student;--

列中的数据可以是数值、字符串或是日期时间数据类型,会忽略null值,但是如果所有的值都为null,则会返回null,字符串是怎么比较大小的?

min

select min(idno) from student;--同上

字符函数

大小写

select lower(name) from dual; --lower()转小写
select upper(name) from dual; --upper()转大写
select initcap(name) from dual; --initcap()首字母大写

非英文字母不会进行转换,但任然会查询出来,null值也会查询出来

数据内容合并

select concat(id,name) from student;--concat函数只能是两个参数,多行数据内容合并成一行可以使用||

字符串截取

substr

只针对字符类型

select substr('HelloWorld',0,3) value from dual;--返回结果:Hel,截取从“H”开始3个字符
select substr('HelloWorld',1,3) value from dual;--返回结果:Hel,截取从“H”开始3个字符
select substr('HelloWorld',2,3) value from dual;--返回结果:ell,截取从“e”开始3个字符
select substr('HelloWorld',0,100) value from dual;--返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
select substr('HelloWorld',5,3) value from dual;--返回结果:oWo
select substr('Hello World',5,3) value from dual;--返回结果:o W (中间的空格也算一个字符串,结果是:o空格W)
select substr('HelloWorld',-1,3) value from dual;--返回结果:d (从后面倒数第一位开始往后取1个字符,而不是3个。)
select substr('HelloWorld',-2,3) value from dual;--返回结果:ld (从后面倒数第二位开始往后取2个字符,而不是3个。)
select substr('HelloWorld',-3,3) value from dual;--返回结果:rld (从后面倒数第三位开始往后取3个字符)
select substr('HelloWorld',-4,3) value from dual;--返回结果:orl (从后面倒数第四位开始往后取3个字符)select substr('HelloWorld',0) value from dual;--返回结果:HelloWorld,截取所有字符
select substr('HelloWorld',1) value from dual;--返回结果:HelloWorld,截取所有字符
select substr('HelloWorld',2) value from dual;--返回结果:elloWorld,截取从“e”开始之后所有字符
select substr('HelloWorld',3) value from dual;--返回结果:lloWorld,截取从“l”开始之后所有字符
select substr('HelloWorld',-1) value from dual;--返回结果:d,从倒数一个“d”开始,截取所有字符
select substr('HelloWorld',-2) value from dual;--返回结果:ld,从倒数第二个“l”开始,截取所有字符
select substr('HelloWorld',-3) value from dual;--返回结果:rld,从倒数第三个“r”开始,截取所有字符

trunc

trunc可以对日期进行格式化,有关日期的格式参数,参考https://blog.csdn.net/qq_26565861/article/details/83110968

trunc可以对数字进行截取,与round的区别是不进行四舍五入

字符串长度计算

--length计算字符数,lengthb计算字节数,编码方式为UTF8/GBK时,一个中文占3/2个字节长度
select length('hello你好') from dual;
select lengthb('hello你好') from dual;

查找字符的位置

select instr('helloworld', 'o') from dual;--instr从左向右找第一次出现的位置,从1开始
select instr('helloworld', 'z') from dual;--找不到返回0

填充

select lpad('hello',10,'#')from dual;--lpad如果位数不够,从左边开始补位
select lpad('hello',10)from dual;--第三个参数不传时,用空格
select lpad('甲骨文',10,'$') from dual;--注意字符集编码为UTF8时中文也是占用两个长度
select rpad('hello',3,'#')from dual;--rpad如果位数不够,从右边边开始补位

去除空格

--基本用法,注意全角空格去不掉
SELECT trim('    aaa  bbb  ccc     ')  trim FROM dual;
SELECT ltrim('    aaa  bbb  ccc     ')  trim FROM dual;
SELECT rtrim('    aaa  bbb  ccc     ')  trim FROM dual;
--高级用法,去除特定字符 trim( leading | trailing | both string1 FROM string2) 注意string1只能是单个字符,如果没有设置string1参数,默认去除空字符串
SELECT trim(leading  '$'  from  '$aaa  bbb  ccc$')  FROM dual;
SELECT trim(trailing  '$'  from  '$aaa  bbb  ccc$')  FROM dual;
SELECT trim(both '$'  from  '$aaa  bbb  ccc$')  FROM dual; 
SELECT trim(both  from  '  aaa  bbb  ccc  ')  FROM dual;  

字符串替换

select replace('heLLo','LL','ll') from dual;
select replace('heLLo','LL') from dual;--未设置第三个参数时表示用空字符串替换

数字函数

四舍五入

--第二个参数为正整数表示小数点后多少位,0表示取整,负数表示小数点前n+1位
select   round(1234.5678,4)   from   dual;
select   round(1234.5678,3)   from   dual;
select   round(1234.5678,0)   from   dual;
select   round(1234.5678,-1)   from   dual;
--对日期处理
select round(to_date('2003-10-15','yyyy-mm-dd'),'month')from dual;
select round(to_date('2003-10-16','yyyy-mm-dd'),'month')from dual;
select round(to_date('2003-6','yyyy-mm'),'year')from dual;
select round(to_date('2003-7','yyyy-mm'),'year')from dual;

转换函数

to_char

日期类型转字符串TO_CHAR(DATETIME)

select   to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')   from   dual;

关于日期格式不同符号代表什么意思,可以参考https://blog.csdn.net/qq_26565861/article/details/83110968

数字格式化TO_CHAR(NUMBER)

select to_char(1234,'9,9,9,9')   from dual;
select to_char(1234.34,'9,9,9,9.99')   from dual;
select to_char(1234.34,'9,9,9,9.$99')    from dual;

更多数字格式化的参数,参考https://blog.csdn.net/jinlong5200/article/details/3135949

把NCLOB,CLOB,NCHAR转换为VARCHAR2 TO_CHAR(CHARACTER)

to_date

参考https://blog.csdn.net/qq_26565861/article/details/83110968

to_number

可以将char和varchar2类型转换成number类型

select to_number('$234234.4350','$999999.0000') from dual;
格式值含义
9代表一个数字
0强迫0显示
$显示美元符号
L强制显示一个当地的货币符号
.显示一个小数点
显示一个千位分隔符号

cast

cast可以进行数据类型转换

语法:cast( 列名/值 as 数据类型 )

select cast(1 as varchar2(10))  from dual;
select cast('1' as number) from dual;

判断函数

decode

用来判断值是否相等,语法格式为:decode(列或值,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

具体含义为:如果列或值等于第一个值,那么返回第一个返回值,如果等于第二个值,那么返回第二个返回值,否则返回缺省值

select decode('小米','华为','android','三星','android','苹果','ios','其他') from dual;
select decode('小米','华为','android','三星','android','苹果','ios') from dual;--如果没有设置默认值参数,返回null

nvl

语法:NVL(参数1,参数2 )

含义:如果参数1不为null,则返回参数1,否则返回参数2

select nvl('测试','默认值') from dual;

nvl2

语法:nvl2(参数1,参数2,参数3)

含义:如果参数1不为null,返回参数2,否则返回参数3

select nvl2('','参数2','参数3') from dual;
select nvl2('参数1','参数2','参数3') from dual;

nullif

语法:NULLIF (参数1,参数2)

含义:若两个参数相等,返回NULL;不相等,等返回参数1

其他函数

ROW_NUMBER()OVER

一对多取多的一方最新的一条数据,分类(PARTITION BY)排序(ORDER BY )

SELECT * FROM(SELECT u.*,ROW_NUMBER()OVER(PARTITION BY p.user_id ORDER BY p.flush_time desc)RNFROM STS_LPATROL_APPUSER_T uleft JOIN STS_LPATROL_PHONEDEV_T p ON u.user_id=p.user_id)T where  RN=1

pivot

行转列:将多行数据转换成一行数据的多个列

create table tb_student_grade(name varchar2(50),id varchar2(32),course varchar2(50),grade number);insert into tb_student_grade(name,id,course,grade) values('cc','1','math',100);
insert into tb_student_grade(name,id,course,grade) values('cc','1','chinese',110);
insert into tb_student_grade(name,id,course,grade) values('cc','1','english',120);insert into tb_student_grade(name,id,course,grade) values('cc','2','math',100);
insert into tb_student_grade(name,id,course,grade) values('cc','2','chinese',110);
insert into tb_student_grade(name,id,course,grade) values('cc','2','english',120);insert into tb_student_grade(name,id,course,grade) values('lp','3','math',50);
insert into tb_student_grade(name,id,course,grade) values('lp','3','chinese',60);
insert into tb_student_grade(name,id,course,grade) values('lp','3','english',70);commit;select * from tb_student_grade pivot(max(grade) for course in('math' as 数学,'chinese' as 语文,'english' as 英语));

unpivot

列转行:将一行数据的多个列转换成多行数据

select * from tb_student_grade pivot(max(grade) for course in('math' as 数学,'chinese' as 语文,'english' as 英语)) unpivot(grade for course in(数学,语文,英语));

合并多行数据

wm_concat

用来将分组后的多行数据合并成一行

select t.deptno,wm_concat(t.ename) from emp t group by t.deptno;

ename拼接的顺序不是按照ename来的

listagg

select t.deptno,listagg(t.ename,':') within group (order by t.ename) from emp t group by t.deptno;

ename拼接的顺序可以按照某个字段来,拼接的字符也可以指定。是11g新增的函数

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA基础篇】==、equals和hashCode的区别和联系

作用:比较两个操作数的关系,返回一个boolean类型的结果 具体含义:如果两个操作数是基本数据类型,比较值是否相等。如果两个操作数是引用类型,那么比较的是内存地址是否相同。 equals Object类的实例方法&#xff0c…

【JAVA基础篇】内部类

定义在一个类内部的类称为内部类。内部类访问权限可以是public、protected、default或private,可以声明为abstract供其他内部类或外部类继承,可以声明为static、final,也可以实现特定的接口。外部类可以访问内部类的所有方法与属性&#xff0…

【JAVA基础篇】访问权限

所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。 四种访问权限 Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四…

Oracle存储过程

什么是存储过程 存储过程是一组为了完成特定功能的SQL语句,经编译后存在数据库,存储过程是数据库中的一个重要对象。 ps:有人说:任何一个设计良好的数据库应用程序都应该用到存储过程,我觉得这个不一定,其实很多互联…

解决debug JDK source无法查看局部变量的问题

首先进入传送门:https://blog.csdn.net/majian_1987/article/details/51273609 进行上面的操作之后,这个时候我们来debug一下jdk源码,发现可以查看局部变量。但是这时候又发现一个问题,在我自己的代码里按住ctrl鼠标左键单击无法…

【JAVA基础篇】多线程

学习Java的多线程知识之前,我们先来了解一下进程和线程的概念,以及他们之间的关系。 进程 基本概念 进程是具有独立功能的程序在某个数据集合上的一次执行过程。 特点 进程是操作系统进行资源分配的基本单位。每个进程都有自己的地址空间&#xff0…

配置JAVA开发环境

1、首先去Oracle官方网站下载所需版本的JDKhttp://java.sun.com/products/archive/,然后安装,其实只需要安装jdk就可以了,不需要安装jre 2、按照后配置环境变量JAVA_HOME 然后在path最前面添加%JAVA_HOME%\bin; 3、cmd中输入java -version,提…

【JAVA基础篇】枚举

/*** 一组相同类型的常量的集合* author cc**/ public class EnumDemo {public static void main(String[] args) {//遍历for(WorkDay workDay:WorkDay.values()){System.out.println("序号:"workDay.ordinal());//ordinal,返回枚举常量的序号…

【JAVA基础篇】集合框架

一、集合框架图 Java集合框架主要包含两种类型的容器,一是集合(Collection),存储元素集合,二是图(Map),存储键(key)-值(value)对.Collection接口下面有两个重要的子接口List和Set,再下面是一些抽象类,最后是…

【JAVA基础篇】对象初始化过程

我们都知道,创建对象是由 new关键字调用构造方法 返回类实例(实际上还可以通过反射来创建实例)。 例如 : Person jack new Person(); 这句话到底做了什么事情呢 ? 其实就是讲对象的初始化过程。 1、 new 用到了Person.class,所…

【Java基础篇】try catch finally语句包含return语句时的执行过程

网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行? 很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被 try语句没有被执行到,如在…

eclipse指定JDK版本启动,解决version XXX of the JVM is not suitable for this product.Version:XXX 问题

问题描述:启动eclipse时,提示version 1.7.0 of the JVM is not suitable for this product.Version:1.8 or greater is required. 原因分析:原因是我的笔记本安装了多个JDK版本,但是现在我的JAVA_HOME配置的是jdk1.7的路径&#x…

【JAVA基础篇】Socket编程

一、Socket的概念 Socket是一种通讯机制,通常称为套接字。英文原意是插座,顾明思义,Socket像是一个多孔插座,可以提供多个端口的连接服务 ps:至于socket在计算机术语中怎么就翻译成了“套接字”这个令人费解的词,这真…

【JAVA基础篇】注解

一、什么是注解? 注解是元数据,所谓元数据就是描述数据的数据。 在annotation诞生之前(jdk1.5诞生了注解),甚至之后,xml被广泛的由于描述元数据。但是后来,有一些应用开发工程师和架构师觉得它…

【JAVA基础篇】IO流

一、流的概念 “对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。” ――《Think in Java》 无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素,我们不仅仅要考虑文件、…

SpringMVC注解

一,RequestMapping 可以用在类和方法上 1.1 作用: 将客户端请求映射到可匹配的类和方法中 1.2 属性: name 给映射指定一个名字 path(同value相同) 请求的url,path{"/mixedAttribute1","/mixedA…

【JAVA基础篇】运算符

一、表达式 表达式由运算符和操作数组成 例如: 5 num1 num1num2 sumnum1num2 二、运算符分类 算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位运算符 三、算数运算符 四、赋值运算符 格式:变量表达式 例如:int n3…

a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?

软件介绍早在几年前,社会上就已经开始了数字化、无纸化的推广,但是就算再怎么无纸化,纸张还是有它必要的存在,在工作、学习过程中,打印的需求也必不可少的。但是一般的打印都是比较平庸的,要做会议记录&…

IP地址、子网掩码、网关、默认网关、DNS的理解

IP地址 Internet上为了区分数以亿计的主机而给每个主机分配一个专门的地址,通过IP地址可以访问到每台主机。 子网掩码 子网掩码又称网络掩码、地址掩码、子网络遮罩。它是用来指明一个IP地址哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位…

上证指数30年k线图_技术预判2020:上证指数要突破3500点才会“井喷”

2019年的行情很快就要收官了,截止目前,上证指数今年的涨幅是20.5%,不过可能有部分投资者今年的收益率还没达到大盘指数的平均水平。不管怎样,今年很快就要翻篇了,关键是看2020年股市能不能迎来更好的行情了。而总结得失…