與其餘大多數計算機語言同樣,SQL支持利用函數來處理數據。函數
通常是在數據上執行的,它給數據的轉換和處理提供了方便。
在前一章中用來去掉串尾空格的 RTrim() 就是一個函數的例子程序員
函數沒有SQL的可移植性強 能運行在多個系統上的代碼稱
爲可移植的(portable)。相對來講,多數SQL語句是可移植的,
在SQL實現之間有差別時,這些差別一般不那麼難處理。而函
數的可移植性卻不強。幾乎每種主要的DBMS的實現都支持其
他實現不支持的函數,並且有時差別還很大。
爲了代碼的可移植,許多SQL程序員不同意使用特殊實現的功
能。雖然這樣作頗有好處,但不老是利於應用程序的性能。如
果不使用這些函數,編寫某些應用程序代碼會很艱難。必須利
用其餘方法來實現DBMS很是有效地完成的工做。
若是你決定使用函數,應該保證作好代碼註釋,以便之後你(或
其餘人)能確切地知道所編寫SQL代碼的含義算法
大多數SQL實現支持如下類型的函數。函數
使用 Upper() 函數
如所見, Upper() 將文本轉換爲大寫,所以本例子中每一個供
應商都列出兩次,第一次爲 vendors 表中存儲的值,第二次做
爲列 vend_name_upcase 轉換爲大寫性能
表11-1中的 SOUNDEX 須要作進一步的解釋。 SOUNDEX 是一個將任何文
本串轉換爲描述其語音表示的字母數字模式的算法。 SOUNDEX 考慮了相似
的發音字符和音節,使得能對串進行發音比較而不是字母比較。雖然
SOUNDEX 不是SQL概念,但MySQL(就像多數DBMS同樣)都提供對
SOUNDEX 的支持。測試
下面給出一個使用 Soundex() 函數的例子。 customers 表中有一個顧
客 Coyote Inc. ,其聯繫名爲 Y.Lee 。但若是這是輸入錯誤,此聯繫名實
際應該是 Y.Lie ,怎麼辦?顯然,按正確的聯繫名搜索不會返回數據,如
下所示3d
如今試一下使用 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的數據處理函數,並着重介紹了日期處理函 數。