关于Oracle数据库基本知识②——常见函数理解

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

oracle函数还是很重要的,可以增强sql语句功能,在这里简单讲下关于oracle11g环境下的一些函数理解:

1、Concat()函数

Concat:连接两个不同的列,concat只能接受两个参数。

/*
   Concat:连接两个不同的列,concat只能接受两个参数
*/

select job,mgr,concat(job,mgr) from emp;     --CLERK 7902 CLERK7902
select concat(1,1) from dual;   --11
select concat('a',1) from dual;    --a1
select 'a'|| 1 from dual;         --a1
select concat('c',concat('a','b')) from dual;   --cab

2、greatest()least()函数

greatest()返回列表中最大值,least()返回表中最小值。

/*
   greatest返回列表中最大值
*/

select greatest (1,2,3) from dual;   --3
select greatest (1,2,-3) from dual;     --2
select greatest ('a','b','c') from dual;   --c
select greatest('a','b','B') from dual;   --b
select greatest('a','A','b') from dual;  --b
select greatest('a','b',null) from dual;  -- -
select greatest( 'a','V',1000000) from dual;  --a
select greatest( 'a','v',1000000) from dual;  --v

/*
   least返回表中最小值
*/
select least(1,2,3) from dual;     --1
select least (1,2,-3) from dual;     ---3
select least ('a','b','c') from dual;   --a
select least('a','b','B') from dual;   --B
select least('a','A','b') from dual;  --A
select least('a','b',null) from dual;  -- -
select least( 'a','V',1000000) from dual;  --1000000
select least( 'a','v',1000000) from dual;  --1000000
select least('a','A','-3',2) from dual;  ---3

3、Trunc()函数

   trunc:对date或数值类型截取,不进行四舍五入,返回指定的值。
   trunc()函数没有秒的精确,即秒是以00来显示的,可以和(sysdate -1)的时间进行比较;

   trunc(number,num_digits)
   number 需要截尾取整的数字;
   num_digits  用于指定取整精度的数字。num_digits 的默认值为0。

/*
   trunc:对date或数值类型截取,返回指定的值
   trunc()函数没有秒的精确,即秒是以00来显示的,可以和(sysdate -1)的时间进行比较
   该函数截取时不进行四舍五入
   yyyy当年第一天 mm当月第一天 dd当前年月日 d当前星期第一天(星期天)  hh当前时间  mi当前分钟
*/
select sysdate from dual;        --2018/12/5 10:08:46 返回当前具体时间
select trunc(sysdate,'yy') from dual;  --2018/1/1 返回当年第一天
/* 
   trunc(number,num_digits)
   number 需要截尾取整的数字
   num_digits  用于指定取整精度的数字。num_digits 的默认值为0
*/
select trunc(45.789) from dual;  --45
select trunc(45.789,1) from dual;   --45.7
select trunc(45.789,3) from dual;   --45.789
select trunc(45.789,4) from dual;    --45.789

select trunc(45.789,-1) from dual;   --40
select trunc(45.789,-2) from dual;  --0
select trunc(45.789,-4) from dual;  --0

--案例
select trunc(sysdate),
       trunc(sysdate -1),
       sysdate -1,
       trunc(sysdate,'mi'),
       trunc(to_date('19-02-1997 06:12','dd-mm-yyyy hh:mi')),
       trunc(to_date('19-02-1997 06:12','dd-mm-yyyy hh:miAM'),'mi') from dual;
       

4、replace()和translate()替代函数

replace(char,search_string,replacement_string)该函数需要三个参数,
第一个参数是需要搜索的字符串,第二个参数是搜索的内容,第三个参数是替换的内容,如果第三个参数省略,则默认为空格,如果第二个参数是null,那么将只执行搜索操作而不会替换任何内容。
   注意,第二个参数注意大小写,且不能为空

translate(char,from,to)将char中出现的from替换为to中相应的字符,
如果from的长度大于to的长度,那么将from大于to的长度之后的出现在char中的字符删除。
   注意第二个和第三个参数不能为空,且第二个参数不能为null。

/*
   Replace和translate替代函数
   replace(char,search_string,replacement_string)该函数需要三个参数,
第一个参数是需要搜索的字符串,第二个参数是搜索的内容,第三个参数是替换的内容,
如果第三个参数省略,则默认为空格,如果第二个参数是null,
那么将只执行搜索操作而不会替换任何内容
   注意,第二个参数注意大小写,且不能为空
*/

select ename,replace(ename,'A','b') from emp;   --ALLEN   bLLEN
select ename,replace(ename,'A') from emp;   --ALLEN  LLEN
select ename,replace(ename,null) from emp;   --ALLEN   ALLEN

/*
   translate(char,from,to)将char中出现的from替换为to中相应的字符,
如果from的长度大于to的长度,那么将from大于to的长度之后的出现在char中的字符删除
   注意第二个和第三个参数不能为空,且第二个参数不能为null
*/
select ename,translate(ename,'A','b') from emp;   --ALLEN   bLLEN
select ename,translate(ename,'A') from emp;   --错误,参数个数无效
select ename,translate(ename,null) from emp;   --错误,参数个数无效

--replace和translate函数的区别
select replace('abcdef','abcf','t') from dual;     --abcdef
select replace('abcdefabdscf','abcf','t') from dual; --abcdefabdscf
select replace('abcdefabdscfsd','abcf','t') from dual; --abcdefabdscfsd
select translate('abcdef','abcf','t') from dual; --tde 
select translate('abcdefabdscf','abcf','t') from dual; --tdetds
select translate('abcdefabdscfsd','abcf','t') from dual; --tdetdssd

在理解translate()替换函数时,我用自己的理解简单说下吧:

在语句select translate('abcdefabdscf','abcf','t') from dual;中,首先了解第二个参数abcf将替换为第三个参数中相应的字符,且abcf参数大于t,即a对应t,后面bcf字符删掉。所以在abcdefabdscfa全部替换为t,里面的bcf全部删除,即输出结果为tdetds

5、Chr()和Ascii()函数
   chr():将ASCII码转换为字符---------------------详情可以百度char码值对应列表;
   ASCII():将字符转换为ASCII码。

/*
   chr()函数与ASCII()函数
   chr():将ASCII码转换为字符
   ASCII():将字符转换为ASCII码
*/

select chr(101) from dual;  --e
select ascii('E') from dual;  --69
select chr(32) from dual;  -- -
select replace('xxxx yyy zzz',chr(32),'') from dual;    --xxxxyyyzzz   char(32)为空格符,所以将xxxxyyyzzz中的空格符替换了

6、LPAD()和RPAD()函数
   这两个函数用于填充,最少需要两个参数,最多需要三个参数,
   第一个参数表示需要处理的字符串,第二个参数是需要将字符串扩充的宽度,第三个参数表示用什么字符来做填充。第三个参数默认值为空格,也可以是单个的字符或字符串。

/*
   LPAD和RPAD函数
   这两个函数用于填充,最少需要两个参数,最多需要三个参数,
第一个参数表示需要处理的字符串,第二个参数是需要将字符串扩充的宽度,
第三个参数表示用什么字符来做填充。第三个参数默认值为空格,也可以是单个的字符或字符串
*/
select lpad(sal,10,'*') from scott.emp;      --*******800   ******1600
select rpad(sal,10,'*') from emp;      --800*******   1600******

7、nvl(e1,e2)函数

   从两个表达式中返回一个非null值,只有两个参数。
   注意:e1,e2不能为空。

/*
   NVL(e1,e2)函数:从两个表达式中返回一个非null值,只有两个参数
   注意:e1,e2不能为空
*/
select nvl(1,null) from dual;  --1
select nvl(null,1) from dual;  --1
select nvl(1,2) from dual;   --1
select nvl(2,1) from dual;   --2
select nvl(1,'a') from dual;   --错误,标识符无效
select nvl('',1) from dual;   --1
select nvl(null,null) from dual;   -- -
select nvl('','') from dual;   -- -

8、round()函数

   对日期或数值进行四舍五入运算。

/*
   ROUND(m,n):对日期或数值进行四舍五入运算
*/
select round(to_date('1997/02/19','yyyy/mm/dd'),'month') from dual;   --1997/3/1
select round(to_date('1997/02/19','yyyy/mm/dd'),'year') from dual;   --1997/1/1
select round(to_date('1997/02/19','yyyy/mm/dd'),'day') from dual;   --1997/2/16
select 99.95,round(99.5) from dual;   --100

9、substr(e,m,n):截取子串
     substr函数有三个参数,第一个参数为目标字符串,第二个参数是将要输出的子串的起点,第三个参数是将要输出的子串的长度,如果没有第三个参数,则余下的字符全部输出。

/*
   substr(e,m,n):截取子串
   substr函数有三个参数,第一个参数为目标字符串,第二个参数是将要输出的子串的起点
第三个参数是将要输出的子串的长度,如果没有第三个参数,则余下的字符全部输出
*/
select ename,substr(ename,2,3) from emp;     --ART
select substr(ename,3) from emp;         --RTIN

10、trim()函数

    ①trim(string):去除指定字符串string的左右空格,string中间的空格不会被去除;
    ②ltrim(string):去除指定字符串string左侧的空格;
    ③rtrim(string):去除指定字符串string右侧的空格;
    ④trim(leading | trailing | both string1 from string2)从string2中去除左侧|右侧|两侧(默认是both)的string1字符。
   注意:string1只能是单个字符。

/*
   trim(string):去除指定字符串string的左右空格,string中间的空格不会被去除
   ltrim(string):去除指定字符串string左侧的空格
   rtrim(string):去除指定字符串string右侧的空格
   trim(leading | trailing | both string1 from string2)从string2中去除左侧|右侧|两侧(默认是both)的string1字符
   注意:string1只能是单个字符
*/
select trim (' aaa bbb  ccc ') || 'a' from dual;    --aaa bbb  ccca
select ltrim(' aaa bbb  ccc ' ) || 'a' from dual;   --aaa bbb  ccc a
select rtrim(' aaa  bbb   ccc ') || 'a' from dual;   -- aaa  bbb   ccca
select trim(trailing ' ' from' aaa bbb ccc ') || 'a' from dual;    -- aaa bbb ccca

11、行转列函数:wm_concat()和listagg()函数

/*
   行转列函数:wm_concat()和listagg()函数
   wmsys.wm_concat()是oracle10g推出的,在12c中已经彻底删除,所以推荐在用到行转列函数时,使用oracle11g推出的listagg()函数
*/
select wmsys.wm_concat(ename) from emp;
--分组函数
select deptno,listagg(ename,',') within group (order by sal) name from emp group by deptno;
--分析函数
select deptno,ename,sal,listagg(ename,',') within group (order by sal) over(partition by deptno) name from emp;

猜你喜欢

转载自blog.csdn.net/HJBZF/article/details/84834695