同大多數(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è)角度的正切 |

