Mysql提供的函數是在是太多了, 很多我都見過, 別說用了. 園子裡面, 有人弄了一個比較全的. MYSQL函數 我這裡會將他寫的完全拷貝下來, 中間會插入一些自己項目中使用過的心得 一、數學函數 數學函數, 說實話, 我暫時還真沒怎麼用過, 就是在系統中做統計的時候, 也沒用過. 能在程式中處理 ...
Mysql提供的函數是在是太多了, 很多我都見過, 別說用了. 園子裡面, 有人弄了一個比較全的. MYSQL函數
我這裡會將他寫的完全拷貝下來, 中間會插入一些自己項目中使用過的心得
一、數學函數
數學函數, 說實話, 我暫時還真沒怎麼用過, 就是在系統中做統計的時候, 也沒用過. 能在程式中處理的, 我都放到程式中處理了. 資料庫, 主要還是負責讀寫數據.
數學函數主要用於處理數字,包括整型、浮點數等。
函數 | 作用 |
ABS(x) |
返回x的絕對值 SELECT ABS(-1) -- 返回1 |
CEIL(x) CEILING(x) |
返回大於或等於x的最小整數 SELECT CEIL(1.5) -- 返回2 |
FLOOR(x) |
返回小於或等於x的最大整數 SELECT FLOOR(1.5) -- 返回1 |
RAND() |
返回0->1的隨機數 SELECT RAND() --0.93099315644334 |
RAND(x) |
返回0->1的隨機數,x值相同時返回的隨機數相同 SELECT RAND(2) --1.5865798029924 |
SIGN(x) |
返回x的符號,x是負數、0、正數分別返回-1、0和1 SELECT SIGN(-10) -- (-1) |
PI() |
返回圓周率(3.141593) SELECT PI() --3.141593 |
TRUNCATE(x,y) |
返回數值x保留到小數點後y位的值(與ROUND最大的區別是不會進行四捨五入) SELECT TRUNCATE(1.23456,3) -- 1.234 |
ROUND(x) | 返回離x最近的整數 SELECT ROUND(1.23456) --1 |
ROUND(x,y) |
保留x小數點後y位的值,但截斷時要進行四捨五入 SELECT ROUND(1.23456,3) -- 1.235 |
POW(x,y) POWER(x,y) |
返回x的y次方 SELECT POW(2,3) -- 8 |
SQRT(x) |
返回x的平方根 SELECT SQRT(25) -- 5 |
EXP(x) |
返回e的x次方 SELECT EXP(3) -- 20.085536923188 |
MOD(x,y) |
返回x除以y以後的餘數 SELECT MOD(5,2) -- 1 |
LOG(x) |
返回自然對數(以e為底的對數) SELECT LOG(20.085536923188) -- 3 |
LOG10(x) |
返回以10為底的對數 SELECT LOG10(100) -- 2 |
RADIANS(x) |
將角度轉換為弧度 SELECT RADIANS(180) -- 3.1415926535898 |
DEGREES(x) |
將弧度轉換為角度 SELECT DEGREES(3.1415926535898) -- 180 |
SIN(x) |
求正弦值(參數是弧度) SELECT SIN(RADIANS(30)) -- 0.5 |
ASIN(x) | 求反正弦值(參數是弧度) |
COS(x) | 求餘弦值(參數是弧度) |
ACOS(x) | 求反餘弦值(參數是弧度) |
TAN(x) | 求正切值(參數是弧度) |
ATAN(x) ATAN2(x) |
求反正切值(參數是弧度) |
COT(x) | 求餘切值(參數是弧度) |
二、字元串函數
字元串函數, 在程式中, 使用的比較多. 我用的比較多的, 會用紅色標記出來.
字元串函數是MySQL中最常用的一類函數,字元串函數主要用於處理表中的字元串。
函數 | 說明 |
CHAR_LENGTH(s) |
返回字元串s的字元數 SELECT CHAR_LENGTH('你好123') -- 5 |
LENGTH(s) |
返回字元串s的長度 SELECT LENGTH('你好123') -- 9 |
CONCAT(s1,s2,...) |
將字元串s1,s2等多個字元串合併為一個字元串 SELECT CONCAT('12','34') -- 1234 |
GROUP_CONCAT(id) |
select id,pid,GROUP_CONCAT(id) from ztree group by pid; 分組後, 將所選出的列拼接, 並且還可以指定拼接的字元串 group_contact(id SEPARATOR '-') |
CONCAT_WS(x,s1,s2,...) |
同CONCAT(s1,s2,...)函數,但是每個字元串直接要加上x SELECT CONCAT_WS('@','12','34') -- 12@34 |
INSERT(s1,x,len,s2) |
將字元串s2替換s1的x位置開始長度為len的字元串 SELECT INSERT('12345',1,3,'abc') -- abc45 |
UPPER(s),UCAASE(S) |
將字元串s的所有字母變成大寫字母 SELECT UPPER('abc') -- ABC |
LOWER(s),LCASE(s) |
將字元串s的所有字母變成小寫字母 SELECT LOWER('ABC') -- abc |
LEFT(s,n) |
返回字元串s的前n個字元 SELECT LEFT('abcde',2) -- ab |
RIGHT(s,n) |
返回字元串s的後n個字元 SELECT RIGHT('abcde',2) -- de |
LPAD(s1,len,s2) |
字元串s2來填充s1的開始處,使字元串長度達到len SELECT LPAD('abc',5,'xx') -- xxabc |
RPAD(s1,len,s2) |
字元串s2來填充s1的結尾處,使字元串的長度達到len SELECT RPAD('abc',5,'xx') -- abcxx |
LTRIM(s) | 去掉字元串s開始處的空格 |
RTRIM(s) | 去掉字元串s結尾處的空格 |
TRIM(s) | 去掉字元串s開始和結尾處的空格 |
TRIM(s1 FROM s) |
去掉字元串s中開始處和結尾處的字元串s1 SELECT TRIM('@' FROM '@@abc@@') -- abc |
REPEAT(s,n) |
將字元串s重覆n次 SELECT REPEAT('ab',3) -- ababab |
SPACE(n) | 返回n個空格 |
REPLACE(s,s1,s2) |
將字元串s2替代字元串s中的字元串s1 SELECT REPLACE('abc','a','x') --xbc |
STRCMP(s1,s2) | 比較字元串s1和s2 |
SUBSTRING(s,n,len) | 獲取從字元串s中的第n個位置開始長度為len的字元串 |
MID(s,n,len) | 同SUBSTRING(s,n,len) |
LOCATE(s1,s) POSITION(s1 IN s) |
從字元串s中獲取s1的開始位置 SELECT LOCATE('b', 'abc') -- 2 |
INSTR(s,s1) |
從字元串s中獲取s1的開始位置 SELECT INSTR('abc','b') -- 2 |
REVERSE(s) |
將字元串s的順序反過來 SELECT REVERSE('abc') -- cba |
ELT(n,s1,s2,...) |
返回第n個字元串 SELECT ELT(2,'a','b','c') -- b |
EXPORT_SET(x,s1,s2) |
返回一個字元串,在這裡對於在“bits”中設定每一位,你得到一個“on”字元串,並且對於每個複位(reset)的位, 你得到一個 “off”字元串。每個字元串用“separator”分隔(預設“,”),並且只有“bits”的“number_of_bits” (預設64)位被使用。 SELECT EXPORT_SET(5,'Y','N',',',4) -- Y,N,Y,N |
FIELD(s,s1,s2...) |
返回第一個與字元串s匹配的字元串位置 SELECT FIELD('c','a','b','c') -- 3 |
FIND_IN_SET(s1,s2) |
返回在字元串s2中與s1匹配的字元串的位置, 比如在 11,12,13 中, 查找 1 和11, 1 是查不到的, 11能查到 FIND_IN_SET('11', '11,12,13') -> 1 |
MAKE_SET(x,s1,s2) | 返回一個集合 (包含由“,”
字元分隔的子串組成的一個 字元串),由相應的位在 SELECT MAKE_SET(1|4,'a','b','c'); -- a,c |
SUBSTRING_INDEX |
返回從字元串str的第count個出現的分隔符delim之後的子串。 如果count是正數,返回第count個字元左邊的字元串。 如果count是負數,返回第(count的絕對值(從右邊數))個字元右邊的字元串。 SELECT SUBSTRING_INDEX('a*b','*',1) -- a |
LOAD_FILE(file_name) |
讀入文件並且作為一個字元串返迴文件內容。文件必須在伺服器上,你必須指定到文件的完整路徑名, 而且你必須有file權 限。文件必須所有內容都是可讀的並且小於max_allowed_packet。 如果文件不存在或由於上面原因之一不能被讀出,函數返回NULL。 |
三、日期時間函數
MySQL的日期和時間函數主要用於處理日期時間。
函數 | 說明 |
CURDATE() CURRENT_DATE() |
返回當前日期 SELECT CURDATE() |
CURTIME() CURRENT_TIME |
返回當前時間 SELECT CURTIME() |
NOW() CURRENT_TIMESTAMP() LOCALTIME() SYSDATE() LOCALTIMESTAMP() |
返回當前日期和時間 SELECT NOW() |
UNIX_TIMESTAMP() |
以UNIX時間戳的形式返回當前時間 SELECT UNIX_TIMESTAMP() |
UNIX_TIMESTAMP(d) |
將時間d以UNIX時間戳的形式返回 SELECT UNIX_TIMESTAMP('2011-11-11 11:11:11') |
FROM_UNIXTIME(d) |
將UNIX時間戳的時間轉換為普通格式的時間 SELECT FROM_UNIXTIME(1320981071) |
UTC_DATE() |
返回UTC日期 SELECT UTC_DATE() |
UTC_TIME() |
返回UTC時間 SELECT UTC_TIME() |
MONTH(d) |
返回日期d中的月份值,1->12 SELECT MONTH('2011-11-11 11:11:11') |
MONTHNAME(d) |
返回日期當中的月份名稱,如Janyary SELECT MONTHNAME('2011-11-11 11:11:11') |
DAYNAME(d) |
返回日期d是星期幾,如Monday,Tuesday SELECT DAYNAME('2011-11-11 11:11:11') |
DAYOFWEEK(d) |
日期d今天是星期幾,1星期日,2星期一 SELECT DAYOFWEEK('2011-11-11 11:11:11') |
WEEKDAY(d) |
日期d今天是星期幾, 0表示星期一,1表示星期二 |
WEEK(d) WEEKOFYEAR(d) |
計算日期d是本年的第幾個星期,範圍是0->53 SELECT WEEK('2011-11-11 11:11:11') |
DAYOFYEAR(d) |
計算日期d是本年的第幾天 SELECT DAYOFYEAR('2011-11-11 11:11:11') |
DAYOFMONTH(d) |
計算日期d是本月的第幾天 SELECT DAYOFMONTH('2011-11-11 11:11:11') |
QUARTER(d) |
返回日期d是第幾季節,返回1->4 SELECT QUARTER('2011-11-11 11:11:11') |
HOUR(t) |
返回t中的小時值 SELECT HOUR('1:2:3') |
MINUTE(t) |
返回t中的分鐘值 SELECT MINUTE('1:2:3') |
SECOND(t) |
返回t中的秒鐘值 SELECT SECOND('1:2:3') |
EXTRACT(type FROM d) |
從日期d中獲取指定的值,type指定返回的值 SELECT EXTRACT(MINUTE FROM '2011-11-11 11:11:11') type可取值為: MICROSECOND |
TIME_TO_SEC(t) |
將時間t轉換為秒 SELECT TIME_TO_SEC('1:12:00') |
SEC_TO_TIME(s) |
將以秒為單位的時間s轉換為時分秒的格式 SELECT SEC_TO_TIME(4320) |
TO_DAYS(d) |
計算日期d距離0000年1月1日的天數 SELECT TO_DAYS('0001-01-01 01:01:01') |
FROM_DAYS(n) |
計算從0000年1月1日開始n天後的日期 SELECT FROM_DAYS(1111) |
DATEDIFF(d1,d2) |
計算日期d1->d2之間相隔的天數 SELECT DATEDIFF('2001-01-01','2001-02-02') |
ADDDATE(d,n) |
計算其實日期d加上n天的日期 |
ADDDATE(d,INTERVAL expr type) |
計算起始日期d加上一個時間段後的日期 SELECT ADDDATE('2011-11-11 11:11:11',1) SELECT ADDDATE('2011-11-11 11:11:11', INTERVAL 5 MINUTE) |
DATE_ADD(d,INTERVAL expr type) | 同上 |
SUBDATE(d,n) |
日期d減去n天後的日期 SELECT SUBDATE('2011-11-11 11:11:11', 1) |
SUBDATE(d,INTERVAL expr type) |
日期d減去一個時間段後的日期 SELECT SUBDATE('2011-11-11 11:11:11', INTERVAL 5 MINUTE) |
ADDTIME(t,n) |
時間t加上n秒的時間 SELECT ADDTIME('2011-11-11 11:11:11', 5) |
SUBTIME(t,n) |
時間t減去n秒的時間 SELECT SUBTIME('2011-11-11 11:11:11', 5) |
DATE_FORMAT(d,f) |
按表達式f的要求顯示日期d SELECT DATE_FORMAT('2011-11-11 11:11:11','%Y-%m-%d %r') |
TIME_FORMAT(t,f) |
按表達式f的要求顯示時間t SELECT TIME_FORMAT('11:11:11','%r') |
GET_FORMAT(type,s) |
獲得國家地區時間格式函數 select get_format(date,'usa') |
四、條件判斷函數
1、IF(expr,v1,v2)函數
如果表達式expr成立,返回結果v1;否則,返回結果v2。
SELECT IF(1 > 0,'正確','錯誤') ->正確
2、IFNULL(v1,v2)函數
如果v1的值不為NULL,則返回v1,否則返回v2。
這裡我用的比較多的是, ifnull(null, 0) 或者 ifnull(null, '')
SELECT IFNULL(null,'Hello Word') ->Hello Word
3、CASE
語法1:
CASE WHEN e1 THEN v1 WHEN e2 THEN e2 ... ELSE vn END
CASE表示函數開始,END表示函數結束。如果e1成立,則返回v1,如果e2成立,則返回v2,當全部不成立則返回vn,而當有一個成立之後,後面的就不執行了。
SELECT CASE WHEN 1 > 0 THEN '1 > 0' WHEN 2 > 0 THEN '2 > 0' ELSE '3 > 0' END ->1 > 0
語法2:
CASE expr WHEN e1 THEN v1 WHEN e1 THEN v1 ... ELSE vn END
如果表達式expr的值等於e1,返回v1;如果等於e2,則返回e2。否則返回vn。
SELECT CASE 1 WHEN 1 THEN '我是1' WHEN 2 THEN '我是2' ELSE '你是誰'
case這個經常用來行轉列, 比如把成績轉成成績表那種的
五、系統信息函數
系統信息函數用來查詢MySQL資料庫的系統信息。
函數 | 作用 |
VERSION() |
返回資料庫的版本號 SELECT VERSION() |
CONNECTION_ID() | 返回伺服器的連接數 |
DATABASE() SCHEMA() |
返回當前資料庫名 |
USER() SYSTEM_USER() SESSION_USER() CURRENT_USER() CURRENT_USER |
返回當前用戶 |
CHARSET(str) | 返回字元串str的字元集 |
COLLATION(str) | 返回字元串str的字元排列方式 |
LAST_INSERT_ID() | 返回最近生成的AUTO_INCREMENT值 |
六、加密函數
加密函數是MySQL用來對數據進行加密的函數。
1、PASSWORD(str)
該函數可以對字元串str進行加密,一般情況下,PASSWORD(str)用於給用戶的密碼加密。
SELECT PASSWORD('123') ->*23AE809DDACAF96AF0FD78ED04B6A265E05AA257
2、MD5
MD5(str)函數可以對字元串str進行散列,可以用於一些普通的不需要解密的數據加密。
SELECT md5('123') ->202cb962ac59075b964b07152d234b70
3、ENCODE(str,pswd_str)與DECODE(crypt_str,pswd_str)
ENCODE函數可以使用加密密碼pswd_str來加密字元串str,加密結果是二進位數,需要使用BLOB類型的欄位保存。該函數與DECODE是一對,需要同樣的密碼才能夠解密。
SELECT ENCODE('123','xxoo') ->;vx SELECT DECODE(';vx','xxoo') ->123
七、其它函數
1、格式化函數FORMAT(x,n)
FORMAT(x,n)函數可以將數字x進行格式化,將x保留到小數點後n位。
SELECT FORMAT(3.1415926,3) ->3.142
2、不同進位的數字進行轉換
- ASCII(s) 返回字元串s的第一個字元的ASCII碼;
- BIN(x) 返回x的二進位編碼;
- HEX(x) 返回x的十六進位編碼;
- OCT(x) 返回x的八進位編碼;
- CONV(x,f1,f2) 返回f1進位數變成f2進位數;
3、IP地址與數字相互轉換的函數
- INET_ATON(IP)函數可以將IP地址轉換為數字表示;IP值需要加上引號;
- INET_NTOA(n)函數可以將數字n轉換成IP形式。
SELECT INET_ATON('192.168.0.1') ->3232235521 SELECT INET_NTOA(3232235521) ->192.168.0.1
4、加鎖函數和解鎖函數
- GET_LOCK(name,time)函數定義一個名稱為nam、持續時間長度為time秒的鎖。如果鎖定成功,則返回1;如果嘗試超時,則返回0;如果遇到錯誤,返回NULL。
- RELEASE_LOCK(name)函數解除名稱為name的鎖。如果解鎖成功,則返回1;如果嘗試超時,返回0瞭如果解鎖失敗,返回NULL;
- IS_FREE_LOCK(name)函數判斷是否已使用名為name的鎖定。如果使用,返回0,否則,返回1;
SELECT GET_LOCK('MySQL',10) ->1 (持續10秒) SELECT IS_FREE_LOCK('MySQL') ->1 SELECT RELEASE_LOCK('MySQL') ->1
5、重覆執行指定操作的函數
BENCHMARK(count.expr)函數將表達式expr重覆執行count此,然後返回執行時間。該函數可以用來判斷MySQL處理表達式的速度。
SELECT BENCHMARK(10000,NOW()) ->0 返回系統時間1萬
6、改變字元集的函數
CONVERT(s USING cs)函數將字元串s的字元集變成cs。
SELECT CHARSET('ABC') ->utf-8 SELECT CHARSET(CONVERT('ABC' USING gbk)) ->gbk
7、轉換數據類型
- CAST(x AS type)
- CONVERT(x,type)
這裡特別要註意, 這些個類型, 我以前經常喜歡寫 cast('1' as int)這是不對的.
這兩個函數只對BINARY、CHAR、DATE、DATETIME、TIME、SIGNED INTEGER、UNSIGNED INTEGER。
SELECT CAST('123' AS UNSIGNED INTEGER) + 1 ->124 SELECT '123' + 1 ->124 其實MySQL能預設轉換 SELECT CAST(NOW() AS DATE)
->2014-12-18
最後, 再次感謝逆心的這篇mysql函數, 如果我此文侵犯了版權, 請給我留言, 我會收回這篇博文, 留給自己當做文檔使用