【MySQL】16-超详细的MySQL单行函数汇总
目錄
- 1. MySQL函數簡介
- 1.1 按數據類型分類
- 1.2 按輸入數量分類
- 2. 數值函數
- 2.1 基本函數
- 2.2 角度與弧度互換函數
- 2.3 三角函數
- 2.4 指數與對數
- 2.5 進制間的轉換
- 3. 字符串函數
- 4. 日期類型函數
- 5. 流程控制函數
- 6. 加密解密函數
- 7. MySQL信息函數
- 8. 其他函數
1. MySQL函數簡介
在MySQL中,最重要的函數就是數值函數、字符串函數、日期時間函數和流程控制函數。
不同的DBMS之間的函數絕大部分都是不通用的。如,MySQL和Oracle之間很多函數是不通用的。本章只學習MySQL中的函數。
1.1 按數據類型分類
分為:數值函數、字符串函數、日期時間函數、流程控制函數、加密與解密函數、獲取MySQL信息函數、聚合函數等。
1.2 按輸入數量分類
單進單出稱為單行函數,多進單出稱為多行函數 (或聚合函數) 。如下圖所示:
本章先學習單行函數,其特征為:
- 只對一行進行變換
- 每行返回一個結果
- 可以嵌套
- 參數可以是一列或一個值
2. 數值函數
2.1 基本函數
| ABS(x) | 返回x的絕對值 |
| SIGN(x) | 返回x的符號,正數為1,負數為-1, 0返回0 |
| PI() | 返回圓周率的值 |
| CEIL(x), CEILING(x) | 返回大于或等于某個值的最小整數 |
| FLOOR(x) | 返回小于或等于某個值的最大整數 |
| LEAST(e1, e2, …, en) | 返回列表中的最小值 |
| GREATEST(e1, e2, …, en) | 返回列表中的最大值 |
| MOD(x, y) | 返回x除以y后的余數 |
| RAND() | 返回0~1的隨機值 |
| RAND(x) | 返回0~1的隨機值,x作為隨機種子,相同的x值會產生相同的隨機數 |
| ROUND(x) | 返回一個對x四舍五入后,最接近于x的整數 |
| ROUND(x, y) | 返回一個對x四舍五入后,最接近于x的值,并保留小數點到后面y位 |
| TRUNCATE(x, y) | 返回數字x截斷為y位小數的結果 |
| SQRT(x) | 返回x的平方根,當x為負數時返回NULL |
2.2 角度與弧度互換函數
| RADIANS(x) | 將角度轉換為弧度,其中x為角度值 |
| DEGREES(x) | 將弧度轉換為角度,其中x為弧度值 |
2.3 三角函數
| SIN(x) | 返回x的正弦值,其中x為弧度值 |
| ASIN(x) | 返回x的反正弦值,即獲取正弦值為x的值。若x的值不在-1到1之間,則返回NULL |
| COS(x) | 返回x的余弦值,其中x為弧度值 |
| ACOS(x) | 返回x的反余弦值,即獲取余弦值為x的值。若x的值不在-1到1之間,則返回NULL |
| TAN(x) | 返回x的正切值,其中x為弧度值 |
| ATAN(x) | 返回x的反正切值,即獲取正切值為x的值 |
| ATAN(x, y) | 返回兩個參數的反正切值 |
| COT(x) | 返回x的余切值,其中x為弧度值 |
2.4 指數與對數
| POW(x, y), POWER(x, y) | 返回x的y次方 |
| EXP(x) | 返回 eee 的x次方 |
| LN(x), LOG(x) | 返回以 eee 為底x的對數,當x<=0時, 返回NULL |
| LOG10(x) | 返回以10為底的x的對數,當x<=0時, 返回NULL |
| LOG2(x) | 返回以2為底x的對數,當x<=0時, 返回NULL |
2.5 進制間的轉換
| BIN(x) | 返回x的二進制編碼 |
| HEX(x) | 返回x的十六進制編碼 |
| OCT(x) | 返回x的八進制編碼 |
| CONV(x, f1, f2) | 返回f1進制數變成f2進制數 |
3. 字符串函數
【注意】MySQL中,字符串位置是從1開始的。
| ASCII(s) | 返回字符串s中的第一個字符的ASCII碼值 |
| CHAR_LENGTH(s) | 返回字符串s的字符數,作用與CHARACTER_LENGTH(s)相同 |
| LENGTH(s) | 返回字符串s的字節數,和字符集有關 |
| CONCAT(s1, s2, …, sn) | 連接s1, s2, …, sn為一個字符串 |
| CONCAT_WS(x, s1, s2, …, sn) | 同CONCAT(s1, s2, …, sn)函數,但是每個字符串之間加上x |
| INSERT(str, idx, len, replacestr) | 將字符串str從第idx位置開始,len個字符串長的子串替換成字符串replacestr |
| REPLACE(str, a, b) | 用字符串b替換字符串str中所有字符串a |
| UPPER(s)或UCASE(s) | 將字符串s的所有字母轉換成大寫字母 |
| LOWER(s)或LCASE(s) | 將字符串s的所有字母轉換成小寫字母 |
| LEFT(str, n) | 返回字符串str最左邊的n個字符 |
| RIGHT(str, n) | 返回字符串str最右邊的n個字符 |
| LPAD(str, len, pad) | 用字符串pad對str最左邊進行填充,直到str的長度為len個字符 |
| RPAD(str, len, pad) | 用字符串pad對str最右邊進行填充,直到str的長度為len個字符 |
| LTRIM(s) | 去掉字符串s左側的空格 |
| RTRIM(s) | 去掉字符串s右側的空格 |
| TRIM(s) | 去掉字符串s開頭和結尾的空格 |
| TRIM(s1 FROM S) | 去掉字符串s開頭與結尾的s1 |
| TRIM(LEADING s1 FROM s) | 去掉字符串s左側的s1 |
| TRIM(TRAILING s1 FROM s) | 去掉字符串s右側的s1 |
| REPEAT(str, n) | 返回str重復n次的結果 |
| SPACE(n) | 返回n個空格 |
| STRCMP(s1, s2) | 比較字符串s1和s2的ASCII碼值的大小 |
| SUBSTR(s, index, len) | 返回從字符串s的index位置開始的len個字符。作用與SUBSTRING(s, index, len)、MID(s, index, len)相同 |
| LOCATE(substr, str) | 返回字符串substr在字符串str中首次出現的位置,若沒找到,則返回0 |
| ELT(m, s1, s2, …, sn) | 返回指定位置的字符串,若m=1,則返回s1;若m=2,則返回s2……以此類推 |
| FIELD(s, s1, s2, …, sn) | 返回字符串s在字符串列表中第一次出現的位置 |
| FIND_IN_SET(s1, s2) | 返回字符串s1在字符串s2中出現的位置。其中,s2是一個以逗號分隔的字符串 |
| REVERSE(s) | 返回s反轉后的字符串 |
| NULLIF(value1, value2) | 比較兩個字符串,若value1與value2相等,則返回NULL,否則返回value1 |
4. 日期類型函數
《超詳細的MySQL日期類型函數總結》
5. 流程控制函數
MySQL中的流程處理函數主要包括 IF()、IFNULL() 和 CASE()函數。
| IF(value, value1, value2) | 如果value的值為TRUE,則返回value1,否則返回value2 |
| IFNULL(value1, value2) | 如果value1不為NULL,返回value1,否則返回value2 |
| CASE WHEN 條件1 THEN 結果1 WHEN 條件2 THEN 結果2 … [ELSE result] END | 相當于Java的if…else |
| CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 … [ELSE 值n] END | 相當于Java的switch…case… |
舉個例子:
IF()
SELECT last_name, salary, IF(salary >= 6000, '高工資', '低工資') FROM employees;查詢結果:
IFNULL()
SELECT last_name, commission_pct, IFNULL(commission_pct, 0) FROM employees;查詢結果:
CASE WHEN 條件1 THEN 結果1 WHEN 條件2 THEN 結果2 … [ELSE result] END
SELECT last_name, salary, CASE WHEN salary >= 15000 THEN '人生贏家' WHEN salary >= 10000 THEN '高富帥'WHEN salary >= 8000 THEN '潛力股'ELSE '人民群眾'END AS "describe" FROM employees;查詢結果:
其中,ELSE 可以省略。
【例子1】
查詢部門號為 10,20, 30 的員工信息,
若部門號為 10, 則打印其工資的 1.1 倍,
20 號部門, 則打印其工資的 1.2 倍,
30 號部門,打印其工資的 1.3 倍數,
其他部門,打印其工資的 1.4 倍數。
查詢結果:
【例子2】
查詢部門號為 10,20, 30 的員工信息,
若部門號為 10, 則打印其工資的 1.1 倍,
20 號部門, 則打印其工資的 1.2 倍,
30 號部門打印其工資的 1.3 倍數。
查詢結果:
6. 加密解密函數
加密與解密函數主要用于對數據庫中的數據 (如用戶的登錄密碼、銀行的取款密碼等) 進行加密和解密處理,防止數據被黑客竊取。這些函數在保證數據庫安全時非常有用。
但在實際開發中,用戶密碼的加密已經前移到客戶端就已經完成了。即用戶在客戶端輸入完密碼,點擊登錄之后就已經完成加密操作了。這樣,在網絡傳輸過程中傳輸的是已經加密的密碼信息,黑客就算在網絡傳輸過程截取密碼信息,獲得的也只是加密的暗文,更加安全。因此在數據庫端進行加密解密已經不那么重要了,僅僅是提供一種加密方式的選擇罷了。
| PASSWORD(str) | 返回字符串str的加密版本,41位長的字符串。加密結果不可逆,常用于用戶的密碼加密。在MySQL8.0中被Deprecated。 |
| MD5(str) | 返回字符串str的md5加密后的值。加密結果不可逆,若參數位NULL,則會返回NULL |
| SHA(str) | 從原名文密碼str計算并返回加密后的密碼字符串,當參數為NULL時,返回NULL。加密結果不可逆,SHA加密算法比MD5更加安全。 |
| ENCODE(value, password_seed) | 返回使用password_seed作為加密密碼加密value。在MySQL8.0中被Deprecated。 |
| DECODE(value, password_seed) | 返回使用password_seed作為加密密碼解密value。在MySQL8.0中被Deprecated。 |
ENCODE(value,password_seed) 函數與 DECODE(value,password_seed) 函數互為反函數。
舉個栗子:
SELECT MD5('mysql'), SHA('mysql') FROM DUAL;查詢結果:
7. MySQL信息函數
MySQL中內置了一些可以查詢MySQL信息的函數,這些函數主要用于幫助數據庫開發或運維人員更好地對數據庫進行維護工作。
| VERSION() | 返回當前MySQL的版本號 |
| CONNECTION_ID() | 返回當前MySQL服務器的連接數 |
| DATABASE(), SCHEMA() | 返回MySQL命令行當前所在的數據庫 |
| USER(), CURRENT_USER(), SYSTEM_USER(), SESSION_USER() | 返回當前連接MySQL的用戶名,返回結果格式為“主機名@用戶名” |
| CHARSET(value) | 返回字符串value自變量的字符集 |
| COLLATION(value) | 返回字符串value的比較規則 |
舉個栗子:
SELECT VERSION(), CONNECTION_ID(), DATABASE(), SCHEMA(), USER(), CURRENT_USER(), SYSTEM_USER(), SESSION_USER(), CHARSET('卷'), COLLATION('愛你') FROM DUAL;查詢結果:
8. 其他函數
MySQL中有些函數無法對其進行具體的分類,但是這些函數在MySQL的開發和運維過程中也是不容忽視的。
| FORMAT(value, n) | 返回對數字value進行格式化啊后的結果數據。n表示四舍五入后保留到小數點后n位 |
| CONV(value, from, to) | 將value的值進行不同進制之間的轉換 |
| INET_ATON(ipvalue) | 將以點分隔的IP地址轉化為一個數字 |
| INET_NTOA(value) | 將數字形式的IP地址轉換為以點分隔的IP地址 |
| BENCHMARK(n, expr) | 將表達式expr重復執行n次。用于測試MySQL處理expr表達式所耗費的時間 |
| CONVERT(value USING char_code) | 將value所使用的字符編碼修改為char_code |
舉個例子:
FORMAT(value, n)
SELECT FORMAT(123.125, 2), FORMAT(123.125, 0), FORMAT(123.125, -2) FROM DUAL;查詢結果:
可以看到,如果n的值小于0,只保留整數部分,不會保留到十位、百位這些。
CONV(value, from, to)
SELECT CONV(16, 10, 2), CONV(8888, 10, 16), CONV(NULL, 10, 2) FROM DUAL;查詢結果:
- 第一個字段意思是把數字16從十進制轉換為二進制,后面兩個字段同理。
- 當要轉化的數字為NULL時,運算結果也為NULL。
INET_ATON(ipvalue) 、INET_NTOA(value)
SELECT INET_ATON('192.168.1.200'), INET_NTOA(3232235976) FROM DUAL;查詢結果:
BENCHMARK(n, expr)
SELECT BENCHMARK(9000000, SHA('OceanUniversityOfChina')) FROM DUAL;查詢結果:
CONVERT(value USING char_code)
SELECT CHARSET('OUC'), CHARSET(CONVERT('OUC' USING 'utf8mb4')) FROM DUAL;查詢結果:
總結
以上是生活随笔為你收集整理的【MySQL】16-超详细的MySQL单行函数汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UART串行通信模式
- 下一篇: mysql 启动时,服务无法启动:发生系