【數據庫知識掃描】 | SQL複習-中篇 第8課 使用函數處理數據

大部分內容是必知必會教材中的內容,不會因爲我表述或者轉述就變成我的文字,提供練習和截圖僅爲了回顧複習和相互督促,所以事先聲明。

這一課學習什麼是函數,DBMS支持何種函數,以及如何使用這些函數;還將瞭解到爲什麼SQL函數的使用可能會帶來問題。

目錄

 8.1 函數

8.2 使用函數

① 文本處理函數

② 日期和時間處理函數

③ 數值處理函數


 8.1 函數

終於講到了函數,類比其他計算機語言,SQL同樣使用函數處理數據。

由於不同的DBMS支持不同的函數,這句話怎麼理解呢?也就是說SQL語句基本上都能夠得到所有DBMS的支持,函數雖然可以在每個DBMS中應用,但具體的函數名稱和語法,要參看文檔。可以舉個栗子看看,DBMS函數哪種不一樣。

可移植(portable) 所編寫的代碼可以在多個系統上運行。

與SQL語句不一樣,SQL函數不是可移植的。意味着爲特定SQL實現編寫的代碼在其他實現中可能不正常。這也是爲什麼上一課中,MySQL的concat函數直接實現了“+連接符與RTRIM函數”所完成的工作。

函數使用問題:作者建議使用本身沒有問題,應該保證做好代碼註釋,瞭解SQL代碼的含義,便於後期維護或可移植。

8.2 使用函數

大多數SQL實現支持以下類型的函數。

用於處理文本字符串(如刪除或填充值,轉換值爲大寫或小寫)的文本函數。

用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數。

用於處理日期和時間值並從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函數。

□ 返回DBMS正使用的特殊信息(如返回用戶登錄信息)的系統函數。

上一課函數作用於SELECT後面的列名,但函數的作用不僅於此。它還可以作爲SELECT語句的其他成分,如在WHERE子句中使用,在其他SQL語句中使用等,後面會學習到更多的用法。

① 文本處理函數

使用的是UPPER()函數,將文本轉換爲大寫。

SELECT vend_name ,UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name;

結果是確實將第一列vend_name的值全部大寫了。再看看其他的文本處理函數LEFT()、LENGTH()、LOWER()等:

其中SOUNDEX是一個將任何文本串轉換爲描述其語音表示的字母數字模式的算法。SOUNDEX考慮了類似的發音字符和音節,使得能對字符串進行發音比較而不是字母比較。雖然SOUNDEX不是SQL概念,但多數DBMS都提供對SOUNDEX的支持。

我們來跟進一個實例:Customers表中有一個顧客Kids Place,其聯繫名爲Michelle Green。但如果這是錯誤的輸入,此聯繫名實際上應該是MichaelGreen,該怎麼辦呢?顯然,按正確的聯繫名搜索不會返回數據,那麼我們來檢索試試:

確實檢索不到相關信息。

再加上SOUNDEX函數試試:

 過濾得到所需的結果。

② 日期和時間處理函數

日期和時間採用相應的數據類型存儲在表中,每種DBMS都有自己的特殊形式。

日期和時間值以特殊的格式存儲,以便能快速和有效排序或過濾,並且節省物理存儲空間。應用程序一般不使用日期和時間的存儲格式,因此日期和時間函數總是用來讀取、統計和處理這些值。由於這個原因,日期和時間函數在SQL中具有重要的作用。遺憾的是,它們很不一致,可移植性最差

實例說話,Orders表中包含的訂單都帶有訂單日期。爲檢索出2012年的所有訂單:

文中基於不同DBMS做了演示,比如SQL Server、Access、PostgreSQL以及Oracle的其他類似日期處理函數:

MySQL具有各種日期處理函數,但沒有DATEPART()。MySQL可使用名爲YEAR()的函數從日期中提取年份。

比如,提取年份爲2012的訂單編號:

還有其他的日期-時間處理函數,參閱對應文檔。

③ 數值處理函數

 數值處理函數僅處理數值數據。這些函數一般主要用於代數、三角或幾何運算。

不像字符串或日期-時間處理函數使用那麼頻繁。在主要DBMS的函數中,數值函數最一致、最統一的函數。

這一課就跟完了,雖然這節課主要講的是三個函數,但各有不同,文本、時間、數值是我們在日常生活中最常見的三類數據類型,在各種DBMS中雖都有對應實現,但具體用法各不相同,最後學習的數值處理函數,倒是較於其他函數來說,更爲統一,所以在具體使用過程中,要考慮到差異性。

刻意練習,每日精進。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章