視頻課程:李興華 Oracle從入門到精通視頻課程面試
學習者:陽光羅諾數據庫
視頻來源:51CTO學院oracle
Oracle數據庫從入門到精通-單行函數函數
在數據庫中,爲了方便用戶的數據開發,每每會提供一系列的支持函數,利用這些函數能夠針對於數據處理。學習
例如:在進行根據姓名查詢的時候,若是說姓名自己是大寫字母,而查詢的是小寫字母,此時就不會由任何的數據結果返回。因此針對於此類狀況,每每數據保存的時候或者是查詢的時候對數據進行一些處理,而這些處理每個數據庫都有本身自己的函數庫,利用函數能夠實現特定的功能。測試
在Oracle中,對於函數的基本使用結構以下:spa
1 返回值 函數名稱(列|數據)
而根據函數的特色,單行函數能夠分爲如下幾種:字符串函數、數值函數、日期函數、轉換函數以及通用函數。設計
1、字符串函數3d
字符串函數能夠針對於字符串數據進行處理,在Oracle之中對於此類函數定義有以下變化:UPPER()、LOWER()、INITCAP()、REPLACE()、LENGTH()、SUBSTR()。code
1.大小寫轉換函數
轉大寫函數:字符串 UPPER(列|字符串)
轉小寫函數:字符串 LOWER(列|字符串)
若是要在Oracle數據庫中驗證字符串函數,那麼就必須保證編寫的是完整的SQL語句。因此爲了能夠方便地進行函數驗證,每每會使用一張虛擬表:dual表
範例:驗證函數
語法格式:
1 SELECT LOWER('SOLer He'),UPPER('SOLer He') FROM dual;
幾乎全部的數據庫裏面都會提供這兩個函數。
若是說如今要求用戶本身輸入一個僱員姓名,然後進行僱員信息的查找。
語法格式:
1 SELECT * FROM emp WHERE ename='&inputename';
結果以下:
用戶在進行數據輸入的時候幾乎不會去考慮大小寫,因此爲了保證數據能夠正常的查詢出來,每每須要對輸入數據進行處理。因爲在數據表中全部的數據都是大寫操做,那麼就能夠接收完輸入數據以後將會自動變爲大寫字母。
範例:改善輸入操做。
語法格式:
1 SELECT * FROM emp WHERE ename=UPPER('&inputename');
因此在一些要求嚴格的操做環境下,對於不區分大小寫的操做的時候,基本上就會有兩種作法:
在全部不區分大小寫的操做的項目之中,保存數據時就必須對數據進行提早的處理。
2.首字母大寫
語法格式:
1 字符串 INITCAP(列 | 數據)
範例:觀察首字母大寫
代碼格式:
1 SELECT INITCAP ('HeLLoWorld') FROM dual;
查詢輸出結果:
除了首字母大寫以外,其餘的都是小寫。
範例:將每個僱員的姓名首字母變爲大寫。
代碼結構:
1 SELECT INITCAP (ename) FROM emp;
查詢結果:
3.計算字符串長度
語法:
1 數字 LENGTH (列 | 字符串數據)
範例:查詢出每一個僱員姓名以及僱員姓名的長度。
代碼格式:
1 SELECT ename,LENGTH(ename) FROM emp;
查詢結果:
那麼全部的單行函數能夠在SQL語句的任意位置上出現。
範例:查詢僱員姓名長度爲5的所有僱員信息。
分析:須要針對於所選的數據行進行篩選,那麼就必定要在WHERE子句之中進行。
代碼格式:
1 SELECT * FROM emp WHERE LENGTH(ename)=5;
結果如圖:
4.字符串的替換操做
可使用指定的內容替換原始字符串中的數據。
語法格式:
1 字符串 REPLACE (列 | 數據,要查找的內容,新的內容)
範例:將全部僱員姓名之中的字母替換爲「_」。
代碼示例:
1 SELECT REPLACE (ename,'A','_') FROM emp;
查詢結果:
實際上能夠利用REPLACE()函數能夠消除字符串中的所有空格數據。
範例:消除空格數據。
代碼示例:
1 SELECT REPLACE('Hello World This is my oracle',' ','') FROM dual;
查詢結果:
5.字符串截取
語法一:字符串 SUBSTR(列 | 數據,開始點),從指定的開始點一直截取到結尾
語法二:字符串 SUBSTR(列 | 數據,開始點,長度):截取指定範圍的子字符串。
範例:子字符串截取操做。
代碼示例:
1 SELECT SUBSTR('helloworldnihao',11) FROM dual;
查詢截圖:
此種方式就是從指定位置截取到結尾。
範例:截取部份內容
代碼示例:
1 SELECT SUBSTR('helloworldnihao',6,5) FROM dual;
結果:
可是對於SUBSTR()函數千萬要記住一點,它的下標是從1開始的,也就是在進行截取的時候,字符串從1開始做爲索引下標,可是即便設置的值是0,也是按照1來處理。
例如:代碼示例:
1 SELECT SUBSTR('helloworldnihao',0,5) FROM dual; 2 3 SELECT SUBSTR('helloworldnihao',1,5) FROM dual;
結果:
範例:要求截取每一位僱員姓名的前三位字符
代碼示例:
1 SELECT ename,SUBSTR(ename,1,3) FROM emp;
結果以下:
範例:要求截取姓名的後三個字母。此範例能夠採用兩種作法:
第一種(傳統作法):若是進行截取,那麼首先必定要確認出截取的開始點,因此對於開始點,因爲每個姓名的長度都是不同的,因此開始點也是不同的。因此採用最好的辦法就是進行計算。就可使用LENGTH來計算長度。
代碼示例:
1 SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;
查詢結果:
SUBSTR()的支持,能夠設置負數索引。
代碼示例:
1 SELECT ename,SUBSTR(ename,-3) FROM emp;
實際上只有Oracle數據庫纔會支持這種負數的索引設計,其餘的任何語言都是不支持。
面試題:請問Oracle中的SUBSTR()函數截取字符串的索引是從1開始仍是從0開始?
答案:Oracle數據庫中的字符串的索引都是從1開始的,即便設置的值是0,也會將其自動變爲1開始執行。
數值函數
數值函數主要是針對於數字進行處理的,有三個主要的函數:ROUND()、TRUNC()、MOD()。
1.四捨五入操做
語法:
1 數字 ROUND(列| 數字,[保留小數位])若是不設置小數位就表示不保留。
範例:測試四捨五入
代碼示例及解析:
1 SELECT 2 3 ROUND(78915.678932654), 78916,小數點以後的內容直接進行四捨五入 4 5 ROUND(78915.678932654,2), 78915068 保留兩位小數 6 7 ROUND(78915.678932654,-2), 78900,把不足5的數字所有取消了。 8 9 ROUND(78985.678932654,-2), 79000,若是超過了5則進行進位 10 11 ROUND(-15.32) -15 12 13 FROM dual;
結果以下:
2.截取小數,全部的小數都不進位。
語法:
1 數字 TRUNC(列 | 數字[,小數位])
代碼示例:
1 SELECT 2 3 TRUNC(78915.678932654), 78916 4 5 TRUNC(78915.678932654,2), 78915.68 6 7 TRUNC(78915.678932654,-2), 78900 8 9 TRUNC(78985.678932654,-2), 79000 10 11 TRUNC(-15.32) -15 12 13 FROM dual; 14 15
結果以下:
3.求模(求餘數)
語法:
1 數字 MOD(列1 | 數字1,列2 | 數字2)
範例:求模操做
代碼示例:
1 SELECT MOD(10,3) FROM dual;
日期函數(Oracle本身的特點)
日期處理函數主要是進行日期處理,可是整個日期處理過程當中會存在一個關鍵詞的問題。如何能夠取得當前的日期時間。在Oracle中會提供一個數據僞列。指的是一個列,可是不存在於表中,但是卻能夠像列同樣進行數據的查詢。那麼這個僞列就是SYSDATE。
代碼示例:
1 SELECT ename, hiredate, SYSDATE FROM emp;
若是隻是單純地想要取得日期,可使用簡單一些,直接使用dual虛擬表就能夠。
代碼示例:
1 SELECT SYSDATE FROM dual;
若是是用具體地時間戳,那麼就能夠直接加SYSTIMESTAMP。
代碼示例:
1 SELECT SYSDATE,SYSTIMESTAMP FROM dual;
實際上對於日期時間提供有三種計算模式:
1 日期 + 數字 = 日期(若干天后地日期) 2 3 日期 – 數字 = 日期(若干以前地日期) 4 5 日期 – 日期 = 數字 (兩個日期間的天數) 6 7
測試:若干天后的日期
代碼示例1:
1 SELECT SYSDATE+10 FROM dual;
代碼示例2:
1 SELECT SYSDATE+10, FROM dual;
在進行日期與數字的計算之中,獲得的結果都是比較容易理解的。
範例:計算每一位僱員到今天爲止的僱傭天數。
代碼示例:
1 SELECT ename,hiredate,SYSDATE-hiredate FROM emp;
經過以上的分析發現,若是如今只是依靠天數其實是很可貴到一個準確的年或者是月,因此爲了能夠精確的進行計算,在Oracle裏面才提供有日期處理函數,利用這些函數能夠避免掉那些閏年或者是閏月的問題。
計算兩個日期間所經歷的月數總和。
語法:
1 數字 MONTHS_BETWEEN(日期1,日期2)
範例:計算每一位僱員到今天爲止的僱傭總月數。
代碼示例:
1 SELECT ename,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp;
實際上,如今已經存在有月的數據了,那麼就表示能夠準確計算年。
範例:計算每個僱員到今天爲止所僱傭的年限。
代碼示例:
1 SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) FROM emp;
增長若干月以後的日期。
語法:
1 日期 ADD_MONTHS(日期,月數)
範例:測試ADD_MONTHS()函數。
代碼示例:
1 SELECT ADD_MONTHS(SYSDATE,4) FROM dual;
利用這種方式增長的月能夠避免閏年、閏月這兩個問題。
範例:計算全部還差1年滿34年僱傭日期的所有僱員。
代碼示例:
1 SELECT * FROM emp WHERE TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)/12)=34;
語法:
1 日期 LAST_DAY(日期)
範例1:計算當前日期所在月的最後一天。
代碼示例:
1 SELECT LAST_DAY(SYSDATE) FROM dual;
範例2:查詢出全部在僱傭所在月倒數次日被僱傭的僱員信息
每個僱員的僱傭日期都是不同的,因此在每個僱傭日期所在月的倒數次日也不同的。
·首先應該知道每個僱員僱傭月的最後一天,然後利用「日期 + 數字 = 日期」,計算倒數次日。
代碼示例:
1 SELECT ename,hiredate, LAST_DAY(hiredate),LAST_DAY(hiredate)-2 2 3 FROM emp 4 5 WHERE LAST_DAY(hiredate)-2=hiredate;
語法:日期 next_day(日期,一週時間數)
範例:計算下一個週二
代碼示例:
1 SELECT NEXT_DAY(SYSDATE,'星期二') FROM dual;
【瞭解】綜合分析:要求查詢僱員的編號、姓名、僱傭日期,以及每一位僱員到今天爲止所僱傭的年數、月數、天數。
假設如今的日期是:2018-07-06
如今WARD他的僱傭日期爲:「1981-02-22」,因此它到今天爲止的僱傭日期已經被僱傭了:35年、0月,15天。
對於該查詢而言,因爲日期的跨度較長。因此要想準確的計算出結果。
代碼示例:
1 SELECT empno,aname,hiredate 2 3 TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year 4 5 FROM emp;
第二步:計算月
在進行計算年的時候就包含餘數,餘數實際上就是除以12的結果,餘數就是月數。利用MOD()函數求出餘數。
加上TRUNC以後的結果以下:
第三步:計算天數
計算天數的操做只有一個公式:「日期1 – 日期2 = 數字(天數)」,如今就出現了日期的問題上:
日期1:必定是當前日期,確定是使用SYSDATE僞例。
日期:實際上可使用MONTHS_BETWEEN()函數求出兩個日期之間的月數。
觀察能夠發現,天數裏面計算結果也會有小數點,因此咱們加上TRUNC以後,就會只有整數形式的結果。
轉換函數(重點)
就目前而言,在Oracle中的三種數據類型:字符串、數字、日期。因此所謂的轉換函數的實現字符串與日期、數字之間的轉換。
轉換函數一共提供有三種:TO_CHAR()、TO_DATE()、TO_NUMBER()。針對於轉換函數而言,重點的是TO_CHAR()。
1.轉字符串函數,數字或者是日期能夠轉換爲字符串。
語法:字符串 TO_CHAR(列 | 日期 | 數字,轉換格式)
對於轉換格式而言,主要有兩類格式:
- 日期轉換爲字符串:年(yyyy)、月(mm)、日(hh、hh24)、分(mi)、秒(ss)。
- 數字轉換爲字符串:任意一位數字(9)、貨幣(L,本地貨幣)。
範例:格式化日期。
代碼格式:
1 SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd'),TO_CHAR(SYSDATE,'yyyy-mm-dd hh24-mi-ss')FROM dual;
在這裏提供了思想:日期要想該改變日期,最終的數據類型就是字符串。若是要這樣子轉換實際上會破壞程序的一致性。
實際上如今能夠進一步探索TO_CAHR()好處,它能夠實現年月份、月、日的拆分。
範例:查詢出,每一個僱員的編號、姓名、僱傭年份。
代碼示例:
1 SELECT * empno,ename,TO_CHAR(hiredate,'yyyy') year FROM emp;
範例:查詢出全部在2月僱傭的僱員信息。
代碼示例:
Oracle中實際上提供有數據類型的自動轉換,若是發現比較的類型不統一,在必定的範圍內是能夠轉換的。
TO_CHAR()函數除了能夠進行日期的轉換以外,也是支持數字轉換的。所謂的數字轉換每每是針對於數字的可讀性進行一些格式化的操做。
範例:轉換數字
代碼示例:
1 SELECT TO_CHAR(8899,'L999,999,999,999') FROM dual;
2.轉日期函數
若是說如今某一個字符按照「日 - 月 - 年」的格式去編寫。那麼能夠自動轉換爲日期類型,可是也能夠依靠TO_DATE()函數來完成。
語法格式:
1 TO_DATE(字符串,轉換格式)
- 年(yyyy)、月(mm)、日(hh、hh24)、分(mi)、秒(ss)。
範例:實現字符串轉換爲日期。
代碼示例:
1 SELECT TO_DATE('1995-05-02','yyyy-mm-dd') FROM dual;
3.轉數字函數
能夠將字符串(由字符串所組成),變爲數字。
語法格式:
1 數字 TO_NUMBER(字符串)。
範例:驗證轉數字函數
代碼示例:
1 SELECT TO_NUMBER('1') + TO_NUMBER('2') FROM dual;
通用函數(oracle本身的特點)
在Oracle中提供了兩個簡單的數據處理函數:NVL()、DECODE()。而且隨着版本的提高,此兩個函數也衍生出了許多的子函數。
1.處理null
計算出每個僱員的年薪,包括基本工資和佣金。
代碼示例:
1 SELECT empno,ename,job,(sal+comm)*12 income FROM emp;
如今發現,全部沒有佣金的僱員,如今進行年收入計算的時候,最終的計算結果都是Null ,由於null在進行任何數學計算的時候,結果永遠都是null。而實際上在計算之中,若是發現內容爲null,若是是數字則應該使用0來替代,那麼就須要利用咱們的NVL()函數來解決此類問題。
語法格式:
1 NVL(列 | null,爲空的默認值)若是在列上的內容不是null則使用列的數據,若是爲null,則使用默認值。
代碼示例:
1 SELECT empno,ename,job,sal,NVL(comm,0),(sal+NVL(comm,0))*12 income FROM emp;
2.多數值判斷
所謂的多數值判斷,指的是根據不一樣的結果能夠在輸出的時候進行嚴格數據的轉換,假設每個僱員都有本身的職位。職位如今使用的是英文描述,決定使用更換爲中文描述。
代碼示例:
1 SELECT empno,ename,job,DECODE(job,'CLERK','辦事員','SALESMAN','銷售','暫無此信息') FROM emp; 2 3 4 5 SELECT empno,ename,job,DECODE(job,'CLERK','辦事員','SALESMAN','銷售') FROM emp;