使用函數的方便性我就不多說了,在MySQL數據庫中,函數可以使用在SELECT語句及其字句(例如WHERE、ORDER BY、HAVING等)中,也可以用在UPDATE、DELETE語句及其字句中。
一、字符串函數
注意:下面只是演示函數的作用,並未選擇具體的數據庫及表
1. CONCAT( s1,s2,...sn) 函數:把傳入的參數連接成一個字符串
注意:任何字符串與NULL進行連接的結果都將是NULL。
mysql> select concat('aaa','bbb','ccc'),concat('aaa',null);
+---------------------------+--------------------+
| concat('aaa','bbb','ccc') | concat('aaa',null) |
+---------------------------+--------------------+
| aaabbbccc | NULL |
+---------------------------+--------------------+
1 row in set (0.00 sec)
2. INSERT(str,x,y,instr)函數:將字符串str從第x位置開始,y個字符長度的字串替換爲instr
mysql> select insert('beijing2008you',12,3,'me');
+------------------------------------+
| insert('beijing2008you',12,3,'me') |
+------------------------------------+
| beijing2008me |
+------------------------------------+
1 row in set (0.00 sec)
3. LOWER(str)和UPPER(str)函數:把字符串轉化成小寫或大寫
mysql> select lower('BEIJING2008'),UPPER('beijing2008');
+----------------------+----------------------+
| lower('BEIJING2008') | UPPER('beijing2008') |
+----------------------+----------------------+
| beijing2008 | BEIJING2008 |
+----------------------+----------------------+
1 row in set (0.00 sec)
4. LEFT(str,x) 和 RIGHT(str,x)函數:分別返回字符串str最左/最右的x個字符
mysql> select left('beijing2008',7),left('beijing2008',null),right('beijing2008',4),right('beijing2008',null);
+-----------------------+--------------------------+------------------------+---------------------------+
| left('beijing2008',7) | left('beijing2008',null) | right('beijing2008',4) | right('beijing2008',null) |
+-----------------------+--------------------------+------------------------+---------------------------+
| beijing | NULL | 2008 | NULL |
+-----------------------+--------------------------+------------------------+---------------------------+
1 row in set (0.00 sec)
注意:參數x不可省略,當爲null時,返回null。
5. LPAD(str, n, pad) 和 RPAD( str, n, pad) 函數:用字符串pad對str最左邊和最右邊進行填充使得整個字符串長度爲n
mysql> select lpad('2008',20,'beijing'),rpad('beijing',20,'2008');
+---------------------------+---------------------------+
| lpad('2008',20,'beijing') | rpad('beijing',20,'2008') |
+---------------------------+---------------------------+
| beijingbeijingbe2008 | beijing2008200820082 |
+---------------------------+---------------------------+
1 row in set (0.00 sec)
6. LTRIM(str)和 RTRIM(str)函數:去掉字符串str左側和右側的空格
mysql> select ltrim(' |beijing'),rtrim('beijing| ');
+-----------------------+----------------------+
| ltrim(' |beijing') | rtrim('beijing| ') |
+-----------------------+----------------------+
| |beijing | beijing| |
+-----------------------+----------------------+
1 row in set (0.00 sec)
7. REPEAT(str, x) 函數:將字符串str重複x次
mysql> select repeat('mysql ',3);
+--------------------+
| repeat('mysql ',3) |
+--------------------+
| mysql mysql mysql |
+--------------------+
1 row in set (0.00 sec)
8. REPLACE( str, a, b)函數:用字符串b替換str中出現的所有字符串a
mysql> select replace('beijing_2010','_2010','2008');
+----------------------------------------+
| replace('beijing_2010','_2010','2008') |
+----------------------------------------+
| beijing2008 |
+----------------------------------------+
1 row in set (0.00 sec)
9. STRCMP(s1, s2)函數:比較字符串s1和s2的ASCII碼值的大小
如果s1比s2小返回-1,相等返回0,s1比s2大返回1 。
mysql> select strcmp('a','b'),strcmp('a','a'),strcmp('c','b');
+-----------------+-----------------+-----------------+
| strcmp('a','b') | strcmp('a','a') | strcmp('c','b') |
+-----------------+-----------------+-----------------+
| -1 | 0 | 1 |
+-----------------+-----------------+-----------------+
1 row in set (0.00 sec)
10. TRIM(str)函數:去掉字符串str開頭和結尾的空格
mysql> select trim(' $ beijing2008 $ ');
+---------------------------------+
| trim(' $ beijing2008 $ ') |
+---------------------------------+
| $ beijing2008 $ |
+---------------------------------+
1 row in set (0.00 sec)
11. SUBSTRING(str, x, y)函數:返回字符串str中的第x位置起長度爲y的字符串
mysql> select substring('beijing2008',8,4);
+------------------------------+
| substring('beijing2008',8,4) |
+------------------------------+
| 2008 |
+------------------------------+
1 row in set (0.00 sec)
該函數常用來提取字串
二、數值函數
方便的處理很多數值方面的運算。
1. ABS(X)函數:返回x的絕對值
mysql> select abs(-0.8),abs(0.8);
+-----------+----------+
| abs(-0.8) | abs(0.8) |
+-----------+----------+
| 0.8 | 0.8 |
+-----------+----------+
1 row in set (0.00 sec)
2. CEIL(X)函數:對數x向上取整
mysql> select ceil(-0.8),ceil(0.8);
+------------+-----------+
| ceil(-0.8) | ceil(0.8) |
+------------+-----------+
| 0 | 1 |
+------------+-----------+
1 row in set (0.00 sec)
3. FLOOR(X)函數:對數x向下取整
mysql> select floor(-0.8),floor(0.8);
+-------------+------------+
| floor(-0.8) | floor(0.8) |
+-------------+------------+
| -1 | 0 |
+-------------+------------+
1 row in set (0.00 sec)
4. MOD(X, Y)函數:返回x/y的模(取餘數)
mysql> select mod(15,10),mod(1,11),mod(null,10),mod(1,null),mod(0,2),mod(2,0);
+------------+-----------+--------------+-------------+----------+----------+
| mod(15,10) | mod(1,11) | mod(null,10) | mod(1,null) | mod(0,2) | mod(2,0) |
+------------+-----------+--------------+-------------+----------+----------+
| 5 | 1 | NULL | NULL | 0 | NULL |
+------------+-----------+--------------+-------------+----------+----------+
1 row in set (0.00 sec)
注意:x或y任意一個爲null時結果爲null,y爲0時結果也爲null。
5. RAND()函數:返回0~1內的隨機數
mysql> select rand(),rand(); 每次隨機的數字都不一樣
+--------------------+--------------------+
| rand() | rand() |
+--------------------+--------------------+
| 0.5769799859979935 | 0.8579178544300775 |
+--------------------+--------------------+
1 row in set (0.00 sec)
用該函數做相應變化可以得到指定範圍內的隨機數,如需要0~100內的隨機整數:
mysql> select ceil(100*rand()),floor(100*rand()); 向下能取到0,向上能取到100
+------------------+-------------------+
| ceil(100*rand()) | floor(100*rand()) |
+------------------+-------------------+
| 56 | 21 |
+------------------+-------------------+
1 row in set (0.00 sec)
6. ROUND(x, y) 函數:返回參數x的四捨五入的有y位小數的值
如果y省略則默認y爲0,即不留小數位;這個函數通常用來統一數據格式。
mysql> select round(1.1),round(1.1,2),round(1,2);
+------------+--------------+------------+
| round(1.1) | round(1.1,2) | round(1,2) |
+------------+--------------+------------+
| 1 | 1.10 | 1 |
+------------+--------------+------------+
1 row in set (0.00 sec)
注意:對於整數即使規定了小數位也不會補0,這與老版本有所區別。
7. TRUNCATE(X, Y)函數:將數字x進行截斷,只保留y位小數
該函數只是截斷,而round函數是四捨五入,當截斷位數不足時補0。
mysql> select round(1.235,2),truncate(1.235,2),truncate(1.2,2);
+----------------+-------------------+-----------------+
| round(1.235,2) | truncate(1.235,2) | truncate(1.2,2) |
+----------------+-------------------+-----------------+
| 1.24 | 1.23 | 1.20 |
+----------------+-------------------+-----------------+
1 row in set (0.00 sec)
三、日期和時間函數
時間函數可以實現很多功能,比如當前時間是多少,下個月的今天是星期幾,統計前天之前的總收入等等。
1. CURDATE() 函數:返回當前時間,只有年月日
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2018-12-13 |
+------------+
1 row in set (0.00 sec)
2. CURTIME()函數:返回當前時間,只有時分秒
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 16:20:52 |
+-----------+
1 row in set (0.00 sec)
3. NOW()函數:返回當前的日期和時間,包含年月日時分秒
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-12-13 16:22:24 |
+---------------------+
1 row in set (0.00 sec)
4. UNIX_TIMESTAMP(date)函數:返回日期date的unix時間戳
mysql> select unix_timestamp(now());
+-----------------------+
| unix_timestamp(now()) |
+-----------------------+
| 1544689715 |
+-----------------------+
1 row in set (0.00 sec)
5. FROM_UNIXTIME(unixtime)函數:返回unixtime時間戳的日期值;與上面的函數互爲逆操作
mysql> select from_unixtime(1544689715);
+---------------------------+
| from_unixtime(1544689715) |
+---------------------------+
| 2018-12-13 16:28:35 |
+---------------------------+
1 row in set (0.00 sec)
6. WEEK(DATE)和YEAR(DATE)函數:返回所給date是哪一年,是一年中第幾周
mysql> select week(now()),year(now());
+-------------+-------------+
| week(now()) | year(now()) |
+-------------+-------------+
| 49 | 2018 |
+-------------+-------------+
1 row in set (0.00 sec)
7. HOUR(time)、MINUTE(time)和SECOND(time)函數:返回所給時間的小時/分鐘/秒
mysql> select hour(curtime()),minute(curtime()),second(curtime());
+-----------------+-------------------+-------------------+
| hour(curtime()) | minute(curtime()) | second(curtime()) |
+-----------------+-------------------+-------------------+
| 16 | 38 | 31 |
+-----------------+-------------------+-------------------+
1 row in set (0.00 sec)
8. MONTHNAME(date)和DAYNAME(date)函數:返回date的英文月份/星期名稱
mysql> select monthname(now()),dayname(now());
+------------------+----------------+
| monthname(now()) | dayname(now()) |
+------------------+----------------+
| December | Thursday |
+------------------+----------------+
1 row in set (0.00 sec)
9. DATE_FORMAT(date, fmt) 函數:按字符串格式fmt格式化日期date的值
關於fmt格式,有很多,硬記有點困難,下面介紹幾個常用的:
mysql> select date_format(now(),'%M, %D, %Y'),date_format(now(),'%m. %d, %y');
+---------------------------------+---------------------------------+
| date_format(now(),'%M, %D, %Y') | date_format(now(),'%m. %d, %y') |
+---------------------------------+---------------------------------+
| December, 13th, 2018 | 12. 13, 18 |
+---------------------------------+---------------------------------+
1 row in set (0.00 sec)
10. DATE_ADD(date,INTERVAL expr type) 函數:返回與所給日期date相差一定時間間隔的日期
INTERVAL是間隔類型關鍵字,expr是表達式,type是表達式對應的類型(MySQL中大概有13種)。
mysql> select now() current,date_add(now(),interval 31 day) after31days,date_add(now(),interval '1_2' year_month) after_oneyear_twomonth;
+---------------------+---------------------+------------------------+
| current | after31days | after_oneyear_twomonth |
+---------------------+---------------------+------------------------+
| 2018-12-13 17:02:17 | 2019-01-13 17:02:17 | 2020-02-13 17:02:17 |
+---------------------+---------------------+------------------------+
1 row in set (0.00 sec)
當然,上面的表達式還可以添加‘-’表示它之前的某個日期時間。
11. DATEDIFF(date1,date2)函數:計算兩個日期之間相差(date1-date2)的天數
mysql> select datediff('2008-08-08',now());
+------------------------------+
| datediff('2008-08-08',now()) |
+------------------------------+
| -3779 |
+------------------------------+
1 row in set (0.00 sec)
四、流程函數
流程函數可以在一個SQL語句中實現條件選擇,提高語句效率。
首先我們新建一個職員薪水錶並插入一些數據,接下來的例子將使用該表的內容:
mysql> use test1;
Database changed
mysql> create table salary (userid int,salsry decimal(9,2));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from salary;
+--------+---------+
| userid | salsry |
+--------+---------+
| 1 | 1000.00 |
| 2 | 2000.00 |
| 3 | 3000.00 |
| 4 | 4000.00 |
| 5 | 5000.00 |
| 1 | NULL |
+--------+---------+
6 rows in set (0.00 sec)
1. IF( value, t, f)函數:如果value爲真返回t,否則返回f
mysql> select if(salsry > 2000,'high','low') from salary; 這裏就通過一個條件將所有工資進行分類
+--------------------------------+
| if(salsry > 2000,'high','low') |
+--------------------------------+
| low |
| low |
| high |
| high |
| high |
| low |
+--------------------------------+
6 rows in set (0.00 sec)
2. IFNULL(value1,value2)函數:value1不爲空返回value1,否則返回value2
該函數常用來替換表中的null值。
mysql> select ifnull(salsry,0) from salary;
+------------------+
| ifnull(salsry,0) |
+------------------+
| 1000.00 |
| 2000.00 |
| 3000.00 |
| 4000.00 |
| 5000.00 |
| 0.00 |
+------------------+
6 rows in set (0.00 sec)
3. CASE [expr] WHEN [value1] THEN [result1] ......ELSE [default] END函數:按條件分類
mysql> select case when salsry>2000 then 'high' else 'low' end from salary;
+--------------------------------------------------+
| case when salsry>2000 then 'high' else 'low' end |
+--------------------------------------------------+
| low |
| low |
| high |
| high |
| high |
| low |
+--------------------------------------------------+
6 rows in set (0.00 sec)
mysql> select case salsry when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
+-----------------------------------------------------------------------+
| case salsry when 1000 then 'low' when 2000 then 'mid' else 'high' end |
+-----------------------------------------------------------------------+
| low |
| mid |
| high |
| high |
| high |
| high |
+-----------------------------------------------------------------------+
6 rows in set (0.00 sec)
用該函數可以實現多分類。
五、其它常用函數
1. DATABASE()函數:返回當前數據庫名
mysql> select database();
+------------+
| database() |
+------------+
| test1 |
+------------+
1 row in set (0.00 sec)
2. VERDION()函數:返回當前數據庫版本
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.17-log |
+------------+
1 row in set (0.00 sec)
3. USER()函數:返回當前登陸用戶名
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
4. INET_ATON(IP)函數:返回IP地址的網絡字節序表示
mysql> select inet_aton('192.168.1.1');
+--------------------------+
| inet_aton('192.168.1.1') |
+--------------------------+
| 3232235777 |
+--------------------------+
1 row in set (0.00 sec)
5. INET_NTOA(num)函數:返回網絡字節序代表的IP地址
mysql> select inet_ntoa(3232235777)
-> ;
+-----------------------+
| inet_ntoa(3232235777) |
+-----------------------+
| 192.168.1.1 |
+-----------------------+
1 row in set (0.00 sec)
上面兩個函數的主要作用是對IP的相互轉化,它可以實現ip地址的比較,比如某個表裏存了很多IP地址,你如要想要找到ip在‘192.168.1.3’和‘192.168.1.20’之間一共有多少個IP地址時,如果直接用ip比較,那麼它會一個字符一個字符的比較,比較到3和2時由於3大於2導致這兩個ip之間是沒有其它ip的,這顯然不對,因此需要轉爲網絡字節序來進行比較:
select * from t where inet_aton(ip) >= inet_aton('192.168.1.3') and inet_aton(ip) <= inet_aton('192.168.1.20');
這樣就可以將表t中ip字段在指定值之間的所有IP查找出來。
6. PASSWORD(str)函數:返回字符串str的加密版本,一個41位長的字符串
注意:此函數只用來加密系統用戶的密碼,表內數據的加密需要使用MD5等函數。
mysql> select password('123456');
+-------------------------------------------+
| password('123456') |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
7. MD5(str)函數:返回字符串str的MD5值,可對數據加密
mysql> select MD5('123456');
+----------------------------------+
| MD5('123456') |
+----------------------------------+
| e10adc3949ba59abbe56e057f20f883e |
+----------------------------------+
1 row in set (0.00 sec)
MySQL中還有很多非常有用的內建函數,後面遇到再補充,平時在使用時注意查看MySQL內是否有相應函數,使用它們可以極大提高效率。