Oracle常用函数总结

    xiaoxiao2023-11-01  32

    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)RN     FROM STS_LPATROL_APPUSER_T u         left 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新增的函数

     

     

     

    最新回复(0)