1. 程式人生 > >關於Oracle資料庫基本知識②——常見函式理解

關於Oracle資料庫基本知識②——常見函式理解

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;