函數 與其他大多數電腦語言一樣,SQL支持利用函數來處理數據。函數 一般是在數據上執行的,它給數據的轉換和處理提供了方便。 在前一章中用來去掉串尾空格的 RTrim() 就是一個函數的例子 函數沒有SQL的可移植性強 能運行在多個系統上的代碼稱 為可移植的(portable)。相對來說,多數SQL ...
函數
與其他大多數電腦語言一樣,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 ,怎麼辦?顯然,按正確的聯繫名搜索不會返回數據,如
下所示
現在試一下使用 Soundex() 函數進行搜索,它匹配所有發音類似於
Y.Lie 的聯繫名
在這個例子中, 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日或……)
應該總是使用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的數據處理函數,並著重介紹了日期處理函
數。