關於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字元刪掉。所以在abcdefabdscf中a全部替換為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;