天天看點

Oracle函數

lower函數:

 此函數将全部的大寫字母都可以變為小寫字母

  SELECT lower('ABCDE') FROM dual ;

 • dual表為一個虛拟表,以後介紹

upper函數:将輸入的字元串變為大寫字母

  SELECT upper('abcd') FROM dual ;

例如:之前查詢的時候區分大小寫,是以此處如果輸入的是小寫字母,就可以通過upper函數進行轉換。

 查詢雇員姓名内容為smith的全部員工。

 SELECT * FROM emp WHERE ename=UPPER('smith') ;

initcap函數:将每個字元串的首字母大寫

 例如:要求将雇員表中的全部雇員資訊的首字母大寫。

  SELECT initcap(lower(ename)) FROM emp ;

 函數可以進行嵌套。

concat函數:字元串連接配接,可以連接配接兩個字元串

 SELECT concat('hello',' world!!!') FROM dual ;

 實際上使用“||”也可以完成兩個字元串的連接配接操作。

substr函數:字元串截取

 截取的時候需要注意:要從那裡開始截取,之後取多長的長度。

 SELECT substr('hello',1,2) FROM dual ;

 注意:substr函數的開始點是從1開始的。

length:取出字元串的長度,例如,取出每一個雇員的姓名的長度:

 SELECT ename||' 姓名的長度為:'||length(ename) FROM emp ;

instr函數:查找在一個字元串中是否有指定的字元串,如果有,則傳回其位置

 SELECT instr('hello','x') FROM dual ;

 • 如果有此字元串,則傳回位置,如果沒有,則傳回0。

replace函數:替換,可以将一個字元串中的指定字元串替換為其他内容:

 SELECT replace('hello','l','x') FROM dual ;

trim函數:去掉左右空格的函數

 SELECT trim('        hello          ') FROM dual ;

查詢:

 1、 檢索姓名最後一個字母為N的雇員

  • SELECT * FROM emp WHERE substr(ename,-1,1)='N';

 2、 檢索職務為“SALE”的全部員工資訊

  • SELECT * FROM emp WHERE substr(job,1,4)='SALE';

ROUND表示四舍五入

 •SELECT ROUND(34.56,-1) FROM dual ;

TRUNC函數:表示截取函數

 • SELECT TRUNC(34.56,-2) FROM dual ;

MOD函數:取餘數

 •SELECT MOD(10,3) FROM dual ;

取得目前日期:

 在Oracle中可以通過查詢sysdate取得目前的日期:

  • SELECT sysdate FROM dual ;

例如:計算10部門中的員工進入公司的日期數:

 肯定使用目前日期-雇傭日期(hiredate) = 天數,天數/7為日期數。

 SELECT ename,round((sysdate-hiredate)/7) from emp ;

例如:

 求出所有員工的受雇月數:months_between,使用目前日期與雇傭日期比較。

 • SELECT ename,round(MONTHS_BETWEEN(sysdate,hiredate)) from emp ;

ADD_MONTHS:表示在日期的基礎上增加幾個月之後的日期:

 求出,三個月之後的日期是那一天:

  SELECT ADD_MONTHS(sysdate,3) FROM dual ;

NEXT_DAY:表示下一個這天(星期幾)

 SELECT NEXT_DAY(sysdate,'星期一') FROM dual ;

LAST_DAY:求出目前日期所在月的最後一天:

 SELECT LAST_DAY(sysdate) FROM dual ;

 顯示受雇時間不滿320-個月的雇員的編号、受雇日期、受雇的月數、滿六個月的複審日期、受雇後的第一個星期五以及受雇當月的最後一天

求出雇傭月數大于320的雇員資訊:

 SELECT * FROM emp WHERE MONTHS_BETWEEN(sysdate,hiredate)>320 ;

綜合:

 SELECT empno 雇員編号,hiredate 雇傭日期, 

 round(MONTHS_BETWEEN(sysdate,hiredate)) 雇傭月數 ,

 add_months(hiredate,6) 複審日期,next_day(hiredate,'星期五') 受雇後到第一個星期五,

 last_day(hiredate) 最後一天

FROM emp WHERE MONTHS_BETWEEN(sysdate,hiredate)>320 ;

例如:現在要求取出全部員工受雇的年份

 實際上要對hiredate中的内容進行分離,取出年份。

  SELECT empno,ename,TO_CHAR(hiredate,'YYYY') FROM emp ;

 取出雇傭的月份和日:

  SELECT empno,ename,TO_CHAR(hiredate,'YYYY') 年,

TO_CHAR(hiredate,'MM') 月,TO_CHAR(hiredate,'DD') 月 FROM emp ;

也可以通過此函數把顯示的日期的格式進行修正:

 年-月-日:2008-4-7

 SELECT empno,ename,TO_CHAR(hiredate,'YYYY-MM-DD')  FROM emp ;

 正常情況下的日期,如果是月應該是兩位,如果現在是2月,則會顯示02月,如果現在不希望顯示出前導0,則可以加入一個fm

 SELECT empno,ename,TO_CHAR(hiredate,'fmYYYY-MM-DD')  FROM emp ;

可以将一個數值按照指定的格式輸出。

 SELECT empno,sal FROM emp ;  此時不是很明确的知道查詢出的工資,而且工資的位數也不标準。

 使用to_char完成:SELECT empno,to_char(sal,'L99,999') FROM emp ;

to_date函數:

 可以将一個字元串變為一個日期類型。

  SELECT to_date('2007-4-7','YYYY-MM-DD') FROM dual ;

要求:

 查詢出全部雇員的年薪(基本工資和傭金)。

  SELECT empno,(sal+comm)*12 FROM emp ;

 如果沒有獎金的雇員,則年薪也沒了,因為是null值,是以最後的計算結果仍然是null。

希望如果最後的值為null,則應該按0進行計算,此時就需要NVL函數的支援。

Nvl函數可以将空值變為一個特定的數值

 SELECT empno,sal,NVL(comm,0) FROM emp ;

使用此函數修改上面的查詢:

 SELECT empno,(sal+NVL(comm,0))*12 FROM emp ;

 select empno,ename,job from emp ;

 希望:

 • 如果工作是CLERK:則顯示辦事員

 • 如果工作是SALESMAN:則顯示為銷售人員

 • 如果工作是MANAGER,則顯示為經理

 SELECT empno,ename,DECODE(job,'CLERK','辦事員','SALESMAN','銷售人員','MANAGER','經理') FROM emp ;

本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91209,如需轉載請自行聯系原作者