mysql數據庫中的函數

    函數表示對輸入參數值返回一個具有特定關係的值,在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 |
+------------------+

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章