MySQL(三)--------常用函數

         使用函數的方便性我就不多說了,在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內是否有相應函數,使用它們可以極大提高效率。

 

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