使用數(shù)據(jù)處理函數(shù)
本章記錄常用的mysql函數(shù)。
函數(shù)
與大多數(shù)編程語言一樣,sql也支持函數(shù)來處理數(shù)據(jù)。就像上一章中的RTrim()函數(shù)。
關(guān)于可移植性:能運(yùn)行在多個(gè)系統(tǒng)上的代碼稱為可移植的,雖然多數(shù)sql語言都是可以移植的,但是函數(shù)的移植性并不強(qiáng),所以如果還不確定使用何種數(shù)據(jù)庫的情況下,最好還是使用sql語句,盡量避免函數(shù),因?yàn)楦鱾€(gè)DBMS的所支持的函數(shù)差異很大。當(dāng)然函數(shù)會(huì)給我們帶來便捷,為了以后考慮,在使用函數(shù)的地方注釋盡量詳盡一些。
使用函數(shù)
大多數(shù)SQL會(huì)支持以下類型的函數(shù):
- 用于處理文本字符串的文本函數(shù)。比如刪除或者填充,截取子串,轉(zhuǎn)換大小寫。
- 對數(shù)值進(jìn)行算數(shù)操作的數(shù)學(xué)函數(shù)。比如代數(shù)運(yùn)算。
- 用于處理日期和時(shí)間值,并從數(shù)值中提取特定成分的時(shí)間函數(shù)。比如返回兩個(gè)日期的差。
- 返回DBMS正使用的特殊信息的系統(tǒng)函數(shù)。比如用戶登錄信息,返回版本信息等。
文本處理函數(shù)
比如我想讓adress的所有值都是大寫,可以用Upper()函數(shù)。

可以看到address列中的值都編程了大寫,還可以優(yōu)化一下,比如給這個(gè)大寫的列取一個(gè)別名,方便調(diào)用。

取別名是一個(gè)好習(xí)慣,建議新生成一個(gè)列之后都取一個(gè)名字,方便調(diào)用。
書上列出的常見的文本處理函數(shù)如下:


我們選取幾個(gè)常用的進(jìn)行練習(xí)。
-
length()
image.png - locate()
書里就給個(gè)函數(shù)名,我也不會(huì)用,于是我們得學(xué)會(huì)找資料,那么第一手資料必然是官方文檔。
然后找到mysql官網(wǎng)的documention里,API傳送門。當(dāng)然,你可以在里面找到任何一個(gè)官方函數(shù),剩下的就是看你的英文閱讀能力了。

上圖是官方API給出的解釋。試著讀一下。
locate()函數(shù)有兩種重載形態(tài),locate(substr, str), locate(substr, str, pos)
在看一下函數(shù)的解釋,“第一個(gè)函數(shù)返回substr在str中第一次出現(xiàn)的位置,第二個(gè)函數(shù)返回str中substr第一次出現(xiàn)的位置,從pos位置開始搜索。如果str中沒有substr子串則返回0。如果str或者substr為空,返回NULL”。


請看一下這兩張圖片中的第一條數(shù)據(jù),當(dāng)使用locate(substr, str, pos)函數(shù)時(shí),pos設(shè)置的起始搜索位置是15,也就是從第15個(gè)字符開始往后搜索,發(fā)現(xiàn)沒有匹配的值了,所以返回了0。
-
SubString()
看一下來自官方文檔的截圖:
image.png
SubString(str, pos):從pos的位置開始,截取后面的子串。
SubString(str From pos):跟上一個(gè)函數(shù)意思一樣。
SubString(str, pos, len):從pos的位置開始,截取len個(gè)字符。
SubString(str FROM pos FOR len):跟上一個(gè)函數(shù)意思一樣。
上圖中還有幾種很皮的用法,和python的list切片一樣,也支持逆向索引。
比如SubString('abcde', -2),截取后兩個(gè)字符,'de'。
SubString('abced', -3, 2),從倒數(shù)第3個(gè)字符開始截取,向后截取兩個(gè), 'ce'。
日期和時(shí)間處理函數(shù)
書中列出了如下的常用方法:

注意:在mysql中推薦的日期寫法是,yyyy-mm-dd,雖然mysql支持兩位數(shù)的年份,但是為了消除歧義應(yīng)該使用四位數(shù)的年份,比如2018-01-12。
選取其中常用的進(jìn)行測試練習(xí):
-
Date() 提取日期和時(shí)間中的日期
image.png
image.png
在查詢中經(jīng)常按照日期進(jìn)行查詢,所以可以用Date()函數(shù)篩選。

實(shí)際情況也會(huì)只需要時(shí)間,那么就可以使用Time()函數(shù)。

按照時(shí)間查詢也是同理的。

-
Year(), Month()
mysql還提供了提取年份和月份的函數(shù),顧名思義就是返回時(shí)間的年份和月份。
比如,我想查詢2016年9月份的訂單信息。
image.png
書上給了兩種方法,第一種是“硬編碼”,每個(gè)月天數(shù)不一定,你很可能換個(gè)月份就要改sql代碼了,所以,請使用第二種方法,也就是使用Year()和Month()函數(shù)來提取年份和月份,這樣進(jìn)行匹配的sql代碼更靈活,適用性也更強(qiáng)。
數(shù)值處理函數(shù)
一般進(jìn)行數(shù)學(xué)運(yùn)算,反正我工作中基本沒用過,但是還有瞅一眼,給大腦留個(gè)印象。

總結(jié)一下,這樣講述的函數(shù)比較多,但是常用的就那么幾個(gè),用的6了即可,剩下不常用的不會(huì)?看官方API,寫的十分清楚而且還有示例,再次傳送mysql 官方API
第十一章,OK。




