- 什么是函數(shù)?
- DBMS支持哪些函數(shù)?
- 如何使用這些函數(shù)?
- 為什么SQL函數(shù)的使用可能會帶來問題?
1遂唧、函數(shù)
函數(shù)一般是在數(shù)據(jù)上執(zhí)行的芙代,位數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。
函數(shù)帶來的問題
幾乎所有的DBMS都等同的支持SQL語句(例如:SELECT)盖彭,但是 每一個DBMS都有特定的函數(shù)纹烹。
只有少數(shù)幾個函數(shù)被所有主要的DBMS等同地支持。
雖然所有類型的函數(shù)一般都可以在每個DBMS紅使用召边,但各個函數(shù)的名稱和語法可能極其不同铺呵。
例如:
函數(shù) | 語法 |
---|---|
提取字符串的組成部分 | DB2、Oracle隧熙、PostgreSQL片挂、SQLite使用SUBSTR() ; MariaDB、MySQL贞盯、SQL Server使用SUBSTRING() 音念。 |
數(shù)據(jù)類型轉(zhuǎn)換 | Oracle使用多個函數(shù),每種類型的轉(zhuǎn)換有一個函數(shù) 躏敢; DB2和PostgreSQL使用CAST() ; MariaDB闷愤、MySQL、SQL Server使用CONVERT() 件余。 |
取當(dāng)前日期 | DB2讥脐、PostgreSQL使用CURRENT_DATE ; MariaDB、MySQL使用CURDATE ; SQLite使用DATE()
|
可以看到蛾扇,與SQL語句不同攘烛,SQL函數(shù)不是可移植的。這意味著為特定SQL實(shí)現(xiàn)編寫的代碼在其他實(shí)現(xiàn)中可能不能用镀首。
可移植(portable)
所編寫的代碼可以在多個系統(tǒng)上運(yùn)行坟漱。
使用或者不使用函數(shù)沒有對錯之分。如果使用函數(shù)更哄,應(yīng)該保證做好代碼注釋芋齿。
2腥寇、使用函數(shù)
大多數(shù)SQL實(shí)現(xiàn)支持一下類型的函數(shù)。
- ①用于處理文本字符串(刪除觅捆、填充赦役、轉(zhuǎn)換值為大寫活小寫)的文本函數(shù)。
- ②用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作(返回絕對值栅炒、機(jī)型袋鼠運(yùn)算等)的數(shù)值函數(shù)掂摔。
- ③用于處理日期的時間值并從這些值中提取特定成分(例如:返回兩個日期之差,檢查日期有效性)的日期和時間函數(shù)赢赊。
- ④用于生成美觀好懂的輸出內(nèi)容的格式化函數(shù)(如語言形式表達(dá)出日期乙漓,用貨幣符號和千分位表示金額)。
- ⑤返回DBMS正確的特殊信息(如返回用戶登錄信息)的系統(tǒng)函數(shù)释移。
2.1 文本處理函數(shù)
RTRIM() 去掉列值右邊的空格叭披。
UPPER()將文本轉(zhuǎn)換成大寫
SELECT g_name, UPPER(g_name) AS g_name_upcase
FROM Goods
ORDER BY g_name;
- 常用的文本處理函數(shù)
函數(shù) | 說明 |
---|---|
LEFT()(或使用子字符串函數(shù)) | 返回字符串左邊的字符 |
RIGHT()(或使用子字符串函數(shù)) | 返回字符串右邊的字符 |
LENGTH()(也是用DATALENGTH()或LEN()) | 返回字符串的長度 |
LOWER() | 將字符串轉(zhuǎn)換為小寫
|
UPPER() | 將字符串轉(zhuǎn)換為大寫
|
LTRIM()(或使用子字符串函數(shù)) | 去掉字符串左邊的空格
|
RTRIM() | 去掉字符串右邊的空格
|
SUBSTR()或SUBSTRING() | 提取字符串的組成部分 |
SOUNDEX() | 返回字符串的SOUNDEX值 |
①SOUNDEX
是一個將任何文本串轉(zhuǎn)換為描述其語音標(biāo)識的字符數(shù)字模式的算法。SOUNDEX考慮了類似的發(fā)音字符和音節(jié)玩讳,使得能對字符串進(jìn)行發(fā)音比較而不是字母比較涩蜘。雖然SOUNDEX不是SQL概念,但多數(shù)DBMS湊提供對SOUNDEX的支持熏纯。
②PostgreSQL不支持SOUNDEX()函數(shù)同诫,多數(shù)SQLite實(shí)現(xiàn)不支持SOUNDEX(),但是如果在創(chuàng)建SQLite時使用了SQLITE_SOUNDEX編譯時選項(xiàng)豆巨,那么SOUNDEX()在SQLit中就可用剩辟。(SQLITE_SOUNDEX不是默認(rèn)的編譯時選項(xiàng))
舉例:
如果一個顧客表中一個人名字叫“Michael Green”,
但是搜索時候輸入錯誤輸入了“Michelle Green”,
如果直接搜
是不會返回“Michael Green”的,
但是如果用SOUNDEX()
就可以得到“Michael Green”往扔。
//搜不到想要的Michael
SELECT name
FROM Customers
WHERE name = 'Michelle Green'
//可搜到想要的Michael
SELECT name
FROM Customers
WHERE SOUNDEX(name) = SOUNDEX('Michelle Green')
- 因?yàn)椤癕ichelle Green”和“Michael Green”的發(fā)音相似,所以它們的SOUNDEX值匹配熊户,因此WHERE子句正確的過濾除了所需的數(shù)據(jù)萍膛。
2.2、日期和時間處理函數(shù)
日期和時間的函數(shù)嚷堡,在不同的DBMS中很不一致蝗罗,可移植性很差。這里就不細(xì)說了蝌戒。簡單舉個列子
例如:查詢所有2020年的訂單號
SELECT order_number
FROM Orders
WHERE DATEPART(yy, order_data) = 2020;
SELECT order_number
FROM Orders
WHERE DATE_PART('year', order_data) = 2020;
2.3 數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)串塑。這些函數(shù)主要用于代數(shù)、三角或幾何運(yùn)算北苟。雖然使用頻率不高桩匪,但是在主要的DBMS函數(shù)中,數(shù)值函數(shù)是最一致的函數(shù)友鼻。
- 常用的數(shù)值處理函數(shù):
函數(shù) | 說明 |
---|---|
ABS() | 數(shù)的絕對值 |
COS() | 角度的余弦 |
SIN() | 角度的正弦 |
PI() | 圓周率π的值 |
EXP() | 數(shù)的指數(shù)值 |
SQRT() | 數(shù)的平方根 |
TAN() | 角度的正切 |