數(shù)學(xué)函數(shù)
MySQL Math函數(shù)及其描述如下:
| 名稱 | 描述 |
|---|---|
| ABS(n) | 返回?cái)?shù)字n的絕對值 |
| CEIL(n) | 向上取整,即返回大于或等于輸入數(shù)字(n)的最小整數(shù)值 |
| FLOOR(x) | 向下取整,即返回取不大于x的最大整數(shù) |
| MOD(n,m) | 返回n 除以 m 的余數(shù) |
| ROUND(n) | 將數(shù)字四舍五入到指定的小數(shù)位數(shù) |
| TRUNCATE(x,y) | 返回?cái)?shù)字x截短為y位小數(shù)的結(jié)果 |
| ACOS(n) | 返回n的反余弦值;如果n不在-1和1范圍內(nèi),則返回null |
| ASIN(n) | 返回n的反正弦值,n是正弦值為n的值。如果n不在-1到1的范圍內(nèi),則返回null |
| ATAN(n) | 返回n的反正切 |
| ATAN2(n,m),ATAN(m,n) | 返回兩個(gè)變量n和m的反正切 |
| CONV(n,from_base,to_base) | 在不同的數(shù)字基數(shù)之間轉(zhuǎn)換數(shù)字 |
| COS(n) | 返回n的余弦,其中n以弧度為單位 |
| COT(n) | 返回n的余切 |
| CRC32(n) | 計(jì)算循環(huán)冗余校驗(yàn)值并返回32位無符號值 |
| DEGREES(n) | 將弧度轉(zhuǎn)換為參數(shù)n的度 |
| EXP(n) | 此函數(shù)返回e(自然對數(shù)的底)到n次方的值 |
| LN(n) | 返回n的自然對數(shù) |
| LOG(m,n) / log(n) | 返回單個(gè)參數(shù)版本將返回X的自然對數(shù),如果調(diào)用兩個(gè)參數(shù),它返回以m為底n的對數(shù) |
| LOG10(n) | 返回參數(shù)n的以10為底的對數(shù) |
| LOG2(n) | 返回參數(shù)n的以2為底的對數(shù) |
| PI() | 返回PI的值 |
| POW(x,y) | 函數(shù)用于計(jì)算 x 的 y 次方 |
| POWER(x,y) | 返回函數(shù)用于計(jì)算 x 的 y 次方 |
| RADIANS(n) | 返回參數(shù)轉(zhuǎn)換為弧度 |
| RAND() | 返回一個(gè)隨機(jī)浮點(diǎn)值 |
| SIGN(n) | 根據(jù)n是負(fù)數(shù),零還是正數(shù),返回可以為-1、0或1的n的符號 |
| SIN(n) | 返回n的正弦 |
| SQRT(n) | 返回n的平方根 |
| tan(n) | 返回n的切線 |
聚合函數(shù)
聚合函數(shù)對多個(gè)值執(zhí)行計(jì)算并返回單個(gè)值。
例如,可以使用AVG()采用多個(gè)數(shù)字并返回?cái)?shù)字平均值的合計(jì)函數(shù)。
下面說明了聚合函數(shù)的語法:
function_name(DISTINCT | ALL expression)
使用以下語法:
- 首先,指定聚合函數(shù)的名稱,例如
AVG()。請參閱以下部分中的聚合函數(shù)列表。 - 其次,如果要基于不同的值進(jìn)行計(jì)算前面加
DISTINCT,或者ALL要計(jì)算所有值(包括重復(fù)項(xiàng))。默認(rèn)值為ALL。 - 第三,expression可以是列的表達(dá)式,也可以是涉及列和算術(shù)運(yùn)算符的表達(dá)式。
聚合函數(shù)通常與GROUP BY子句一起使用,來計(jì)算每個(gè)組的聚合值,例如,可以按組的計(jì)算平均值或每個(gè)組中值的總和。
MySQL支持以下聚合函數(shù):
| 匯總功能 | 描述 |
|---|---|
| AVG() | 返回非空值的平均值 |
| BIT_AND() | 按位返回AND |
| BIT_OR() | 按位返回OR |
| BIT_XOR() | 返回按位異或 |
| COUNT() | 返回組中的行數(shù),包括具有NULL值的行 |
| GROUP_CONCAT() | 返回一個(gè)串聯(lián)的字符串 |
| JSON_ARRAYAGG() | 將結(jié)果集作為單個(gè)JSON數(shù)組返回 |
| JSON_OBJECTAGG() | 返回結(jié)果集作為單個(gè)JSON對象 |
| MAX() | 返回一組非NULL值中的最大值(最大值) |
| MIN() | 返回一組非NULL值中的最小值(最小值) |
| STDEV() | 返回總體標(biāo)準(zhǔn)偏差 |
| STDDEV_POP() | 返回總體標(biāo)準(zhǔn)偏差 |
| STDDEV_SAMP() | 返回樣品標(biāo)準(zhǔn)偏差 |
| SUM() | 返回一組所有非NULL值的總和 |
| VAR_POP() | 返回總體標(biāo)準(zhǔn)方差 |
| VARP_SAM() | 返回樣本方差 |
| VARIANCE() | 返回總體標(biāo)準(zhǔn)方差 |
這里以AVG舉例,其他函數(shù)類似。
AVG()函數(shù)計(jì)算一組值的平均值。它在計(jì)算中會忽略NULL。
AVG(expression)
例如,可以使用此AVG函數(shù)products通過使用以下查詢來計(jì)算表中所有產(chǎn)品的平均購買價(jià)格:
SELECT
AVG(buyPrice) average_buy_price
FROM
products;
以下示例使用該AVG()函數(shù)來計(jì)算每個(gè)產(chǎn)品線的平均購買價(jià)格:
SELECT
productLine,
AVG(buyPrice)
FROM
products
GROUP BY productLine
ORDER BY productLine;
字符串函數(shù)
| 名稱 | 描述 |
|---|---|
| CONCAT | 將兩個(gè)或多個(gè)字符串連接成一個(gè)字符串 |
| INSTR | 返回子字符串在字符串中首次出現(xiàn)的位置 |
| LENGTH | 獲取字符串的長度(以字節(jié)和字符為單位) |
| LOWER | 將字符串轉(zhuǎn)換為小寫 |
| UPPER | 將字符串轉(zhuǎn)換為大寫 |
| REPLACE | 搜索并替換字符串中的子字符串 |
| LEFT | 從字符串中獲取指定數(shù)量的最左邊字符 |
| RIGHT | 從字符串中獲取指定數(shù)量的最右邊的字符 |
| TRIM | 從字符串中刪除不需要的字符 |
| RTRIM | 從字符串中刪除所有尾隨空格 |
| LTRIM | 從字符串中刪除所有前導(dǎo)空格 |
| SUBSTRING | 從具有特定長度的位置開始提取子字符串。 |
| SUBSTRING_INDEX | 在指定的定界符出現(xiàn)之前從字符串中返回一個(gè)子字符串 |
| FIND_IN_SET | 在以逗號分隔的字符串列表中查找字符串 |
| FORMAT | 格式化具有特定語言環(huán)境的數(shù)字,四舍五入到小數(shù)位數(shù) |
日期和時(shí)間函數(shù)
| 函數(shù)名稱 | 描述 | 示例 |
|---|---|---|
| CURDATE() CURRENT_DATE() |
返回當(dāng)前的日期 | |
| CURTIME() CURRENT_TIME() |
返回當(dāng)前的時(shí)間 | |
| DATE_ADD(date,INTERVAL int keyword) | 返回日期date加上間隔時(shí)間int的結(jié)果(int必須按照關(guān)鍵字進(jìn)行格式化) | SELECT DATE_ADD ( CURRENT_DATE ,INTERVAL 6 MONTH); |
| DATE_FORMAT(date,fmt) | 依照指定的fmt格式格式化日期date值 | 計(jì)算年齡:SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee; |
| DATE_SUB(date,INTERVAL int keyword) | 返回日期date加上間隔時(shí)間int的結(jié)果(int必須按照關(guān)鍵字進(jìn)行格化) | SELECT DATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH); |
| DAYOFWEEK(date) | 返回date所代表的一星期中的第幾天(1~7) | |
| DAYOFMONTH(date) | 返回date是一個(gè)月的第幾天(1~31) | |
| DAYOFYEAR(date) | 返回date是一年的第幾天(1~366) | |
| DAYNAME(date) | 返回date的星期名 | SELECT DAYNAME(CURRENT_DATE); |
| FROM_UNIXTIME(ts,fmt) | 根據(jù)指定的fmt格式,格式化UNIX時(shí)間戳ts | SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()); |
| HOUR(time) | 返回time的小時(shí)值(0~23) | |
| MINUTE(time) | 返回time的分鐘值(0~59) | |
| MONTH(date) | 返回date的月份值(1~12) | |
| MONTHNAME(date) | 返回date的月份名 | SELECT MONTHNAME(CURRENT_DATE); |
| NOW() | 返回當(dāng)前的日期和時(shí)間 | |
| QUARTER(date) | 返回date在一年中的季度(1~4) | SELECT QUARTER(CURRENT_DATE); |
| WEEK(date) | 返回日期date為一年中第幾周(0~53) | |
| YEAR(date) | 返回日期date的年份(1000~9999) |
控制流函數(shù)
控制流函數(shù)是用來進(jìn)行條件操作的,這些函數(shù)可以實(shí)現(xiàn)SQL的條件邏輯,允許開發(fā)者將一些應(yīng)用程序業(yè)務(wù)邏輯轉(zhuǎn)換到數(shù)據(jù)庫后臺。
MySQL控制流函數(shù):
| 格式 | 描述 | 示例 |
|---|---|---|
| CASE WHEN [conditional test 1] THEN [result 1] WHEN [conditional test 2] THEN [result 2] ELSE [default result] END | 如果testN是真,則返回resultN,否則返回default | |
| CASE [test] WHEN[val1] THEN [result]...ELSE [default]END | 如果test和valN相等,則返回resultN,否則返回default | |
| IF(test,t,f) | 如果test是真,返回t;否則返回f | SELECT IF( 1<10,2,3 ) , IF(56>100, 'true', 'false' ); |
| IFNULL(arg1,arg2) | 如果arg1不是空,返回arg1,否則返回arg2 | SELECT IFNULL(1,2), IFNULL(NULL,10) ,IFNULL(4*NULL,'false'); |
| NULLIF(arg1,arg2) | 如果arg1=arg2返回NULL;否則返回arg1 | SELECT NULLIF(1,1),NULLIF('A','B'),NULLIF(2+3,4+1); |
CASE函數(shù)的格式有些復(fù)雜,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END
CASE函數(shù)還有另外一種句法,有時(shí)使用起來非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END
格式化函數(shù)
| 函數(shù)名稱 | 描述說明 |
|---|---|
| DATE_FORMAT(date,fmt) | 依照字符串fmt格式化日期date值 |
| FORMAT(x,y) | 把x格式化為以逗號隔開的數(shù)字序列,y是結(jié)果的小數(shù)位數(shù) |
| INET_ATON(ip) | 返回IP地址的數(shù)字表示 |
| INET_NTOA(num) | 返回?cái)?shù)字所代表的IP地址 |
| TIME_FORMAT(time,fmt) | 依照字符串fmt格式化時(shí)間time值 |
其中最簡單的是FORMAT()函數(shù),它可以把大的數(shù)值格式化為以逗號間隔的易讀的序列。
示例:
SELECT FORMAT(34234.34323432,3);
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
SELECT DATE_FORMAT(NOW(),'%h:%i %p');
SELECT INET_ATON('10.122.89.47');
SELECT INET_NTOA(175790383);
類型轉(zhuǎn)化函數(shù)
為了進(jìn)行數(shù)據(jù)類型轉(zhuǎn)化,MySQL提供了CAST()函數(shù),它可以把一個(gè)值轉(zhuǎn)化為指定的數(shù)據(jù)類型。類型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
其他函數(shù)
| 函數(shù)名稱 | 描述說明 | 示例 |
|---|---|---|
| DATABASE() | 返回當(dāng)前數(shù)據(jù)庫名 | SELECT DATABASE(),VERSION(),USER(); |
| BENCHMARK(count,expr) | 將表達(dá)式expr重復(fù)運(yùn)行count次 | SELECT BENCHMARK(9999999,LOG(RAND()PI()));#該例中,計(jì)算LOG(RAND()PI())表達(dá)式9999999次 |
| CONNECTION_ID() | 返回當(dāng)前客戶的連接ID | SELECT CONNECTION_ID(); |
| FOUND_ROWS() | 返回最后一個(gè)SELECT查詢進(jìn)行檢索的總行數(shù) | SELECT FOUND_ROWS(); |
| USER()或SYSTEM_USER() | 返回當(dāng)前登陸用戶名 | SELECT USER(); |
| VERSION() | 返回MySQL服務(wù)器的版本 | SELECT VERSION(); |
| AES_ENCRYPT(str,key) | 返回用密鑰key對字符串str利用高級加密標(biāo)準(zhǔn)算法加密后的結(jié)果,調(diào)用AES_ENCRYPT的結(jié)果是一個(gè)二進(jìn)制字符串,以BLOB類型存儲 | SELECT AES_ENCRYPT('root','key'); |
| AES_DECRYPT(str,key) | 返回用密鑰key對字符串str利用高級加密標(biāo)準(zhǔn)算法解密后的結(jié)果 | SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key'); |
| DECODE(str,key) | 使用key作為密鑰解密加密字符串str | SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起 |
| ENCRYPT(str,salt) | 使用UNIXcrypt()函數(shù),用關(guān)鍵詞salt(一個(gè)可以惟一確定口令的字符串,就像鑰匙一樣)加密字符串str | SELECT ENCRYPT('root','salt'); |
| ENCODE(str,key) | 返回編碼后結(jié)果 | SELECT ENCODE('xufeng','key'); |
| MD5() | 計(jì)算字符串str的MD5校驗(yàn)和 | SELECT MD5('123456'); |
| PASSWORD(str) | 返回字符串str的加密版本,這個(gè)加密過程是不可逆轉(zhuǎn)的,和UNIX密碼加密過程使用不同的算法。 | PASSWORDSHA('123456'); |
| SHA() | 計(jì)算字符串str的安全散列算法(SHA)校驗(yàn)和 | SELECT SHA('123456'); |