Oracle數據庫從入門到精通 單行函數問題

視頻課程:李興華 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');

因此在一些要求嚴格的操做環境下,對於不區分大小寫的操做的時候,基本上就會有兩種作法:

 

  1. 在數據保存的時候將全部的數據統一變爲大寫或者是小寫,這樣子在查詢的時候就能夠直接利用特定的函數進行處理。
  2. 在數據保存的時候依然是按照原始的方式進行保存,然後在查詢的時候將每個數據中的字母變爲大寫形式進行處理。

在全部不區分大小寫的操做的項目之中,保存數據時就必須對數據進行提早的處理。

 

 

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+10FROM 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. 計算指定日期所在月的最後一天。

      語法:

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;

 

  1. 計算下一個指定的日期

    語法:日期 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;

 

相關文章
相關標籤/搜索