函數
與其餘大多數計算機語言同樣,SQL支持利用函數來處理數據。函數 通常是在數據上執行的,它給數據的轉換和處理提供了方便。 在前一章中用來去掉串尾空格的 RTrim() 就是一個函數的例子程序員
函數沒有SQL的可移植性強 能運行在多個系統上的代碼稱 爲可移植的(portable)。相對來講,多數SQL語句是可移植的, 在SQL實現之間有差別時,這些差別一般不那麼難處理。而函 數的可移植性卻不強。幾乎每種主要的DBMS的實現都支持其 他實現不支持的函數,並且有時差別還很大。 爲了代碼的可移植,許多SQL程序員不同意使用特殊實現的功 能。雖然這樣作頗有好處,但不老是利於應用程序的性能。如 果不使用這些函數,編寫某些應用程序代碼會很艱難。必須利 用其餘方法來實現DBMS很是有效地完成的工做。 若是你決定使用函數,應該保證作好代碼註釋,以便之後你(或 其餘人)能確切地知道所編寫SQL代碼的含義算法
使用函數
大多數SQL實現支持如下類型的函數。函數
- 用於處理文本串(如刪除或填充值,轉換值爲大寫或小寫)的文 本函數。
- 用於在數值數據上進行算術操做(如返回絕對值,進行代數運算) 的數值函數。
- 用於處理日期和時間值並從這些值中提取特定成分(例如,返回 兩個日期之差,檢查日期有效性等)的日期和時間函數。
- 返回DBMS正使用的特殊信息(如返回用戶登陸信息,檢查版本 細節)的系統函數
文本處理函數
使用 Upper() 函數 如所見, Upper() 將文本轉換爲大寫,所以本例子中每一個供 應商都列出兩次,第一次爲 vendors 表中存儲的值,第二次做 爲列 vend_name_upcase 轉換爲大寫性能
表11-1中的 SOUNDEX 須要作進一步的解釋。 SOUNDEX 是一個將任何文 本串轉換爲描述其語音表示的字母數字模式的算法。 SOUNDEX 考慮了相似 的發音字符和音節,使得能對串進行發音比較而不是字母比較。雖然 SOUNDEX 不是SQL概念,但MySQL(就像多數DBMS同樣)都提供對 SOUNDEX 的支持。測試
下面給出一個使用 Soundex() 函數的例子。 customers 表中有一個顧 客 Coyote Inc. ,其聯繫名爲 Y.Lee 。但若是這是輸入錯誤,此聯繫名實 際應該是 Y.Lie ,怎麼辦?顯然,按正確的聯繫名搜索不會返回數據,如 下所示spa
如今試一下使用 Soundex() 函數進行搜索,它匹配全部發音相似於 Y.Lie 的聯繫名 blog
在這個例子中, WHERE 子句使用 Soundex() 函數來轉換 cust_ contact 列值和搜索串爲它們的 SOUNDEX 值。由於 Y.Lee 和 Y.Lie 發音類似,因此它們的 SOUNDEX 值匹配,所以 WHERE 子句正確地過濾 出了所需的數據排序
日期和時間處理函數
期和時間採用相應的數據類型和特殊的格式存儲,以便能快速和 有效地排序或過濾,而且節省物理存儲空間。 通常,應用程序不使用用來存儲日期和時間的格式,所以日期和時 間函數老是被用來讀取、統計和處理這些值。因爲這個緣由,日期和時 間函數在MySQL語言中具備重要的做用文檔
用日期進行過濾須要注意一些別的問題和使用特殊的 MySQL函數。 首先須要注意的是MySQL使用的日期格式。不管你何時指定一 個日期,不論是插入或更新表值仍是用 WHERE 子句進行過濾,日期必須爲 格式yyyy-mm-dd。所以,2005年9月1日,給出爲2005-09-01。雖然其餘的 日期格式可能也行,但這是首選的日期格式,由於它排除了多義性(如, 04/05/06是2006年5月4日或2006年4月5日或2004年5月6日或……)table
應該老是使用4位數字的年份 支持2位數字的年份,MySQL 處理00-69爲2000-2069,處理70-99爲1970-1999。雖然它們可 能是打算要的年份,但使用完整的4位數字年份更可靠,由於 MySQL沒必要作出任何假定。
可是,使用 WHERE order_date = '2005-09-01' 可靠嗎? order_ date 的數據類型爲 datetime 。這種類型存儲日期及時間值。樣例表中 的值全都具備時間值 00:00:00 ,但實際中極可能並不老是這樣。若是 用當前日期和時間存儲訂單日期(所以你不只知道訂單日期,還知道 下訂單當天的時間),怎麼辦?好比,存儲的 order_date 值爲 2005-09-01 11:30:05 ,則 WHERE order_date = '2005-09-01' 失敗。 即便給出具備該日期的一行,也不會把它檢索出來,由於 WHERE 匹配失 敗。 解決辦法是指示MySQL僅將給出的日期與列中的日期部分進行比 較,而不是將給出的日期與整個列值進行比較。爲此,必須使用 Date() 函數。 Date(order_date) 指示MySQL僅提取列的日期部分,更可靠的 SELECT 語句爲:
若是要的是日期,請使用 Date() 若是你想要的僅是日期, 則使用 Date() 是一個良好的習慣,即便你知道相應的列只包 含日期也是如此。這樣,若是因爲某種緣由表中之後有日期和 時間值,你的SQL代碼也不用改變。固然,也存在一個 Time() 函數,在你只想要時間時應該使用它。 Date() 和 Time() 都是在MySQL 4.1.1中第一次引入的。
若是你想檢索出2005年9月下的 全部訂單,怎麼辦?簡單的相等測試不行,由於它也要匹配月份中的天 數。有幾種解決辦法,其中之一以下所示
其中, BETWEEN 操做符用來把 2005-09-01 和 2005-09-30 定義爲 一個要匹配的日期範圍。 還有另一種辦法(一種不須要記住每月中有多少天或不須要操 心閏年2月的辦法)
Year() 是一個從日期(或日期時間)中返回年份的函數。相似, Month() 從日期中返回月份。所以, WHERE Year(order_date) = 2005 AND Month(order_date) = 9 檢索出 order_date 爲2005年9月的 全部行
MySQL的版本差別 MySQL 4.1.1中增長了許多日期和時間 函數。若是你使用的是更早的MySQL版本,應該查閱具體的 文檔以肯定可使用哪些函數
數值處理函數
數值處理函數僅處理數值數據。這些函數通常主要用於代數、三角 或幾何運算,所以沒有串或日期 — 時間處理函數的使用那麼頻繁。 具備諷刺意味的是,在主要DBMS的函數中,數值函數是最一致最統 一的函數。表11-3列出一些經常使用的數值處理函數
本章介紹瞭如何使用SQL的數據處理函數,並着重介紹了日期處理函 數。