同大多數(shù)計(jì)算機(jī)語言一樣核偿,SQL支持利用函數(shù)來處理數(shù)據(jù)壹士。函數(shù)一般是在數(shù)據(jù)上執(zhí)行的筑公,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便颓鲜。
注意點(diǎn):
函數(shù)沒有SQL的可移植性強(qiáng) 能運(yùn)行在多個系統(tǒng)上的代碼稱為可移植的(portable)一铅。相對來說陕贮,多數(shù)SQL語句是可移植的,在SQL實(shí)現(xiàn)之間有差異時(shí)潘飘,這些差異通常不那么難處理肮之。而函數(shù)的可移植性卻不強(qiáng)。幾乎每種主要的DBMS的實(shí)現(xiàn)都支持其他實(shí)現(xiàn)不支持的函數(shù)卜录,而且有時(shí)差異還很大戈擒。 為了代碼的可移植,許多SQL程序員不贊成使用特殊實(shí)現(xiàn)的功能艰毒。雖然這樣做很有好處筐高,但不總是利于應(yīng)用程序的性能。如果不使用這些函數(shù)现喳,編寫某些應(yīng)用程序代碼會很艱難凯傲。必須利用其他方法來實(shí)現(xiàn)DBMS非常有效地完成的工作。 如果你決定使用函數(shù)嗦篱,應(yīng)該保證做好代碼注釋冰单,以便以后你(或其他人)能確切地知道所編寫SQL代碼的含義。
使用函數(shù)
文本處理函數(shù)
-
Upper()函數(shù) 將文本轉(zhuǎn)換為大寫
輸入:SELECT UPPER('aaa')
輸出:
image.png
常用的文本處理函數(shù)
函數(shù) | 說明 | 舉例 |
---|---|---|
left(str,num) | 返回錯左邊的字符 | SELECT LEFT('AABBCCDD',2) |
length() | 返回串的長度 | SELECT LENGTH('AABBCCDDEEFFGG') |
locate() | 返回串的子串 | select LOCATE('aa','AABBccaa',2) |
lower() | 將串轉(zhuǎn)換為小寫 | SELECT LOWER('AABBCCDD') |
UPPER() | 將串轉(zhuǎn)換為大寫 | SELECT UPPER('aaa') |
LTRim() | 去掉串左邊的空格 | |
RTrim() | 去掉串右邊的空格 | |
Trim() | 去掉串兩邊的空格 |
日期和時(shí)間處理函數(shù)
函數(shù) | 說明 | 舉例 |
---|---|---|
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() | 返回一個日期的天數(shù)部分 | select DAY('2023-08-07 00:00:00') |
DayOfWeek() | 對于一個日期灸促,返回對應(yīng)的星期幾 | |
Month() | 返回一個日期的月份部分 | |
Hour() | 返回一個時(shí)間的小時(shí)部分 | |
Minute() | 返回一個時(shí)間的分鐘部分 | |
Second() | 返回一個時(shí)間的秒部分 | |
DateDiff() | 計(jì)算兩個日期之差 | 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() | 返回一個日期時(shí)間的時(shí)間部分 | |
Year() | 返回一個日期的年份部分 |
舉例:
- 輸入:select * from order where order_date='2005-09-01'
-
輸出:image.png
分析: 使用WHERE order_date = '2005-09-01'可靠嗎诫欠?order_ date的數(shù)據(jù)類型為datetime涵卵。這種類型存儲日期及時(shí)間值。樣例表中的值全都具有時(shí)間值00:00:00荒叼,但實(shí)際中很可能并不總是這樣轿偎。如果用當(dāng)前日期和時(shí)間存儲訂單日期(因此你不僅知道訂單日期,還知道下訂單當(dāng)天的時(shí)間)被廓,怎么辦坏晦?比如,存儲的order_date值為
2005-09-01 11:30:05嫁乘,則WHERE order_date = '2005-09-01'失敗昆婿。即使給出具有該日期的一行,也不會把它檢索出來蜓斧,因?yàn)閃HERE匹配失敗仓蛆。解決辦法是指示MySQL僅將給出的日期與列中的日期部分進(jìn)行比較,而不是將給出的日期與整個列值進(jìn)行比較挎春。為此看疙,必須使用Date()函數(shù)
- 輸入:select * from order where date(order_date)='2005-09-01'
-
輸出:image.png
分析:使用Date()是一個良好的習(xí)慣,即使你知道相應(yīng)的列只包含日期也是如此直奋。這樣能庆,如果由于某種原因表中以后有日期和時(shí)間值,你的SQL代碼也不用改變帮碰。當(dāng)然相味,也存在一個Time()函數(shù)拾积,在你只想要時(shí)間時(shí)應(yīng)該使用它殉挽。
- 輸入:select * from order where Year(order_date)='2005' and Month(order_date)=9
分析: Year()是一個從日期(或日期時(shí)間)中返回年份的函數(shù)。類似拓巧,Month()從日期中返回月份斯碌。因此,WHEREYear(order_date)= 2005 AND Month(order_date) = 9檢索出order_date為2005年9月的所有行肛度。
數(shù)值處理函數(shù)
函數(shù) | 說明 |
---|---|
Abs() | 返回一個數(shù)的絕對值 |
Cos() | 返回一個角度的余弦 |
Exp() | 返回一個數(shù)的指數(shù)值 |
Mod() | 返回除操作的余數(shù) |
Pi() | 返回圓周率 |
Rand() | 返回一個隨機(jī)數(shù) |
Sin() | 返回一個角度的正弦 |
Sqrt() | 返回一個數(shù)的平方根 |
Tan() | 返回一個角度的正切 |