函式
與其他大多數計算機語言一樣,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的資料處理函式,并著重介紹了日期處理函
數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/84256.html
標籤:MySQL
