Mysql第十一章數(shù)據(jù)處理函數(shù)

同大多數(shù)計(jì)算機(jī)語(yǔ)言一樣,SQL支持利用函數(shù)來(lái)處理數(shù)據(jù)。函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便。
注意點(diǎn):

函數(shù)沒(méi)有SQL的可移植性強(qiáng) 能運(yùn)行在多個(gè)系統(tǒng)上的代碼稱(chēng)為可移植的(portable)。相對(duì)來(lái)說(shuō),多數(shù)SQL語(yǔ)句是可移植的,在SQL實(shí)現(xiàn)之間有差異時(shí),這些差異通常不那么難處理。而函數(shù)的可移植性卻不強(qiáng)。幾乎每種主要的DBMS的實(shí)現(xiàn)都支持其他實(shí)現(xiàn)不支持的函數(shù),而且有時(shí)差異還很大。 為了代碼的可移植,許多SQL程序員不贊成使用特殊實(shí)現(xiàn)的功能。雖然這樣做很有好處,但不總是利于應(yīng)用程序的性能。如果不使用這些函數(shù),編寫(xiě)某些應(yīng)用程序代碼會(huì)很艱難。必須利用其他方法來(lái)實(shí)現(xiàn)DBMS非常有效地完成的工作。 如果你決定使用函數(shù),應(yīng)該保證做好代碼注釋?zhuān)员阋院竽悖ɑ蚱渌耍┠艽_切地知道所編寫(xiě)SQL代碼的含義。

使用函數(shù)

文本處理函數(shù)
  • Upper()函數(shù) 將文本轉(zhuǎn)換為大寫(xiě)
    輸入:SELECT UPPER('aaa')
    輸出:


    image.png
常用的文本處理函數(shù)
函數(shù) 說(shuō)明 舉例
left(str,num) 返回錯(cuò)左邊的字符 SELECT LEFT('AABBCCDD',2)
length() 返回串的長(zhǎng)度 SELECT LENGTH('AABBCCDDEEFFGG')
locate() 返回串的子串 select LOCATE('aa','AABBccaa',2)
lower() 將串轉(zhuǎn)換為小寫(xiě) SELECT LOWER('AABBCCDD')
UPPER() 將串轉(zhuǎn)換為大寫(xiě) SELECT UPPER('aaa')
LTRim() 去掉串左邊的空格
RTrim() 去掉串右邊的空格
Trim() 去掉串兩邊的空格
日期和時(shí)間處理函數(shù)
函數(shù) 說(shuō)明 舉例
CURDATE() 返回當(dāng)前日期 select CURDATE()
CURTIME() 返回當(dāng)前時(shí)間 select CURTIME()
Now() 返回當(dāng)前日期和時(shí)間
Date() 返回日期時(shí)間的日期部分 select Date('2023-08-07 00:00:00')
DAY() 返回一個(gè)日期的天數(shù)部分 select DAY('2023-08-07 00:00:00')
DayOfWeek() 對(duì)于一個(gè)日期,返回對(duì)應(yīng)的星期幾
Month() 返回一個(gè)日期的月份部分
Hour() 返回一個(gè)時(shí)間的小時(shí)部分
Minute() 返回一個(gè)時(shí)間的分鐘部分
Second() 返回一個(gè)時(shí)間的秒部分
DateDiff() 計(jì)算兩個(gè)日期之差 select DateDiff('2023-08-07 00:00:00','2023-08-15 00:00:00')
Date_Add() 高度靈活的日期運(yùn)算函數(shù) SELECT DATE_ADD('2023-01-01', INTERVAL 2 MONTH 3 DAY);
Now() 返回當(dāng)前日期和時(shí)間
Time() 返回一個(gè)日期時(shí)間的時(shí)間部分
Year() 返回一個(gè)日期的年份部分
舉例:
  • 輸入:select * from order where order_date='2005-09-01'
  • 輸出:
    image.png

分析: 使用WHERE order_date = '2005-09-01'可靠嗎?order_ date的數(shù)據(jù)類(lèi)型為datetime。這種類(lèi)型存儲(chǔ)日期及時(shí)間值。樣例表中的值全都具有時(shí)間值00:00:00,但實(shí)際中很可能并不總是這樣。如果用當(dāng)前日期和時(shí)間存儲(chǔ)訂單日期(因此你不僅知道訂單日期,還知道下訂單當(dāng)天的時(shí)間),怎么辦?比如,存儲(chǔ)的order_date值為
2005-09-01 11:30:05,則WHERE order_date = '2005-09-01'失敗。即使給出具有該日期的一行,也不會(huì)把它檢索出來(lái),因?yàn)閃HERE匹配失敗。解決辦法是指示MySQL僅將給出的日期與列中的日期部分進(jìn)行比較,而不是將給出的日期與整個(gè)列值進(jìn)行比較。為此,必須使用Date()函數(shù)

  • 輸入:select * from order where date(order_date)='2005-09-01'
  • 輸出:
    image.png

分析:使用Date()是一個(gè)良好的習(xí)慣,即使你知道相應(yīng)的列只包含日期也是如此。這樣,如果由于某種原因表中以后有日期和時(shí)間值,你的SQL代碼也不用改變。當(dāng)然,也存在一個(gè)Time()函數(shù),在你只想要時(shí)間時(shí)應(yīng)該使用它。

  • 輸入:select * from order where Year(order_date)='2005' and Month(order_date)=9

分析: Year()是一個(gè)從日期(或日期時(shí)間)中返回年份的函數(shù)。類(lèi)似,Month()從日期中返回月份。因此,WHEREYear(order_date)= 2005 AND Month(order_date) = 9檢索出order_date為2005年9月的所有行。

數(shù)值處理函數(shù)

函數(shù) 說(shuō)明
Abs() 返回一個(gè)數(shù)的絕對(duì)值
Cos() 返回一個(gè)角度的余弦
Exp() 返回一個(gè)數(shù)的指數(shù)值
Mod() 返回除操作的余數(shù)
Pi() 返回圓周率
Rand() 返回一個(gè)隨機(jī)數(shù)
Sin() 返回一個(gè)角度的正弦
Sqrt() 返回一個(gè)數(shù)的平方根
Tan() 返回一個(gè)角度的正切
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容