《基於oracle學習SQL語言》學習筆記——第三章 單行函數

第三章單行函數

雖然各個資料庫有各個資料庫自己的開發架構,但是對於資料庫而言,對開發者就兩塊重要的內容:SQL語句+單行函數

所有的單行函數,嚴格來講,程序都可以處理。

所謂的單行函數指的就是完成某一具體功能的操作函數,例如:轉大寫、日期格式轉換

基本格式:「返回值函數名稱(參數)」

按類型一共分為以下5種函數

第一節字元串函數

主要是處理字元串數據的(字元串數據有可能是從列上找到的,也有可能是直接設置的字元串常量)

包含的函數有如下幾種

函數名

描述

字元串UPPER(列|字元串)

將傳入的字元串變為大寫字母形式

字元串LOWER(列|字元串)

將傳入的字元串變為小寫字母形式

字元串INITCAP(列|字元串)

開頭首字母大寫,其他全部變為小寫字母

數字LENGTH(列|字元串)

取得指定字元串長度

字元串SUBSTR(列字元串,開始索引[長度])

進行字元串的截取,如果沒有設置長度,默認為開始索引,一直截取到結尾

字元串REPLACE(列|字元串,舊內容,新內容)

將指定字元串的數據以新數據替換舊數據

(啟動監聽服務)

在Oracle中,所有的函數如果想要進行驗證,也必須編寫SQL語句,為了方便用戶進行驗證或是一些不需要查詢表(查詢對象),專門提供了一個dual的虛擬表

實例1.驗證基本操作:轉大寫

SELECT UPPER(『hello』)

FROM dual;

實例2.將所以僱員的姓名轉小寫

SELECT LOWER(ename)

FROM emp;

在oracle中,本身數據是區分大小寫,但在實際開發中會發現,許多代碼本身是不區分大小寫的,所以用戶在進行信息查詢是,往往不會考慮大小寫

實例3.由用戶輸入要查詢的僱員姓名,而後顯示僱員的完整信息

在oracle中,如果要實現數據的輸入操作,可以使用替代變數來完成,格式「&標記」。

SELECT *

FROM emp

WHERE ename=UPPER(『&inputname』)

實例4.將所有僱員姓名按照首字母大寫,其他字母小寫的方式保存

SELECT ename,INITCAP(ename)

FROM emp;

實例5:取得字元串長度

SELECT LENGTH(『helloworld!!』)FROM dual;

實例6.查詢僱員姓名長度為5的全部僱員信息

SELECT*

FROM emp

WHERE LENGTH(ename)=5;

字元串截取:

從指定位置截取到結尾,字元串SUBSTR(列|字元串,開始索引);

截取部分內容,,字元串SUBSTR(列|字元串,開始索引,長度);

實例7.驗證函數

SELECT SUBSTR(『helloworld』,6)FROM dual;

SELECT SUBSTR(『helloworld』,0)FROM dual;

SELECT SUBSTR(『helloworld』,0,5)FROM dual;

在程序中,所有的字元串的首字母的索引號都是0,但是在Oracle中所有的字元串的首字母的索引號都是1;如果設置的是0,也可以按照1來進行處理。

實例8.要求截取所有僱員姓名的前三個字母

SELECT SUBSTR(ename,1,3)

FROM emp;

實例9.要求截取所有僱員姓名的後三個字母

SELECT SUBSTR(ename,LENGTH(ename)-2)

FROM emp;

在Oracle中,有一點注意:在設置SUBSTR()函數時考慮到了由後截取的情況,可以直接用負數表示後面第幾位字元。此類設置方法只有在oracle資料庫才有,在程序中不能這樣設置。

SELECT SUBSTR(ename,-3)

FROM emp;

第二節數值函數

數值函數主要是對數字的處理

函數名稱

數字ROUND(列|數字[,小數位])

實現數據的四捨五入,可以設置保留小數位

數字TRUNC(列|數字[,小數位])

實現數據的截取,即:只截取,不算近似值

數字MOD(數字,列|數字)

求余

實例1.使用ROUND()函數

SELECT ROUND(789.12345)FROM dual;

SELECT ROUND(789.12345,2)FROM dual;

SELECT ROUND(789.12345,-2)FROM dual;

如果沒有設置小數點位置,那麼會直接不保留小數位進行進位;

如果設置為負數,那麼表示進行整數位的倒數第幾位開始,進行四捨五入。

實例2.驗證TRUNC()

TRUNC()函數和ROUND()函數使用形式上差別不大,唯一的區別在於TRUNC()只截取,不進位;

SELECT TRUNC(789.12345)

TRUNC(789.12345,2)

TRUNC(789.12345,-2)

FROM dual;

如果沒有設置小數點位置,那麼會直接不保留;

實例.求余函數

SELECT MOD(10,3)FROM dual;

第三節日期函數

如果想處理任何日期,都必須具備一個前提:知道當前的日期;

如果想要取得當前日期,則在Oracle中,專門提供了一個偽列「SYSDATE」(SYSTIMESTAMP);

偽列:非真實列,但存在;

實例1.驗證偽列

SELECT SYSDATE FROM dual;

SELECT SYSTIMESTAMP FROM dual;

SYSDATE偽列里包含了日期時間的內容,只不過現在只顯示了日期數據;除了要知道當前日期,還需要知道三個日期的操作公式:

日期+數字=日期(表示若干天之後的日期)

日期-數字=日期(表示若干天之前的日期)

日期-日期=數字(兩個日期間隔天數)

實例2.實現日期的基本操作

SELECT SYSDATE-7,SYSDATE+240 FROM dual;

對於日期而言,每個月的天數是不同的,所以直接進行天數加法實現月數計算是不準確的。

實例3.要求查詢出每個僱員的編號、姓名、職位、已經被僱傭的天數

SELECT empno,ename,job,SYSDATE-hiredate

FROM emp;

如何用天數轉換成年或月呢?在Oracle中,提供了四個日期處理函數

函數名稱

日期ADD_MONTHS(列|日期,月數)

在指定日期之上增加若干個月後的日期

數字MONTHS_BETWEEN(列|日期,列|日期)

返回兩個日期之間的月數

日期LAST_DAY(列|日期)

取得指定日期當月的最後一天

日期NEXT_DAY(列|日期,星期X)

返回指定日期,對應的下一個指定的星期幾的具體日期

實例4.在當前日期下增加指定月份

SELECT ADD_MONTHS(SYSDATE,4) FROM dual;

在進行月數增加時,是不會限制數據的大小的。

實例5.計算所以僱員到今天位置僱傭的月數

SELECT empno,ename,hiredate,TRUNC(MONTH_BETWEEN(hiredate,SYSDATE))

FROM emp;

實例6.計算當前所在月的最後一天日期

SELECT LAST_DAY(SYSDATE)FROM dual;

實例7.要求查詢出所有僱傭所在月倒數第三天僱傭的僱員信息

SELECT *

FROM emp

WHERE hiredate=(LAST_DAY(hire date)-2);

一般而言,日期函數操作比較麻煩,但是對於計算日期是最準確的

實例8.驗證NEXT_DAY()

SELECT NEXT_DAY(SYSDATE,』星期二』)FROM dual;

實例9.要求以年、月、日的方式計算出每個僱員到現在為止僱傭年限(以僱員7698,BLACK為例)

第一步:求出每一位僱員到現在為止僱傭的年份。在Oracle中,有兩種方式計算年份:

方式一:(日期-日期)/365

方式二:MONTHS_BETWEEN(SYSDATE,hiredate)/12

第二種方式更好,因為第一種方式沒有排除閏年

第二步,求出僱傭月數

第三步,求出僱傭天數:日期1-日期2=天數;日期1:SYSDATE;日期2:ADD_MONTHS(hire date,MONTH_BETWEEN(SYSDATE,hiredate))

SELECT empno,ename,hiredate,TRUNC( MONTH_BETWEEN(SYSDATE,hiredate)/12) year

TRUNC(MOD( MONTH_BETWEEN(SYSDATE,hiredate),12) )months

TRUNC(SYSDATE-ADD_MONTHS(hire date,MONTH_BETWEEN(SYSDATE,hiredate)) )days

FROM emp;

第四節轉換函數

目前為止,已經接觸了數字型、字元串型、日期型三類數據,而這三類數據之間是可以實現轉換操作的,需要使用如下轉換函數完成

函數名稱

字元串TO_CHAR(列|日期|數字,轉換格式)

將日期、數字轉換成指定格式

日期 TO_DATE(列|字元串,轉換格式)

按照指定格式編寫字元串後,轉換為日期格式

數字 TO_NUMBER(列|字元串)

將字元串轉換為數字

1. 轉字元串函數:TO_CHAR

如果想要將一個日期或數字變成字元串,那麼首先必須清楚轉換格式的標記:

日期:年(yyyy)、月(mm)、日(dd)

時間:時(hh、hh24)、分(mi)、秒(ss)

數字:任意數字(9),本地貨幣符號(L);

實例1:將日期顯示格式化

SELECT TO_CHAR(SYSDATE,』yyyy-mm-dd』)FROM dual;

在之前一直強調SYSDATE包含日期和時間兩類內容

實例2.格式化日期和時間

SELECT TO_CHAR(SYSDATE,』yyyy-mm-dd hh24:mi:ss』)FROM dual;

注意:使用TO_CHAR函數可以實現日期數據的拆分

實例3.實現日期數據的拆分

SELECT TO_CHAR(SYSDATE,』yyyy』), TO_CHAR(SYSDATE,』mm』), TO_CHAR(SYSDATE,』dd』)

FROM dual;

實例4.找出2月份僱傭的僱員信息

SELECT *

FROM emp

WHERE TO_CHAR(SYSDATE,』mm』)=02;

除了可以轉換日期,還可以轉換數字

SELECT TO_CHAR(1987654320,』999,L999,999,999,999』)FROM dual;

2. 轉日期函數

在之前發現如果要想編寫一個日期型數據,那麼需要按照指定的字元串格式編寫,這種操作屬於Oracle的自動轉換,我們還可以手工轉換

實例5.將字元串變為日期

SELECT TO_DATE(『1988-10-29』,』yyyy-mm-dd』)FROM dual;

3. 轉數字函數

SELECT TO_NUMBER(『1』)+TO_NUMBER(『2』)FROM dual;

因為Oracle自帶很多轉換功能,所以,我們掌握第一個轉字元串函數就可以了。

第五節通用函數

一般指的是Oracle的特色函數,主要有兩個通用函數

函數名稱

數字NVL(列|NULL,默認值)

如果傳入內容是NULL,則使用默認值處理,反之,則使用原始數值處理

數據類型DECODE(列|字元串|數值,比較內容1,顯示內容1,比較內容2,顯示內容2, ……,默認顯示內容)

設置的內容會與每一個比較內容進行比較,如果內容相同,則會使用顯示內容進行輸出,如果都不相同,則使用默認信息輸出

1. 處理NULL函數

實例1.要求查詢出每個僱員的編號、姓名、基本工資、傭金、年薪;

SELECT empno,ename,sal,comm,(sal+comm)*12

FROM emp;

發現運行結果顯示,沒有傭金的僱員的年薪也為NULL;因為有NULL的運算,結果都為空,此時,為了保證計算成功,需要把NULL替換成0,此操作就是NVL()函數的作用範疇。

SELECT empno,ename,sal,comm,(sal+NVL(comm,0))*12

FROM emp;

2. DECODE函數

類似於程序的if……else,但此處不能判斷關係,只能判斷內容是否相同。

實例2.將所有的職位信息替換為中文顯示

SELECT empno,ename,job,DECODE(job,『clerk』,『辦事員』,『salesman』,『銷售員』,『manager』,『經理』,『總裁』)

FROM emp;

如果沒有設置默認值,則默認值為NULL


推薦閱讀:

SQLiGODs 注入(一個有意思的玩法)
Sqli labs系列-less-5&6 報錯注入法(上)
阿里雲專家風移「出診」記錄:SQL Server 疑難雜症解決之道(上篇)
SQL、NoSQL還是NewSQL? 未來誰將一統資料庫?
sql 查詢如何將結果集 輸出為一段字元串?

TAG:Oracle数据库 | SQL | 数据分析师 |