MySql基礎知識-----MySQL常用函式
MySQL中的常用函式分別為:
(1)字串函式
(2)數值函式
(3)日期和時間函式
(4)系統資訊函式
1. 使用字串函式
MySQL所支援字串函式如下表所示:
函式 | 功能 |
concat(str1,str2...strn) | 連線字串str1,str2.....strn為一個完整的字串 |
insert(str, x,y,instr) | 將字串str從第x位開始,y個字元長的子串替換為字串instr |
lower(str) | 將字串str中所有字母轉換為小寫 |
upper(str) | 將字串str中所有字母轉換為大寫 |
left(str,x) | 返回字串str最左邊的x個字元 |
right(str,x) | 返回字串str最右邊的x個字元 |
lpad(str,in,pad) | 使用字串pad對字串str的左邊進行填充,直到長度為n個字元長度 |
rpad(strain,pad) | 使用字串pad對字串str的右邊進行填充,直到長度為n個字元長度 |
ltrim(str) | 去掉字串str左邊的空格 |
rtrim(str) | 去掉字串str右邊的空格 |
repeat(str,x) | 返回字串str重複x次的結果 |
replace(str,a,b) | 使用字串b替換字串str中所有出現的字串a |
strcmp(str1,str2) | 比較字串str1和str2 |
trim(str) | 去掉字串str行頭和行尾的空格 |
substring(str, x,y) | 返回字串str中從x位置起y個字元長度的字串 |
1.1 合併字串函式CONCAT()和CONCAT_WS()
函式的CONACAT()的定義如下:
CONCAT(str1,str2...strn)
示例:mysql> select concat('My','S','QL') 合併後的字串;
+-----------------------+
| 合併後的字串 |
+-----------------------+
| MySQL |
+-----------------------+
1 row in set (0.00 sec)
注意:當傳入concat函式中的引數有一個值為NULL時,返回的結果值將為NULL。
函式CONCAT_WS()的定義如下:
CONCAT_WS(SEP,str1,str2....strn)
與函式CONCAT()X相比,多了一個表示表示分隔符的SEP引數,即不僅會將傳入的引數連線起來,還會通過分隔符將字串分割開,示例如下:
mysql> select concat_ws('-','2018','06','09') 合併後的字串;
+-----------------------+
| 合併後的字串 |
+-----------------------+
| 2018-06-09 |
+-----------------------+
1 row in set (0.00 sec)
注意:當傳入的第一個引數為NULL時,返回的結果值將為NULL;當傳入的引數值中包含NULL值時(第一個引數除外),返回的結果將忽略NULL值,示例略。
1.2 比較字串大小函式STRCMP()
語法形式如下:
STRCMP(str1,str2)
str1,str2 | 返回結果 |
str1>str2 | 1 |
str1=str2 | 0 |
str1<str2 | -1 |
示例略。
1.3 獲取字串長度函式LENGTH()和字元數函式CHAR_LENGTH()
函式LENGTH的自定如下:
LENGTH(str)
上述函式會獲取傳入的引數str的長度
函式CHAR_LENGTH()的定義如下:
CHAR_LENGTH(str)
上述函式會獲取傳入的引數str的字元數
示例如下:
mysql> select length('canvas') 計算英文長度,length('星期以') 計算中文長度,char_length('canvas') 計算英文字元數,char_length("星期三") 計算中文字元數;
+--------------------+--------------------+-----------------------+-----------------------+
| 計算英文長度 | 計算中文長度 | 計算英文字元數 | 計算中文字元數 |
+--------------------+--------------------+-----------------------+-----------------------+
| 6 | 9 | 6 | 3 |
+--------------------+--------------------+-----------------------+-----------------------+
1 row in set (0.00 sec)
1.4 查詢字串
MySQL提供了豐富的函式去查詢字串的位置,分別為FIND_IN_SET(),FIELD(),LOCATE(),POSITION()和INSERT()函式。
1.4.1 返回字串位置的FIND_IN_SET()函式
函式語法形式如下:
FIND_IN_SET(str1,str2)
上述函式將會返回在字串str2中與str1相匹配的字串的位置,引數str2字串中將包含若干個用逗號隔開的字串。
示例如下:
mysql> select find_in_set('MySQL','Hello,world,MySQL,Tokyo') as find_in_set_function;
+----------------------+
| find_in_set_function |
+----------------------+
| 3 |
+----------------------+
1 row in set (0.00 sec)
1.4.2 返回指定指定字串位置的FIELD()函式
函式定義如下:
FIELD(str,str1,str2....)
上述函式將會返回第一個與字串str匹配的字串的位置。
示例如下:
mysql> select field('MySQL','Str','Good','MySQL','SQLLite') as field_function;
+----------------+
| field_function |
+----------------+
| 3 |
+----------------+
1 row in set (0.00 sec)
1.4.3 返回子字串相匹配的開始位置
MySQL中可以通過3個函式獲取子字串相匹配的開始位置,分別為LOCATE(),POSITION()和INSTR()函式,LOCATE()函式定義如下:
LOCATE(str1,str)
上述函式將返回引數str中字串str1的開始位置
其他兩個函式定義如下:
POSITION(str1 IN str)
和INSTR(str,str1)
示例如下:mysql> select locate('MySQL','Hello,Happy to learn MySQL by myself') as locate_function,position('MySQL' in 'Hello,Happy to learn MySQL by myself') as position_function,instr('Hello,Happy to learn MySQL by myself','MySQL') as instr_function;
+-----------------+-------------------+----------------+
| locate_function | position_function | instr_function |
+-----------------+-------------------+----------------+
| 22 | 22 | 22 |
+-----------------+-------------------+----------------+
1 row in set (0.00 sec)
1.4.4 返回指定位置的字串的ELT()函式
MySQL中可以通過ELT()函式獲取指定位置的字串,ELT()函式的定義如下:
ELT(n,str1,str2.....)
上述函式將會返回第n個字串。
示例如下:
mysql> select elt(3,'MySQL','Hell','Happy',' to ','learn',' MySQL',' by', 'myself') as elt_function;
+--------------+
| elt_function |
+--------------+
| Happy |
+--------------+
1 row in set (0.00 sec)
1.4.5 選擇字串的MAKE_SET()函式
MySQL中可以通過MAKE_SET()函式獲取字串,函式定義如下:
MAKE_SET(num,str1,str2.....strn)
上述函式首先會將數值num轉換為二進位制數,然後按照二進位制數從引數str1,str2,.......,strn中選取相應的字串。在通過二進位制數選擇字串時,按從左到右的順序讀取該值,如果值為1選擇該字串,否則將不選擇字串。
示例如下:
mysql> select bin(5) 二進位制數,make_set(5,'MySQL','Oracle','SQL Server','SQLite') 選取後的字串;
+--------------+-----------------------+
| 二進位制數 | 選取後的字串 |
+--------------+-----------------------+
| 101 | MySQL,SQL Server |
+--------------+-----------------------+
1 row in set (0.00 sec)
1.5 從現有字串中擷取子字串
MySQL中擷取子字串的函式有LEFT(),RIGHT(),SUBSTRING()和MID()。
1.5.1 從左邊或右邊擷取子字串
MySQL中可以通過LEFT()函式獲取字串中從左邊數的部分字串,可以通過RIGHT()函式獲取字串中從右邊數的部分字串,LEFT()和RIGHT()函式的定義如下:
LEFT(str,num)
RIGHT(str,num)
上述函式會返回字串str中包含前num個字母(從左/右)的字串。示例如下:
mysql> select left('MySQL vs SQL-Server',5) 從左選取,right('MySQL vs SQL-Server',10) 從右選取;
+--------------+--------------+
| 從左選取 | 從右選取 |
+--------------+--------------+
| MySQL | SQL-Server |
+--------------+--------------+
1 row in set (0.00 sec)
1.5.2 擷取指定位置和長度子字串
MySQL()中可以通過SUBSTRING()和MID()函式擷取指定位置和長度的子字串,函式定義如下:SUBSTRING(str,num,len)
上述函式會返回字串str中的第num個位置開始長度為len的子字串。MID()函式定義如下:
MID(str,num,len)
示例如下:mysql> select substring('One of the best database is MySQL',12,4) subtring_function;
+-------------------+
| subtring_function |
+-------------------+
| best |
+-------------------+
1 row in set (0.00 sec)
1.6 替換字串
MySQL中可以使用INSERT()和REPLACE()函式實現替換字串的功能。
1.6.1 使用INSERT()函式
函式定義如下:
INSERT(str,pos,len,newstr)
上述函式會將字串str中的pos位置開始的長度為len的字串用新字串newstr來替換。
可能出現的情況如下:
(1)引數pos超過字串長度,則返回值為原始字串。
(2)引數len的長度大於原來字串中所剩字串的長度,則從pos位置開始全部替換。
(3)任意引數為NULL時,返回值為NULL。
示例如下:
mysql> select insert('Today i want to date,hhhhhh',22,6,'that is not could happen,sadness') insert_function;
+-------------------------------------------------------+
| insert_function |
+-------------------------------------------------------+
| Today i want to date,that is not could happen,sadness |
+-------------------------------------------------------+
1 row in set (0.00 sec)
1.6.2 使用REPLACE()函式
函式定義如下:
REPLACE(str,substr,newstr)
上述函式會將字串str中的子字串substr用字串newstr來替換,示例略。2 使用數值函式
MySQL中常用數值函式如下:
函式 | 功能 |
ABS(x) | 返回數值x的絕對值 |
CEIL(x) | 返回大於或者等於x的最小整數值 |
FLOOR(x) | 返回小於或者等於x的最大整數值 |
MOD(x,y) | 返回x除以y的餘數 |
RAND() | 返回0-1內的隨機數 |
ROUND(x,y) | 返回數值x的四捨五入後有y位小數的數值 |
TRUNCATE(x,y) | 返回數值x且截斷為y為小數的數值 |
2.1 獲取隨機數
MySQL中可以通過RAND()和RAND(x)函式來獲取隨機數。上述兩個函式都會返回0~1之間的隨機數,其中RAND()函式返回的數是完全隨機的,而RAND(x)返回的隨機數值是相同的。
示例略。
2.2 擷取數值函式
MySQL中通過函式TRUNCATE()函式來實現對數值的小數位數進行擷取。函式定義如下:
TRUNCATE(x,y)
上述函式返回數值x保留到小數點後y位的值。示例如下:
mysql> select truncate(3.1415926,4);
+-----------------------+
| truncate(3.1415926,4) |
+-----------------------+
| 3.1415 |
+-----------------------+
1 row in set (0.00 sec)
2.3 四捨五入函式
MySQL中可以通過ROUND()函式實現四捨五入操作。函式定義如下:
ROUND(x)
上述函式會返回x經過四捨五入操作後的數值。
ROUND(x,y)
上述函式會返回數值x保留到小數點後y位的值,在具體擷取數值時需要進行四捨五入操作。
示例如下:
mysql> select round(3.14159) 單個引數的四捨五入操作,round(3.1415926,4) 兩個引數的四捨五入操作;
+-----------------------------------+-----------------------------------+
| 單個引數的四捨五入操作 | 兩個引數的四捨五入操作 |
+-----------------------------------+-----------------------------------+
| 3 | 3.1416 |
+-----------------------------------+-----------------------------------+
1 row in set (0.00 sec)
3 使用日期和時間函式
以下是MySQL中常用的日期和時間函式:
函式 | 功能 |
CURDATE() | 獲取當前日期 |
CURTIME() | 獲取當前時間 |
NOW() | 獲取當前的日期和時間 |
UNIX_TIMESTAMP(date) | 獲取日期date的UNIX時間戳 |
FROM_UNIXTIME() | 獲取UNIX時間戳的日期值 |
WEEK(date) | 返回日期date為一年中的第幾周 |
YEAR(date) | 返回日期date中的年份 |
HOUR(time) | 返回時間time的小時值 |
MINUTE(time) | 返回時間time的分鐘值 |
MONTHNAME(date) | 返回時間date的月份值 |
3.1 獲取當前日期和時間的函式
MySQL中獲取當前日期和時間的函式有NOW(),CURRENT_TIMESTAMP(),LOCALTIME()和SYSDATE(),這四個函式不僅會獲取當前的時間和日期,而且顯示的格式也一樣,具體使用時推薦使用NOW().
示例如下:
mysql> select now(),current_timestamp(),sysdate(),localtime();
+---------------------+---------------------+---------------------+---------------------+
| now() | current_timestamp() | sysdate() | localtime() |
+---------------------+---------------------+---------------------+---------------------+
| 2018-06-18 14:16:06 | 2018-06-18 14:16:06 | 2018-06-18 14:16:06 | 2018-06-18 14:16:06 |
+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)
單獨獲取日期的函式有CURDATE()和CURRENT_DATE(),單獨獲取時間函式有CURTIME()和CURRENT_TIME(),示例略。
3.2 通過各種方式顯示日期和時間
最常用的顯示日期和時間的方式有UNIX和UTC。
3.2.1 通過UNIX方式顯示日期和時間
MySQL提供了UNIX_TIMESTAMP()函式返回時間戳格式的時間,FROM_UINIXTIME()函式將時間戳格式時間轉換為普通格式時間。
示例如下:
mysql> select now() 當前時間,unix_timestamp(now()) unix格式,from_unixtime(unix_timestamp(now())) 普通格式;
+---------------------+------------+---------------------+
| 當前時間 | unix格式 | 普通格式 |
+---------------------+------------+---------------------+
| 2018-06-18 14:23:24 | 1529303004 | 2018-06-18 14:23:24 |
+---------------------+------------+---------------------+
1 row in set (0.00 sec)
3.2.2 通過UTC方式顯示日期和時間
MySQL中提供了兩個函式UTC_TIME()和UTC_DATE()來實現時間和日期的UTC格式顯示。示例如下:
mysql> select utc_date() UTC日期,utc_time() UTC時間;
+------------+-----------+
| UTC日期 | UTC時間 |
+------------+-----------+
| 2018-06-18 | 06:25:54 |
+------------+-----------+
1 row in set (0.00 sec)
3.3 獲取日期和時間各個部分值
MySQL中提供了各種函式來獲取當前日期和時間的各部分值,具體使用見以下例子:mysql> select now() 當前時間,
-> year(now()) 年,
-> quarter(now()) 季度,
-> month(now()) 月,
-> week(now()) 星期,
-> dayofmonth(now()) 天,
-> hour(now()) 時,
-> minute(now()) 分,
-> second(now()) 秒;
+---------------------+------+--------+------+--------+------+------+------+------+
| 當前時間 | 年 | 季度 | 月 | 星期 | 天 | 時 | 分 | 秒 |
+---------------------+------+--------+------+--------+------+------+------+------+
| 2018-06-18 14:30:15 | 2018 | 2 | 6 | 24 | 18 | 14 | 30 | 15 |
+---------------------+------+--------+------+--------+------+------+------+------+
1 row in set (0.00 sec)
3.3.1 關於月的函式
函式MONTH()返回日期和時間中的月份,取值範圍為1~12。在使用時如果想顯示月份的英文名稱而不是簡單的數值,可以使用MONTHNAME()函式。使用如下:
mysql> select now() 當前時間,month(now()) 月, monthname(now()) 月;
+---------------------+------+------+
| 當前時間 | 月 | 月 |
+---------------------+------+------+
| 2018-06-18 14:35:05 | 6 | June |
+---------------------+------+------+
1 row in set (0.00 sec)
3.3.2 關於星期的函式
MySQL提供了WEEK()和WEEKOFYEAR()函式用來顯示當前星期是當前年中的第幾個星期。初次之外MySQL還提供瞭如下幾個函式用來顯示星期幾或是其他的英文名字:
(1)DAYNAME()函式:返回日期和時間中星期的英文名
(2)DAYOFWEEK()函式:返回日期和時間中星期是星期幾,返回值的取值範圍是1~7,如果返回值是1則表示星期日,2表示星期一,依此類推。
(3)WEEKDAY()返回日期和時間中星期是星期幾,返回的取值範圍是0~6。0表示星期一,1表示星期二,依此類推。
示例如下:
mysql> select now() 當前日期和時間,
-> week(now()) 年中的第一個星期,
-> weekofyear(now()) 年中的第幾個星期,
-> dayname(now()) 星期,
-> dayofweek(now()) 星期,
-> weekday(now()) 星期;
+-----------------------+--------------------------+--------------------------+--------+--------+--------+
| 當前日期和時間 | 年中的第一個星期 | 年中的第幾個星期 | 星期 | 星期 | 星期 |
+-----------------------+--------------------------+--------------------------+--------+--------+--------+
| 2018-06-18 14:45:54 | 24 | 25 | Monday | 2 | 0 |
+-----------------------+--------------------------+--------------------------+--------+--------+--------+
1 row in set (0.00 sec)
3.3.3 關於天的函式
MySQL提供了函式DAYOFMONTH()和DAYOFYEAR(),分別用來顯示當天是當前月的第幾天和當前年的第幾天,示例如下:
mysql> select dayofmonth(now()) 當前月的第幾天,
-> dayofyear(now()) 當前年的第幾天;
+-----------------------+-----------------------+
| 當前月的第幾天 | 當前年的第幾天 |
+-----------------------+-----------------------+
| 18 | 169 |
+-----------------------+-----------------------+
1 row in set (0.00 sec)
3.3.4 獲取指定值的EXTRACT()函式
獲取日期和時間的各部分值,需要記住的函式較多,不方便記憶,於是MySQL提供了EXTRACT()函式,函式語法如下:
EXTRACT(type FROM date)
上述函式會從日期和時間引數date中獲取指定型別引數type值,關於type引數的取值可以是:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND。示例如下:mysql> select now() 當前日期和時間, extract(year from now()) 年, extract(month from now()) 月, extract(day from now()) 日, extract(hour from now()) 小時, extract(minute from now()) 分鐘, extract(second from now()) 秒;
+-----------------------+------+------+------+--------+--------+------+
| 當前日期和時間 | 年 | 月 | 日 | 小時 | 分鐘 | 秒 |
+-----------------------+------+------+------+--------+--------+------+
| 2018-06-18 15:05:25 | 2018 | 6 | 18 | 15 | 5 | 25 |
+-----------------------+------+------+------+--------+--------+------+
1 row in set (0.00 sec)
3.4 計算日期和時間的函式
MySQL中計算日期和時間的函式分為兩種,第一種是計算與預設時期和時間相互操作的函式,第二種是計算與指定日期和時間相互操作的函式。
3.4.1 與預設日期和時間操作
MySQL提供了兩個函式用來實現與預設日期和時間的操作:
(1)TO_DAYS(date)函式:該函式計算日期引數date與預設日期和時間(0000年1月1日)之間相隔天數。
(2)FROM_DAYS(number)函式:該函式計算從預設日期和時間(0000年1月1日)開始經歷number天后的日期和時間。
示例如下:
mysql> select now() 當前日期和時間,
-> to_days(now()) 相隔天數,
-> from_days(to_days(now())) 一段時間後的日期和時間;
+-----------------------+--------------+-----------------------------------+
| 當前日期和時間 | 相隔天數 | 一段時間後的日期和時間 |
+-----------------------+--------------+-----------------------------------+
| 2018-06-18 15:36:20 | 737228 | 2018-06-18 |
+-----------------------+--------------+-----------------------------------+
有時需要獲取指定兩個日期之間的天數,MySQL提供了函式DATEDIFF()函式,該函式定義如下:
DATEDIFF(date1,date2)
上述函式會返回日期引數date1和date2之間相隔的天數,使用方法如下:mysql> select datediff(now(),'2018-06-10') datediff_function;
+-------------------+
| datediff_function |
+-------------------+
| 8 |
+-------------------+
1 row in set (0.00 sec)
3.4.2與指定日期和時間操作
MySQL提供了兩個函式用來實現與指定日期操作:
(1)ADDDATE(date,n)函式:計算日期引數date加上n天后的日期。
(2)SUBDATE(date,n)函式:計算日期引數date減去n天后的日期。
示例如下:
mysql> select now() 當前日期和時間,adddate(now(),5) 加上5天后的日期,subdate(now(),5) 減去5天后的日期;
+-----------------------+------------------------+------------------------+
| 當前日期和時間 | 加上5天后的日期 | 減去5天后的日期 |
+-----------------------+------------------------+------------------------+
| 2018-06-18 15:48:11 | 2018-06-23 15:48:11 | 2018-06-13 15:48:11 |
+-----------------------+------------------------+------------------------+
1 row in set (0.00 sec)
ADDDATE()和SUNBDATE()函式除了可以接受上述引數之外,還可以接受其他引數。定義如下:
ADDDATE(d,INTERVAL expr type)
SUBDATE(d,INTERVAL expr type)
上述函式返回日期引數加上/減去一段時間後的日期,表示式expr決定了時間長度,引數type決定所操作的物件。其中type的值如下表所示:
type的值 | 含義 | expr表示式 |
YEAR | 年 | YY |
MONTH | 月 | MM |
DAY | 日 | DD |
HOUR | 時 | hh |
MINUTE | 分 | mm |
SECOND | 秒 | ss |
YEAR_MONTH | 年和月 | YY和MM之間用任意符號隔開 |
DAY_HOUR | 日和小時 | DD和hh之間用任意符號隔開 |
DAY_MINUTE | 日和分鐘 | DD和mm之間用任意符號隔開 |
DAY_SECOND | 日和秒 | DD和ss之間用任意符號隔開 |
HOUR_MINUTE | 小時和分鐘 | hh和mm之間用任意符號隔開 |
HOUR_SECOND | 小時和秒 | hh和ss之間用任意符號隔開 |
MINUTE_SECOND | 分鐘和秒 | mm和ss之間用任意符號隔開 |
mysql> select now() 當前日期和時間, adddate(now(),interval '2,3' year_month) 2年3個月後的日期和時間, subdate(now(), interval '2,3' year_month) 2年3個月前的日期和時間;
+-----------------------+----------------------------------+----------------------------------+
| 當前日期和時間 | 2年3個月後的日期和時間 | 2年3個月前的日期和時間 |
+-----------------------+----------------------------------+----------------------------------+
| 2018-06-18 16:45:45 | 2020-09-18 16:45:45 | 2016-03-18 16:45:45 |
+-----------------------+----------------------------------+----------------------------------+
1 row in set (0.00 sec)
在MySQL中,除了可以使用ADDDATE()和SUBDATE()函式來操作指定日期之外,還可以通過ADDTIEME()和SUBTIME()函式來實現操作時間,作用如下:
(1)ADDTIME(time,n)函式:計算時間引數time加上n秒後的時間
(2)SUBTIME(time,n)函式:計算時間引數time減去n秒後的時間
使用如下:
mysql> select curtime() 當前時間, addtime(curtime(),30) 加上30秒後的時間, subtime(curtime(),30) 減去30秒後的時候;
+--------------+-------------------------+-------------------------+
| 當前時間 | 加上30秒後的時間 | 減去30秒後的時候 |
+--------------+-------------------------+-------------------------+
| 16:51:59 | 16:52:29 | 16:51:29 |
+--------------+-------------------------+-------------------------+
1 row in set (0.00 sec)