目錄
函數的理解:
MySQL的內置函數及分類:
單行函數:
數值函數:
基本函數:
角度與弧度互換函數:
三角函數:
?指數與對數:
進制轉換:
字符串函數:?
日期和時間函數:
獲取日期、時間:
日期與時間戳的轉換:
獲取月份、星期、星期數、天數等函數:
日期的操作函數:
時間和秒鐘轉換函數:
計算日期和時間的函數:
日期的格式化與解析:
?流程控制函數:
加密與解密函數:
信息函數:
其他函數:
函數的理解:
函數在計算機語言的使用中貫穿始終,函數的作用是什么?可以把我們常用的代碼進行封裝,需要時直接調用。這樣不僅提高了代碼的效率,還提高了可維護性。
在SQL種我們也可以使用函數對索引出來的數據進行函數操作。使用這些函數,可以極大地提高用戶對數據庫的管理效率。
從函數定義的角度出發,可將函數分成內置函數和自定義函數。在SQL中,同樣也包括了內置函數和自定義函數。內置函數是系統內置的通用函數,而自定義函數是根據自己的需求編寫的。
在使用SQL語言時,不是直接和這門語言打交道,而是通過使用不同的數據庫軟件。而在實際中,只有很少的函數時被數據庫軟件同時支持的。大部分數據庫軟件都會有自己特定的函數,就意味著采用SQL函數的代碼的可移植性是很差的,因此在使用函數的時候需要特別注意。
MySQL的內置函數及分類:
MySQL提供了豐富的內置函數,這些函數使得數據的維護與管理更加方便,能夠更好地提供數據的分析與統計功能,在一定程度上提高了開發人員進行數據分析與統計的效率。
MySQL提供的內置函數從實現的功能角度可以分為數值函數、字符串函數、日期和時間函數、流程控制函數、加密與解密函數、獲取MySQL信息函數、聚合函數等。
單行函數:
操作數據對象;接收參數返回一個結果;只對一行進行變換;每行返回一個結果;可以嵌套;參數可以是一列或者是一個值。
數值函數:
基本函數:
函數 | 用法 |
ABS(X) | 返回x的絕對值 |
SIGN(X) | 返回x的符號。證書返回1,負數返回-1,0則返回0 |
PI() | 返回圓周率的值 |
CEIL(X),CEILING(X) | 返回大于或者等于某個值的最小整數 |
FLOOR(X) | 返回小于或者等于某個值的最大整數 |
LEAST(e1,e2,e3,...) | 返回列表中的最小值 |
GREATEST(e1,e2,e3,...) | 返回列表中的最大值 |
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 |
SELECT RAND(X),RAND(Y)
FROM DUAL;
如果X=Y那么,產生的隨機數的值時一樣的。
SELECT ROUND(X,Y)
FROM DUAL;
如果Y為正數,那么對小數第幾位后面進行截斷 如果Y為負數,那么對整數部分第幾位進行保留: 比如說TRUNCATE(126.156,-1);如果對整數部分第一位進行截斷保留, 結果為120。
SELECT TRUNCATE(X,Y)
FROM DUAL;
如果Y為正數,那么對小數第幾位后面進行截斷 如果Y為負數,那么對整數部分第幾位進行保留: 比如說TRUNCATE(126.156,-1);如果對整數部分第一位進行截斷保留, 結果為120。
所以可以注意區分以下ROUND(X,Y)和TRUNCATE(X,Y)。
角度與弧度互換函數:
函數 | 用法 |
RADIANS(X) | 將角度轉化為弧度,其中,參數x為角度值 |
DEGREES(X) | 將弧度轉化為角度,其中,參數x為弧度值 |
三角函數:
函數 | 用法 |
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的值 |
ATAN2(X,Y) | 返回兩個參數的反正切值 |
COT(X) | 返回x的余切值,其中,x為弧度值 |
?指數與對數:
函數 | 用法 |
POW(X,Y),POWER(X,Y) | 返回x的y次方 |
EXP(X) | 返回e的x次方,其中e是一個常數 |
LN(X),LOG(X) | 返回以e為底的x的對數,當x |
LOG10(X) | 返回以10為底的x對數,當x |
LOG2(X) | 返回以2為底的x對數,當x |
進制轉換:
函數 | 用法 |
BIN(X) | 返回x的二進制編碼 |
HEX(X) | 返回x的十六進制編碼 |
OCT(X) | 返回x的八進制編碼 |
CONV(X,Y1,Y2) | 返回y1進制數變成y2進制數 |
字符串函數:?
函數 | 用法 |
ASCLL(S) | 返回字符串s中第一個字符的ascll碼值 |
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,...)函數,但是每一個字符串之間要加上x |
INSERT(str,index,len,replacestr) | 將字符串str從第index位置開始,len個字符長的子串替換為字符串replacestr(索引是從1開始的) |
REPLACE(str,a,b) | 用字符串b替換字符串str中所有出現的字符串a |
UPPER(S)或UCASE(S) | 將字符串s的所有字母轉成大寫字母 |
LOWER(S)或LCASE(S) | 將字符串s的所有字母轉成小寫字母 |
LEFT(str,n) | 返回字符串str最左邊的n個字符,如果n大于str的字符數,就全取 |
RIGHT(str,n) | 返回字符串str最右邊的n個字符,如果n大于str的字符數,就全取 |
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次的結果 |
SAPCE(n) | 返回n個空格 |
STRCMP(s1,s2) | 比較字符串s1,s2的ascll碼值的大小 |
SUBSTR(s,index,len) | 返回從字符串s的index位置其len個字符,作用與SUBSTRING(s,n,len)、MID(s,n,len)相同 |
LOCATE(substr,str) | 返回從字符串substr在字符串str中首次出現的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0 |
ELT(m,s1,s2,...,sn) | 返回指定位置的字符串,如果m=1,則返回s1,如果m=2,則返回s2,如果m=n,則返回sn |
FIELD(s,s1,s2,...,sn) | 返回字符串s在字符串列表中第一次出現的位置 |
FIND_IN_SET(s1,s2) | 返回字符串s1在字符串s2中首次出現的位置。其中,字符串s2是一個以逗號分隔的字符串 |
REVERSE(S) | 返回s反轉后的字符串 |
NULLIF(value1,value2) | 比較兩個字符串,如果value1與value2相等,則返回NULL,否則返回value1 |
日期和時間函數:
獲取日期、時間:
函數 | 用法 |
CURDATE()、CURRENT_DATE() | 返回當前日期,只包含年、月、日 |
CURTIME()、CURRENT_TIME() | 返回當前時間,只包含時、分、秒 |
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/LOCALTIME()/LOCALTIMESTAMP() | 返回當前系統日期和時間 |
UTC_DATE() | 返回UTC(世界標準時間)日期 |
UTC_TIME() | 返回UTC(世界標準時間)時間 |
日期與時間戳的轉換:
函數 | 用法 |
UNIX_TIMESTAMP() | 以UNIX時間戳的形式返回當前時間 |
UNIX_TIMESTAMP(date) | 將時間date以UNIX時間戳的形式返回 |
FROM_UNIXTIME(timestamp) | 將UNIX時間戳的時間轉換為普通格式的時間 |
獲取月份、星期、星期數、天數等函數:
函數 | 用法 |
YEAR(date)/MONTH(date)/DAY(date) | 返回具體的日期值 |
HOUR(time)/MINUTE(time)/SECOND(time) | 返回具體的時間值 |
MONTHNAME(date) | 返回月份 |
DAYNAME(date) | 返回星期幾 |
WEEKDAY(date) | 返回周幾,周一是0,周二是1,...周日是6 |
QUARTER(date) | 返回日期對應的季度,范圍為1~4 |
WEEK(data),WEEKOFYEAR(date) | 返回一年中的第幾周 |
DAYOFYEAR(date) | 返回日期是一年中的第幾天 |
DAYOFMONTH(date) | 返回日期位于所在月份的第幾天 |
DAYOFWEEK(date) | 返回周幾,注意:周日是1,周一是2,...周六是7 |
日期的操作函數:
函數 | 用法 |
EXTRACT(type FROM date) | 返回指定日期中特定的部分,type指定返回的值 |
?type的含義:
type的取值 | 含義 |
MICROSECOND | 返回毫秒數 |
SECOND | 返回秒數 |
MINUTE | 返回分鐘數 |
HOUR | 返回小時數 |
DAY | 返回天數 |
WEEK | 返回日期在一年中的第幾個星期 |
MONTH | 返回日期在一年中的第幾個月 |
QUARTER | 返回日期在一年中的第幾個季度 |
YEAR | 返回日期的年份 |
SECOND_MICROSECOND | 返回秒和毫秒值 |
MINUTE_MICROSECOND | 返回分鐘和毫秒值 |
MINUTE_SECOND | 返回分鐘和秒值 |
HOUR_MICROSECOND | 返回小時和毫秒值 |
HOUR_SECOND | 返回小時和秒值 |
HOUR_MINUTE | 返回小時和分鐘值 |
DAY_MICROSECOND | 返回天和毫秒值 |
DAY_SECOND | 返回天和秒值 |
DAY_MINUTE | 返回天和分鐘值 |
DAY_HOUR | 返回天和小時 |
YEAR_MONTH | 返回年和月 |
時間和秒鐘轉換函數:
函數 | 用法 |
TIME_TO_SEC(time) | 將time轉化為秒并返回結果值。轉化的公式為:小時*3600+分鐘*60+秒 |
SEC_TO_TIME(seconds) | 將second描述轉化為包含小時、分鐘和秒時間 |
計算日期和時間的函數:
函數 | 用法 |
DATE_ADD(datetime,INTERVAL expr type),ADDDATE(date,INTERVAL expr type) | 返回與給定日期時間相差INTERVAL時間段的日期時間 |
DATE_SUB(date,INTERVAL expr type),SUBDATE(date,INTERVAL expr type) | 返回與date相差INTERVAL時間間隔的日期 |
?type的含義:
間隔類型 | 含義 |
HOUR | 小時 |
MINUTE | 分鐘 |
SECOND | 秒 |
TEAR | 年 |
MONTH | 月 |
DAY | 日 |
YEAR_MONTH | 年和月 |
DAY_HOUR | 日和小時 |
DAY_MINUTE | 日和分鐘 |
DAY_DECOND | 日和秒 |
HOUR_MINUTE | 小時和分鐘 |
HOUR_SECOND | 小時和秒 |
MINUTE_SECOND | 分鐘和秒 |
?
函數 | 用法 |
ADDTIME(time1,time2) | 返回time1加上time2的時間,當time2為一個數字時,代表的是秒,可以為負數 |
SUBTIME(time1,time2) | 返回time1減去time2后的時間,當time2為一個數字時,代表的時秒,可以為負數 |
DATEDIFF(date1,date2) | 返回date1-date2的日期間隔天數 |
TIMEDIFF(time1,time2) | 返回time1-time2的時間間隔 |
FROM_DAYS(N) | 返回從0000年1月1日起,n天以后的日期 |
TO_DAYS(date) | 返回日期date距離0000年1月1日的天數 |
LAST_DAY(date) | 返回date所在月份的最后一天的日期 |
MAKEDATE(year,n) | 針對給定年份與所在年份中的天數返回一個日期 |
MAKETIME(hour,minute,second) | 將給定的小時、分鐘和秒組合成時間并返回 |
PERIOD_ADD(time,n) | 返回time加上n后的時間 |
日期的格式化與解析:
格式化:將日期轉化為字符串
解析:將字符串轉化為日期
函數 | 用法 |
DATE_FORMAT(date,fmt) | 按照字符串fmt格式化日期date值 |
TIME_FORMAT(time,fmt) | 按照字符串fmt格式化時間time值 |
GET_FORMAT(date_type,format_type) | 返回日期字符串的顯示格式 |
STR_TO_DATE(str,fmt) | 按照字符串fmt對str進行解析,解析為一個日期 |
?GET_FORMAT()函數中的fmt參數常用的格式符:
格式符 | 說明 | 格式符 | 說明 |
%Y | 4位數表示年份 | %y | 表示兩位數字表示年份 |
%M | 月名表示月份(January) | %m | 兩位數字表示月份(01,02,03,...) |
%b | 縮寫的月名(Jan,Feb,...) | %c | 數字表示月份(1,2,3,...) |
%D | 英文后綴表示月中的天數(1st,2nd,3rd,...) | %d | 兩位數字表示月中的天數(01,02,...) |
%e | 數字形式表示月中的天數 | ||
%H | 兩位數字表示小數,24小時制(01,02,...) | %h和%I | 兩位數字表示小時,12小時制(01,02,...) |
%k | 數字形式的小時,24小時制(1,2,3) | %l | 數字形式表示小時,12小時制(1,2,3,4,...) |
%i | 兩位數字表示分鐘(00,01,02) | %S和%s | 兩位數字表示秒(00,01,02,...) |
%W | 一周中的星期名稱(Sunday,...) | %a | 一周中的星期縮寫(Sun,Mon,Tues,...) |
%w | 以數字表示周中的天數(0=Sundat,1=Monday) | ||
%j | 以3為數字表示年中的天數(001,002,003,...) | %U | 以數字表示年中的第幾周(1,2,3,...),其中Sunday為周中第一天 |
%u | 以數字表示年中的第幾周(1,2,3,...)其中Monday為周中第一天 | ||
%T | 24小時制 | %r | 12小時制 |
%p | AM或PM | %% | 表示% |
?GET_FORMAT函數中date_type和format_type參數取值:
日期類型 | 格式化類型 | 返回的格式化字符串 |
DATE | USA | %m.%d.%Y |
DATE | JIS | %Y-%m-%d |
DATE | ISO | %Y-%m-%d |
DATE | EUR | %d.%m.%Y |
DATE | INTERNAL | %Y%m%d |
TIME | USA | %h:%i:%s%p |
TIME | JIS | %H:%i:%s |
TIME | ISO | %H:%i:%s |
TIME | EUR | %H.%i.%s |
TIME | INTERNAL | %H%i%s |
DATETIME | USA | %Y-%m-%d %H.%i.%s |
DATETIME | JIS | %Y-%m-%d %H:%i:%s |
DATETIME | ISO | %Y-%m-%d %H:%i:%s |
DATETIME | EUR | %Y-%m-%d %H.%i.%s |
DATETIME | INTERNAL | %Y%m%d%H%i%s |
?流程控制函數:
流程處理函數可以根據不同的條件,執行不同的處理流程,可以在SQL語句中實現不同的條件選擇。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 return] END | 相當于C++的if...else if...else... |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 ... [ELSE 值n] END | 相當于C++的switch...case... |
SELECT 字段,IF(條件,'value1','value2')
FROM 表名;
IFNULL()可以看成IF()的特殊情況。
SELECT 字段,IF(字段 IS NOT NULL,value1,value2)
SELECT 字段,IFNULL(value1,value2)
SELECT 字段1,字段2,CASE WHEN 條件1 THEN
WHEN 條件2 THEN
[ELSE 返回值] END
FROM 表名;
SELECT 字段1,字段2,CASE 判斷的字段
WHEN 值1 THEN
WHEN 值2 THEN
[ELSE 值n] END
FROM 表名;
加密與解密函數:
加密與解密函數主要用于對數據庫中的數據進行加密和解密處理,以防止數據被他人竊取。這些函數在保證數據庫安全時非常有用。
函數 | 用法 |
PASSWORD(str) | 返回字符串str的加密版本,41為長的字符串。加密結果不可逆,常用于用戶的密碼加密 |
MD5(str) | 返回字符串str的md5加密后的值,也是一種加密方式。若參數為NULL,則會返回NULL |
SHA(str) | 從原明文密碼str計算并返回加密后的密碼字符串,當參數為NULL時,返回NULL。SHA加密算法比MD5更安全 |
ENCODE(value,password_seed) | 返回使用password_seed作為加密密碼加密value |
DECODE(value,password_seed) | 返回使用password_seed作為加密密碼解密value |
SELECT PASSWORD(str)
FROM DUAL;
?PASSWORD在MySQL8.0中不支持使用
SELECT MD5(str)
FROM DUAL;
SELECT SHA(str)
FROM DUAL;
?明文轉化為暗文之后,不能再轉化為明文。是不可逆的。
在MySQL中,?MD5和SHA加密函數都是不可逆的?,兩者均屬于單向哈希算法,無法從哈希值反推出原始數據。?
MD5函數?:
生成128位(32字符)的哈希值,基于單向哈希原理,輸入數據的微小變化會導致輸出完全不同。?設計初衷是確保數據完整性,但存在已知安全漏洞(如碰撞攻擊),不推薦用于高安全性場景。
SHA函數?:
包含多種變體(如SHA-1、SHA-256),生成更長的哈希值(如SHA-256為256位),同樣具有不可逆性。?相較于MD5,SHA系列算法更安全,抗碰撞能力更強,建議優先使用SHA-256或更高版本。?
SELECT ENCODE(value,password_seed)
FROM DUAL;
與
SELECT DECODE(value,password_seed)
FROM DUAL;
ENCODE(value,password_seed)與DECODE(value,password_seed)在MySQL8.0中不支持使用
信息函數:
?MySQL中內置了一些可以查詢的MySQL信息的函數,這些函數主要用于幫助數據庫開發或者運維人員更好地對數據庫進行維護工作。
函數 | 用法 |
VERSION() | 返回當前MySQL的版本號 |
CONNECTION_ID() | 返回當前MySQL服務器的連接數 |
DATABASE(),SCHEMA() | 返回MySQL命令行當前所在的數據庫 |
USER(),CURRENT()_USER(),SYSTEM_USER(),SESSION_USER() | 返回當前連接MySQL的用戶名,返回結果格式為“主機名@用戶名” |
CHARSET(value) | 返回字符串value自變量的字符集 |
COLLATION(value) | 返回字符串value的比較規則 |
其他函數:
函數 | 用法 |
FORMAT(value,n) | 返回對數字value進行格式化后的結果數據。n表示四舍五入后保留到小數點后第n位,如果n的值小于或者等于0,則只保留整數部分 |
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 |