八溪北、使用函數(shù)處理數(shù)據(jù)

加油吧!工程師.png
  • 什么是函數(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() 角度的正切

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傻昙,一起剝皮案震驚了整個濱河市闺骚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妆档,老刑警劉巖僻爽,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贾惦,居然都是意外死亡胸梆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門须板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碰镜,“玉大人,你說我怎么就攤上這事逼纸⊙蟠耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵杰刽,是天一觀的道長菠发。 經(jīng)常有香客問我,道長贺嫂,這世上最難降的妖魔是什么滓鸠? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮第喳,結(jié)果婚禮上糜俗,老公的妹妹穿的比我還像新娘。我一直安慰自己曲饱,他們只是感情好悠抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扩淀,像睡著了一般楔敌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻谆,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天卵凑,我揣著相機(jī)與錄音,去河邊找鬼胜臊。 笑死勺卢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的象对。 我是一名探鬼主播黑忱,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杨何?” 一聲冷哼從身側(cè)響起酱塔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎危虱,沒想到半個月后羊娃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埃跷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年蕊玷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弥雹。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡垃帅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剪勿,到底是詐尸還是另有隱情贸诚,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布厕吉,位于F島的核電站酱固,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏头朱。R本人自食惡果不足惜运悲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望项钮。 院中可真熱鬧班眯,春花似錦、人聲如沸烁巫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚隙。三九已至定踱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恃鞋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工亦歉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恤浪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓肴楷,卻偏偏與公主長得像水由,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赛蔫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355