1. 程式人生 > >MySql基礎知識-----MySQL常用函式

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>str21
str1=str20
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表示式
YEARYY
MONTHMM
DAYDD
HOURhh
MINUTEmm
SECONDss
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)