大部分內容是必知必會教材中的內容,不會因爲我表述或者轉述就變成我的文字,提供練習和截圖僅爲了回顧複習和相互督促,所以事先聲明。
這一課學習什麼是函數,DBMS支持何種函數,以及如何使用這些函數;還將瞭解到爲什麼SQL函數的使用可能會帶來問題。
目錄
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中雖都有對應實現,但具體用法各不相同,最後學習的數值處理函數,倒是較於其他函數來說,更爲統一,所以在具體使用過程中,要考慮到差異性。
刻意練習,每日精進。