函數表示對輸入參數值返回一個具有特定關係的值,在mysql中使用函數可以極大的提高用戶對數據庫的管理效率。Mysql中的函數主要有數學函數,字符串函數,日期函數,時間函數以及條件判斷函數、系統信息函數和加密函數等。
1、流程控制函數
流程控制函數主要用於根據滿足條件的不同,執行相應的流程,mysql中流程控制函數主要有IF()、IFNULL()、CASH、以及NULLIF()。
(1)IF(expr,v1,v2)函數
IF(expr,v1,v2)函數中如果expr是TRUE,則返回v1,否則返回v2。IF()返回的值可以是數字或字符串。
# 使用if判斷語句
mysql> select if(2>1,1,2),if(strcmp('test','test123'),'false',true);
+-------------+-------------------------------------------+
| if(2>1,1,2) | if(strcmp('test','test123'),'false',true) |
+-------------+-------------------------------------------+
| 1 | false |
+-------------+-------------------------------------------+
(2)IFNULL(v1,v2)函數
IFNULL(v1,v2)函數中,如果v1不爲null,則IFNULL的返回值爲v1,否則爲v2。
# IFNULL()函數的應用
mysql> SELECT IFNULL(0,1),IFNULL(NULL,2),IFNULL(1/0,'wrong');
+-------------+----------------+---------------------+
| IFNULL(0,1) | IFNULL(NULL,2) | IFNULL(1/0,'wrong') |
+-------------+----------------+---------------------+
| 0 | 2 | wrong |
+-------------+----------------+---------------------+
# 查看teacher表中的name值,如果爲空則使用”null”
mysql> select name,ifnull(name,'other') from teacher;
+-------+----------------------+
| name | ifnull(name,'other') |
+-------+----------------------+
| NULL | other |
| carey | carey |
+-------+----------------------+
(3)CASE函數
語法格式爲:CASE expr WHEN v1 THEN r1 [when v2 THEN r2] [ELSE m] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
如果expr值等於vn,則返回對應vn位置後面的結果rn,如果都不匹配,則返回ELSE後面的m。
# 查詢teacher表中信息,並將查詢語句使用別名
mysql> select case dept_id when 2 then 'english' when 3 then 'maths' else 'other' end course_name,dept_id from teacher;
+-------------+---------+
| course_name | dept_id |
+-------------+---------+
| english | 2 |
| maths | 3 |
+-------------+---------+
# 將上面的語句寫成條件判斷語句
mysql> select case when dept_id=2 then 'english' when dept_id=3 then 'maths' else 'other' end course_name,ifnull(name,'other_teacher'),dept_id from teacher;
+-------------+------------------------------+---------+
| course_name | ifnull(name,'other_teacher') | dept_id |
+-------------+------------------------------+---------+
| maths | other_teacher | 3 |
| english | carey | 2 |
+-------------+------------------------------+---------+
(4)NULLIF(expr1,expr2)
當expr1等於expr2時,則返回null,否則返回expr1
# nullif函數應用
mysql> select nullif(1,1),nullif(1,2);
+-------------+-------------+
| nullif(1,1) | nullif(1,2) |
+-------------+-------------+
| NULL | 1 |
+-------------+-------------+
2、字符串函數
(1)ASCII(str)
返回str字符串中最左邊字符的ascii碼值,如果是空串則返回0,如果str是null則返回null。
# 返回字符串對應的ASCII碼
mysql> SELECT ASCII('6'),ASCII('AB'),ASCII(''),ASCII(' ');
+------------+-------------+-----------+------------+
| ASCII('6') | ASCII('AB') | ASCII('') | ASCII(' ') |
+------------+-------------+-----------+------------+
| 54 | 65 | 0 | 32 |
+------------+-------------+-----------+------------+
(2)CHAR(N,... [USING charset_name])
將括號中的N轉化成ascii碼對應的字符,返回這些字符組成的字符串,其中的null會被忽略。
# 將ascii碼轉化成字符
mysql> select char(77,121,83,81,'76'),char(77,'77.77');
+-------------------------+------------------+
| char(77,121,83,81,'76') | char(77,'77.77') |
+-------------------------+------------------+
| MySQL | MM |
+-------------------------+------------------+
(3)CHAR_LENGTH(str)
返回字符串的長度
# 返回字符串長度
mysql> select char_length('mysql');
+----------------------+
| char_length('mysql') |
+----------------------+
| 5 |
+----------------------+
(4)CONCAT(str1,str2,...)
將括號裏所有參數連接在一起,當有’null’時返回’null’
mysql> select concat('hell','o',',','my','sql'),concat(null,'test');
+-----------------------------------+---------------------+
| concat('hell','o',',','my','sql') | concat(null,'test') |
+-----------------------------------+---------------------+
| hello,mysql | NULL |
+-----------------------------------+---------------------+
(5)CONCAT_WS(separator,str1,str2,...)
返回以第一個參數爲分隔符的連接後的一個字符串,當有參數爲NULL時則null被忽略。
(6)INSERT(str,pos,len,newstr)
將str中從pos位置開始後的len個字符替換成newstr字符串。
mysql> select insert('aaabbb',3,3,'zzz');
+----------------------------+
| insert('aaabbb',3,3,'zzz') |
+----------------------------+
| aazzzb |
+----------------------------+
(7)INSTR(str,substr)
返回str字符串中第一個出現substr字符串的位置
(8)LEFT(str,len)
返回str字符串中從左邊開始的len個長度的字符
(9)LENGTH(str)
返回str字符串的byte字節長度
(10)LOAD_FILE(file_name)
讀取文件且返回文件內容爲字符串
(11)LOCATE(substr,str)
返回str字符串中第一次出現substr字符串的位置,如果沒有則返回null
(12)LOCATE(substr,str,pos)
返回str字符串中從pos位置開始第一次出現substr字符串的位置,如果沒有則返回null
(13)LOWER(str)
返回將str字符串中所有字符變換成小寫後的字符串,但對二進制文本無效
(14)LPAD(str,len,padstr)
將str的左邊補充爲padstr,直到補充成len長度的字符串並返回;如果str的長度比len長,則返回str中最左邊開始的len長度的字符
(15)LTRIM(str)
將str最左邊的空格去掉並返回
(16)REPEAT(str,count)
將str重複count並組合成字符串返回,如果count<1,則返回空串
(17)REPLACE(str,from_str,to_str)
將所有str字符串中匹配from_str子串的地方都替換成to_str子字符串
(18)REVERSE(str)
將str字符串中的字符按照倒序組合並返回
(19)RIGHT(str,len)
將str字符串中從右邊開始的len個字符返回
(20)RPAD(str,len,padstr)
將字符串str從右邊開始補充爲padstr直到整體長度爲len,如果str的長度本身大於len,則返回str中len長度的字符串
(21)RTRIM(str)
將字符串str右邊的空格去掉並返回
(22)SPACE(N)
返回N個長度的空格組成的空字符串
(23)SUBSTRING_INDEX(str,delim,count)
當count爲正數,則返回delim出現在str字符串中第count次之前的子字符串,如果是負數,則從右邊開始計算
mysql> select substring_index('www.mysql.org','.','2') AS A,substring_index('www.mysql.org','.','-2') AS B;
+-----------+-----------+
| A | B |
+-----------+-----------+
| www.mysql | mysql.org |
+-----------+-----------+
(24)UPPER(str)
返回將str字符串中所有字符轉換成大寫的字符串。
(25)STRCMP(expr1,expr2)
字符串對比函數,當expr1等於expr2時等於0,當expr1小於expr2時爲-1,反之爲1
3、數字函數
(1)ABS(X):絕對值函數
mysql> select abs(-1),abs(100),abs(0);
+---------+----------+--------+
| abs(-1) | abs(100) | abs(0) |
+---------+----------+--------+
| 1 | 100 | 0 |
+---------+----------+--------+
(2)CEILING(X)/CEIL(X):返回>=X值的最小整數
(3)FLOOR(X):返回<=X值的最大整數
mysql> select ceiling(12.13),ceil(12.13),floor(13.14);
+----------------+-------------+--------------+
| ceiling(12.13) | ceil(12.13) | floor(13.14) |
+----------------+-------------+--------------+
| 13 | 13 | 13 |
+----------------+-------------+--------------+
(4)MOD(N,M), N % M, N MOD M
取餘數操作,返回兩者相除之後剩下的餘數
mysql> select mod(99,8),99%8,99 mod 8;
+-----------+------+----------+
| mod(99,8) | 99%8 | 99 mod 8 |
+-----------+------+----------+
| 3 | 3 | 3 |
+-----------+------+----------+
(5)RAND([N])
獲取0到1之間的隨機小數
# 獲取一個隨機數,並獲取100以內的隨機小數
mysql> select rand(),floor(rand()*100);
+--------------------+-------------------+
| rand() | floor(rand()*100) |
+--------------------+-------------------+
| 0.9055193242668355 | 32 |
+--------------------+-------------------+
(6)ROUND(X), ROUND(X,D)
四捨五入爲D位個小數,當D參數不存在是,則默認爲0
(7)TRUNCATE(X,D)
數字X只保留D位的小數,其餘均捨棄
4、時間和日期函數
(1)CURDATE(),CURRENT_DATE()
CURDATE()和CURRENT_DATE()函數作用相同,將當前的日期按照’YYYY-MM-DD’或’YYYYMMDD’格式的值返回。
mysql> select curdate(),current_date(),curdate()+0,current_date()+0;
+------------+----------------+-------------+------------------+
| curdate() | current_date() | curdate()+0 | current_date()+0 |
+------------+----------------+-------------+------------------+
| 2018-09-25 | 2018-09-25 | 20180925 | 20180925 |
+------------+----------------+-------------+------------------+
(2)CURTIME(),CURRENT_TIME()
CURTIME()和CURRENT_TIME()函數作用相同,將當前的時間以’HH:MM:SS’或’HHMMSS’格式返回
mysql> select curtime(),current_time(),curtime()+0,current_time()+0;
+-----------+----------------+-------------+------------------+
| curtime() | current_time() | curtime()+0 | current_time()+0 |
+-----------+----------------+-------------+------------------+
| 04:02:25 | 04:02:25 | 40225 | 40225 |
+-----------+----------------+-------------+------------------+
(3)CURRENT_TIMESTAMP(),LOCALTIME(),NOW(),SYSDATE()
這四個函數的作用相同,均返回當前的日期及時間,返回的日期時間格式可以自行設定。
mysql> select current_timestamp(),localtime()+0,now(),sysdate()+0;
+---------------------+----------------+-----------------+-------------+
| current_timestamp() | localtime()+0 | now() | sysdate()+0 |
+---------------------+----------------+-----------------+-------------+
|2018-09-25 04:06:42 |20180925040642|2018-09-25 04:06:42|20180925040642|
+---------------------+----------------+-----------------+-------------+
(4)UNIX_TIMESTAMP(date),FROM_UNIXTIME(date)
UNIX_TIMESTAMP(date)函數爲時間戳函數,若無時間參數,則返回當前時間的時間戳。
FROM_UNIXTIME(date)函數則把時間戳轉化爲時間
mysql> select unix_timestamp() AS dateA,unix_timestamp(now()) AS dateB,unix_timestamp(20180926163033) AS dateC,FROM_UNIXTIME(1537863364) AS dateD;
+------------+------------+------------+---------------------+
| dateA | dateB | dateC | dateD |
+------------+------------+------------+---------------------+
| 1537863465 | 1537863465 | 1537993833 | 2018-09-25 04:16:04 |
+------------+------------+------------+---------------------+
(5)UTC_DATE(),UTC_TIME()
UTC_DATE()用於返回當前UTC的日期值,UTC_TIME()用於返回當前UTC的時間值。
(6)MONTH(date),MONTHNAME(date)
MONTH(date)函數用於返回date對應的月份,MONTHNAME(date)函數用於返回日期date對應月份的英文全名。
(7)DAYNAME(d),DAYOFWEEK(d),WEEKDAY(d)
DAYNAME(d)函數返回d對應的星期的英文名稱,DAYOFWEEK(d)函數返回d對應的一週中索引(1表示週日,依次類推),WEEKDAY(d)函數返回d對應的工作日索引(0表示週一,依次類推)。
mysql> select dayname(20180926),dayofweek(now()),weekday(20180926);
+-------------------+------------------+-------------------+
| dayname(20180926) | dayofweek(now()) | weekday(20180926) |
+-------------------+------------------+-------------------+
| Wednesday | 3 | 2 |
+-------------------+------------------+-------------------+
(8)WEEK(d),WEEKOFYEAR(d)
WEEK(d)和WEEKOFYEAR(d)函數都用於計算日期d是一年中的第幾周。
(9)DAYOFYEAR(d),DAYOFMONTH(d)
DAYOFYEAR(d)用於返回日期d是一年中的第幾天,DAYOFMONTH(d)函數用於返回日期d是一月中的第幾天。
(10)YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time)
YEAR(date)函數用於返回(date)對應的年,QUARTER(date)函數用於返回一年中的季度值,MINUTE(time)用於返回time對應的分鐘數,SECOND(time)用於返回time對應的秒數。
(11)EXTRACT(type FROM date)
EXTRACT(type FROM date)函數用於提取從日期中提取一部分。
mysql> select extract(year from '2018-09-26') as year,extract(day from '2018-09-26') as day,extract(minute from '2018-09-26 17:25:30') as minute;
+------+------+--------+
| year | day | minute |
+------+------+--------+
| 2018 | 26 | 25 |
+------+------+--------+
(12)TIME_TO_SEC(time),SEC_TO_TIME(seconds)
TIME_TO_SEC(time)函數用於將秒轉化爲時間格式,SEC_TO_TIME(seconds)函數用於將秒轉化成時間格式。
(13)DATE_ADD(),ADDDATE(),DATE_SUB(),SUBDATE()、ADDTIME()、SUBTIME()、DATE_DIFF()
DATE_ADD(date,INTERVAL expr type)函數和DATE_SUB(date,INTERVAL expr type)函數的作用相同,執行日期的加運算
DATE_SUB(date,INTERVAL expr type)函數和SUBDATE(date,INTERVAL expr type)函數的作用相同,執行日期的減運算。
# 對時間的加減運算操作
mysql> select date_add('2018-09-27',interval 1 day) as addday,adddate('2018-09-27 10:55:22',interval 1 second) as addsec,date_sub('2018-09-27',interval 1 month) as sub_month,adddate('2018-09-27 10:55:22',interval '3:3' hour_minute) as sub_hour_minute;
+------------+---------------------+------------+---------------------+
| addday | addsec | sub_month | sub_hour_minute |
+------------+---------------------+------------+---------------------+
| 2018-09-28 | 2018-09-27 10:55:23 | 2018-08-27 | 2018-09-27 13:58:22 |
+------------+---------------------+------------+---------------------+
ADDTIME(date,expr)函數將expr值添加到date,並返回修改後的值
SUBTIME(date,expr)函數將從date中減去expr值,並返回修改後的值
# 對時間的加減
mysql> select subtime('2018-09-27 11:02:02','01:02:02') as sub_time,addtime('2018-09-27 11:02:02','00:57:58') as add_time;
+---------------------+---------------------+
| sub_time | add_time |
+---------------------+---------------------+
| 2018-09-27 10:00:00 | 2018-09-27 12:00:00 |
+---------------------+---------------------+
DATEDIFF(date1,date2)函數用於返回起始時間date1和結束時間date2之間的天數。
(14)日期時間格式化函數DATE_FORMAT(date,format),TIME_FORMAT(time,format),GET_FORMAT(val_type,format_type)
DATE_FORMAT(date,format)根據format指定的格式顯示date值。
TIME_FORMAT(time,format)根據format字符串安排time值的格式
GET_FORMAT(val_type,format_type)返回日期時間字符串的顯示格式,val_type表示日期數據類型,format_type表示格式化顯示類型。
更多的時間日期格式參考mysql官方文檔(https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html)
# 對時間的類型進行格式化
mysql> select date_format('2018-09-27 11:50:20','%Y%m%d %W') as date,time_format(curtime(),'%H:%i') as time,get_format(DATETIME,'ISO') as datetime_fromat_iso,date_format(now(),get_format(DATE,'ISO')) as format;
+-------------------+-------+---------------------+------------+
| date | time | datetime_fromat_iso | format |
+-------------------+-------+---------------------+------------+
| 20180927 Thursday | 01:12 | %Y-%m-%d %H:%i:%s | 2018-09-27 |
+-------------------+-------+---------------------+------------+
5、系統信息函數
(1)獲取MYSQL版本號、連接數和數據庫名的函數
VERSION():返回指示MYSQL服務器版本的字符串。
CONNECTION_ID():返回mysql服務器當前連接的次數
DATABASE()、SCHEMA()函數均用於返回使用utf8字符集的當前默認數據庫名
# 獲取mysql數據庫的一些信息
mysql> select version(),connection_id(),database(),schema();
+-----------+-----------------+------------+----------+
| version() | connection_id() | database() | schema() |
+-----------+-----------------+------------+----------+
| 5.7.23 | 9 | mysql | mysql |
+-----------+-----------------+------------+----------+
# 查看正在連接mysql的用戶
mysql> show processlist;
+----+------+-----------+--------+---------+------+-------+----------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+--------+---------+------+-------+----------+
| 9 | root | localhost | course | Query | 0 | starting | show processlist |
+----+------+-----------+--------+--------+------+-------+----------+
(2)獲取用戶名的函數
USER(),CURRENT_USER(),SYSTEM_USER()及SESSION_USER()函數均用於返回當前被MYSQL服務器驗證的用戶名和主機名組合。
(3)獲取字符串的字符集和排序方式函數
CHARSET(set)函數用於返回字符串自變量的字符集
COLLATION(str):返回字符串str字符排序方式
# 返回字符串的值以及排序方式
mysql> select charset('dayi123'),charset(convert('dayi123' USING latin1)) as charset,collation(_latin2 'dayi123');
+--------------------+---------+------------------------------+
| charset('dayi123') | charset | collation(_latin2 'dayi123') |
+--------------------+---------+------------------------------+
| utf8 | latin1 | latin2_general_ci |
+--------------------+---------+------------------------------+
(4)獲取最後一個自動生成id值得函數
LAST_INSERT_ID()函數用於自動返回最後一個INSERT或UPDATE爲AUTO_INCREMENT列設置的第一個發生的值。
# 獲取最後一個自動生成的id值
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 101 |
+------------------+