按部就班學Oracle之函數(重點)

單行函數—字符函數面試

雖然各個數據庫都是支持SQL語句的,可是每個數據庫也有每個數據庫本身所支持的操做函數,這些就是單行函數,而若是要想進行數據庫開發的話,除了要會使用SQL以外,就是要多學習函數。數據庫

單行函數主要分爲如下五類:字符函數、數字函數、日期函數、轉換函數、通用函數編程

1-字符函數:編程語言

字符函數的功能主要是進行字符串數據的操做,下面給出幾個字符函數:ide

* UPPER(字符串|列):將輸入的字符串變爲大寫返回;函數

* LOWER(字符串|列):將輸入的字符串變爲小寫返回;學習

* INITCAP(字符串|列):開頭首字母大寫;spa

* LENGTH(字符串|列):求出字符串的長度;3d

* REPLACE(字符串|列):進行替換;orm

*SUBSTR(字符串|列,開始點[結束點]):字符串截取:

Oracle之中有一點比較麻煩,即便要驗證字符串,也必須編寫完整的SQL語句,因此在OracleO數據庫之中爲了用戶的查詢方便,故專門提供了一個「dual」的虛擬表

範例1:觀察轉大寫的函數

SELECT UPPER('hello') FROM dual ;

clip_image002

大寫轉換的用處: 在通常的使用之中,用戶輸入數據的時候去關心數據自己存放的是大寫仍是小寫呢?

SELECT * FROM emp WHRER ename='&str';

此時若是輸入的是小寫,則確定沒法查詢出數據,因此這個時候不能要求用戶這麼,故這個時候只能由程序本身去適應,加入一個函數:

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

固然以上的「&」(與)操做屬於替代變量的內容,此部份內容不作重點。

clip_image004

範例2:觀察轉小寫的操做,將全部的僱員姓名按照小寫字母返回;

SELECT LOWER('ename') FROM emp ;

clip_image006

範例3:將每個僱員姓名的開頭首字母大寫

SELECT INITCAP(ename) FROM emp ;

clip_image008

範例4:查詢每一個僱員姓名的長度

SELECT ename,LENGTH(ename) FROM emp ;

clip_image010

範例5:要求查詢出僱員姓名長度正好是5的信息;

SELECT ename,LENGTH(ename) FROM emp WHERE LENGTH(ename)=5 ;

clip_image012

範例6:使用字母「_」替換姓名中全部字母「A」的信息;

col REPLACE(ename,'A','_') FORMAT A50 ;

SELECT REPLACE(ename,'A','_') FROM emp ;

clip_image014

字符串截取操做有兩種語法:

|-語法一:SUBSTPR(字符串|列,開始點),表示從開始點一直截以到結尾;

|-語法二:SUBSTPR(字符串|列,開始點,結束點),表示從開始點一直截以到結束點,截取部份內容;

範例7: 語法一:SUBSTPR(字符串|列,開始點),表示從開始點一直截以到結尾;

SELECT ename,SUBSTR(ename,3) FROM emp ; //從第3個字符開始一直到結尾!

clip_image016

範例8:語法二:SUBSTPR(字符串|列,開始點,結束點),表示從開始點一直截以到結束點,截取部份內容;

SELECT ename,SUBSTR(ename,0,3) FROM emp ; //截取前3個字符!

SELECT ename,SUBSTR(ename,1,3) FROM emp ; //截取前3個字符!

clip_image018

clip_image020

範例9:要求截取每一個僱員姓名的後三個字母;

* 正常思路:經過長度-2肯定開始點

SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;

* 新思路:設置負數,表示從後指定截取位置

SELECT ename,SUBSTR(ename,-3) FROM emp ;

clip_image022

clip_image024

面試題:

一、請問SUBSTR()函數截取的時候下標是從0,仍是從1開始?

* 在Oracle數據庫之中,SUBSTR()函數從0或1開始都是同樣的;(見範例8

* SUBSTR()函數也能夠設置爲負數,表示由後指定截取開始點;(見範例9

2-數字函數
數字函數一共有3個:

* ROUND(數字|列[,保留小數的位數]):四捨五入的操做;

* TRUNC(數字|列[,保留小數的位數]):捨棄指定位置的內容;

* MOD(數字1,數字2):取模,取餘數;

範例10:驗證ROUND()函數

SELECT ROUND(903.5) FROM dual ;

clip_image026

SELECT ROUND(903.5),ROUND(-903.53567) FROM dual ;

SELECT ROUND(903.5),ROUND(-903.53567),ROUND(903.53567,-1) FROM dual ;

SELECT ROUND(903.5),ROUND(-903.53567),ROUND(903.53567,-1),ROUND(903.53567,2) FROM dual ;//保留2位

clip_image028

範例11:驗證TRUNC()函數

SELECT TRUNC(903.5),TRUNC(-903.53567),TRUNC(903.53567,-1),TRUNC(903.53567,2) FROM dual ;

clip_image030

範例12:驗證MOD()函數

SELECT MOD(10,3) FROM dual ;

clip_image032

以上的三個主要的數學函數,在學習Java中也會有相匹的內容!

2-日期函數

若是如今要想進行日期的操做,則首先有一個必需要解決的問題,就是如何取得當前的日期, 這個當前日期可以使用「SYSDATE」取得,代碼以下:

SELECT SYSDATE FROM dual ;

clip_image034

範例13:除了以上的當前日期以外,在日期中也能夠進行若干計算:

* 日期 + 數字 = 日期,表示若干天以後的日期;

SELECT SYSDATE+3,SYSDATE+300 FROM dual ;

* 日期 - 數字 = 日期,表示若干天的日期;

SELECT SYSDATE-3,SYSDATE-300 FROM dual ;

* 日期 – 日期 = 數字,表示的是兩個日期的天數,可是確定是大日期 – 小日期;

範例14:求出每一個僱員到今天爲止的僱傭天數;

SELECT ename,hiredate,SYSDATE-hiredate FROM emp ;

clip_image036

clip_image038

注:並且不少編程語言之中,也都會提出一種概念,日期能夠經過數字表示出來!

除了以上三個公式以外,也提供瞭如下四個操做函數:

* LAST_DAY(日期):求出指定日期的最後一天;

範例15:求出本月的最後一天日期

SELECT LAST_DAY(SYSDATE) FROM dual ;

* NEXT_DAY(日期,星期數):求出下一個指定星期X的日期;

範例16:求出下一個週一

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

* ADD_MONTHS(日期,數字):求出若干月以後的日期;

範例17:求出4個月後是什麼時候

SELECT ADD_MONTHS(SYSDATE,4) FROM dual ;

* MONTHS_BETWEEN(日期1,日期2):求出兩個日期之間所經歷的月份;

範例18:求出每一個僱員到今天爲止的僱傭月份;

SELECT ename,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp ;

SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp ;

clip_image040

clip_image042

在全部的開發之中,若是是日期的操做,建議使用以上函數,由於這些函數能夠避免閏年的問題。

4-轉換函數(核心)

如今已經接觸到了Oracle數據庫之中的三種數據:數字(NUMBER)、字符串(VACHAR2)、日期(DATE),轉換函數的主要功能是完成這幾種數據間的相互轉換的操做,一共有三種轉換函數:

* TO_CHAR(字符串|列,格式字符串):將日期或者是數字變爲字符串顯示;

* TO_DATE(字符串,格式字符串):將字符串變爲DATE數據顯示;

* TO_NUMBER(字符串):將字符串變爲數字顯示;

1、TO_CHAR()函數

在以前查詢過當前的系統日期時間:

SELECT SYSDATE FROM dual ;

這個時候是按照「日-月-年」的格式顯示,很明顯此格式不符合於正常的思路,正常是「年-月-日」,

範例19:TO_CHAR()函數,可是使用此函數的話須要一些格式字符串:年(yyyy),月(mm),日(dd)

SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd'),TO_CHAR(SYSDATE,'yyyy') year,TO_CHAR(SYSDATE,'mm') month,TO_CHAR(SYSDATE,'dd') day FROM dual ;

clip_image044

範例20:可是這個時候的顯示數據之中能夠發現會存在前導0,若是要想消除這個0的話,能夠加入一個「fm」。

SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd') FROM dual ;

clip_image046

範例21:正常人都加0,故這個標記知道就好了,但是在Oracle之中,DATE裏面是包含了時間的,可是以前的代碼沒有顯示出時間,要想顯示時間,則須要增長標記:

SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd hh:mi:ss')day FROM dual ; //12時制

SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd hh24:mi:ss') day FROM dual ;

clip_image048

範例22:必定要注意:使用TO_CHAR()函數以後,全部的內容都是字符串,再也不是以前的DATE型數據,TO_CHAR()函數也能夠用數字的格式化上,此時每個「9」表示一位數字的概念,而不是數字9概念。

SELECT TO_CHAR(11157191115719,'999,999,999,999,999') FROM dual ;

SELECT TO_CHAR(11157191115719,'L999,999,999,999,999') FROM dual ;

其中的字母「L」,表示的是「Locale」的含義,即:當前的所在語言環境下的貨幣符號。

clip_image050

2、TO_DATE()函數

範例23:此函數的主要功能是將一個字符串變爲DATE型數據。

col TO_DATE('1988-8-8','yyyy-mm-dd') format a50 ;

SELECT TO_DATE('1988-8-8','yyyy-mm-dd') FROM dual ;

clip_image052

通常此函數在更新數據時,使用比較多!

3、TO_NUMBER()函數:基本不用!

範例24:TO_NUMBER()函數一看就知道是將字符串變爲數字的:

SELECT TO_NUMBER('1') + TO_NUMBER('2') + TO_NUMBER('3') FROM dual ;

clip_image054

範例25:可是在Oracle之中是很智能的,故以上功能不使用TO_NUMBER()函數也能夠完成。

SELECT '1' + '2' + '3' FROM dual ;

clip_image056

重點:

* TO_NUMBER()函數,基本已經不考慮了;

* TO_CHAR()函數,是重點;

* TO_DATE()函數,是次重點。

5-通用函數(核心)

通用函數主要有兩個:NVL()、DECODE(),這兩個函數算是 Oracle本身的特點函數了;

一、NVL()函數,處理null

範例26::要求查詢出每一個僱員的所有年薪

SQL> SELECT ename,sal,comm,(sal+comm)*12 年薪 FROM emp ;

clip_image058

範例27:由上可知,有僱員的年薪變爲null了,而形成這種問題的關鍵是在於comm字段上爲null,那麼要想解決這個問題,就必須作一種處理:將null變爲0,而這個就是NVL()函數做用。

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

clip_image060

範例28:看來,年薪還有爲0的,下面再來看看!

SQL> SELECT ename,sal,comm,(sal+NVL(comm,0))*12 ?êD? FROM emp ;

clip_image062

二、DECODE()函數:多數值判斷

DECODE()函數很是相似於程序中的if…else語句,惟一不一樣的是DECODE()函數判斷的是數值,而不是邏輯條件了。

例如:要求顯示所有僱員的職位,可是這些職位要求替換成中文顯示:

* CLERK:辦事員;

* SALESMAN:銷售;

* MANAGER:經理;

* ANALYST:分析員;

* PRESIDENT:總裁;

這種判斷確定是逐行判斷,故此時必須採用DECODE()函數,而此函數語法以下:

DECODE(數值|列,判斷1,顯示值1,判斷2,顯示值2,判斷3,顯示值3,...)

範例29:實現顯示的操做功能

SELECT empno,ename,job,DECODE(job,'CLERK','辦事員','SALESMAN','銷售員','MANAGER','經理','ANALYST','分析員','PRESIDENT','總裁') 職務 FROM emp ;

clip_image064

DECODE()函數是整個Oracle之中最具備特色的函數,必須掌握!!!

總結篇:

一、SQL語句的基本格式,此處給出的只是最基本的語法:SELECT、FROM、WHERE、ORDER BY的關係;

二、記下SCOTT用戶中的全部的數據表的信息,包括列的名稱,做用及類型;

三、Oracle中的幾個單行函數,必定要記下來,全部函數都要求使用。

相關文章
相關標籤/搜索