MySQL 經常使用函數

前言

  • 在 MySQL 數據庫中,函數能夠用在 select 語句及其子句(例如 where、order by、having 等)中,也能夠用在 update、delete 語句及其子句中。

一、字符串函數

  • 字符串函數是最經常使用的一種函數,在 MySQL 中,字符串函數一樣是最豐富的一類函數。
  • 在程序上,字符串的編號從 0 開始,但在 MySQL 中,從 1 開始。mysql

    函數 功能
    concat(s1, s2, ..., sn) 鏈接 s1, s2, ..., sn 爲一個字符串
    insert(str, x, y, instr) 將字符串 str 從 x 位置開始,y 個字符長的字串替換爲字符串 instr
    lower(str) 將字符串 str 中全部字符變爲小寫
    upper(str) 將字符串 str 中全部字符變爲大寫
    lpad(str, n, pad) 用字符串 pad 對 str 最左邊進行填充,直到長度爲 n 個字符長度
    rpad(str, n, pad) 用字符串 pad 對 str 最右邊進行填充,直到長度爲 n 個字符長度
    repeat(str, x) 返回 str 重複 x 次的結果
    replace(str, a, b) 用字符串 b 替換字符串 str 中全部出現的字符串 a
    strcmp(s1, s2) 比較字符串 s1 和 s2,s1 比 s2 小,返回 -1;s1 與 s2 相等,返回 0;s1 比 s2 大,返回 1
    ltrim(str) 去掉字符串左側的空格
    rtrim(str) 去掉字符串右側的空格
    trim(str) 去掉字符串 str 行尾和行頭的空格
    left(str, x) 返回字符串 str 最左邊的 x 個字符
    right(str, x) 返回字符串 str 最右邊的 x 個字符
    substring(str, x, y) 返回從字符串 str x 位置起 y 個字符長度的子串
  • 示例sql

    > select concat('aaa', 'bbb', 'ccc'), concat('aaa', null);
    
        +-----------------------------+---------------------+
        | concat('aaa', 'bbb', 'ccc') | concat('aaa', null) |
        +-----------------------------+---------------------+
        | aaabbbccc                   | NULL                |
        +-----------------------------+---------------------+
        1 row in set (0.00 sec)
    
    > select insert('beijing2008you', 12, 3, 'me');
    
        +---------------------------------------+
        | insert('beijing2008you', 12, 3, 'me') |
        +---------------------------------------+
        | beijing2008me                         |
        +---------------------------------------+
        1 row in set (0.00 sec)
    
    > select lower('BEIJING2008'), upper('beijing2008');
    
        +----------------------+----------------------+
        | lower('BEIJING2008') | upper('beijing2008') |
        +----------------------+----------------------+
        | beijing2008          | BEIJING2008          |
        +----------------------+----------------------+
        1 row in set (0.00 sec)
    
    > 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)
    
    > select repeat('mysql ', 3);
    
        +---------------------+
        | repeat('mysql ', 3) |
        +---------------------+
        | mysql mysql mysql   |
        +---------------------+
        1 row in set (0.00 sec)
    
    > select replace('beijing_2010', '_2010', '2008');
    
        +------------------------------------------+
        | replace('beijing_2010', '_2010', '2008') |
        +------------------------------------------+
        | beijing2008                              |
        +------------------------------------------+
        1 row in set (0.00 sec)
    
    > select strcmp('a', 'b'), strcmp('b', 'b'), strcmp('c', 'b');
    
        +------------------+------------------+------------------+
        | strcmp('a', 'b') | strcmp('b', 'b') | strcmp('c', 'b') |
        +------------------+------------------+------------------+
        |               -1 |                0 |                1 |
        +------------------+------------------+------------------+
        1 row in set (0.00 sec)
    
    > select ltrim(' |beijing'), rtrim('beijing| ');
    
        +--------------------+--------------------+
        | ltrim(' |beijing') | rtrim('beijing| ') |
        +--------------------+--------------------+
        | |beijing           | beijing|           |
        +--------------------+--------------------+
        1 row in set (0.00 sec)
    
    > select trim(' $ beijing2008 $ ');
    
        +---------------------------+
        | trim(' $ beijing2008 $ ') |
        +---------------------------+
        | $ beijing2008 $           |
        +---------------------------+
        1 row in set (0.00 sec)
    
    > select left('beijing2008', 7), left('beijing', null), right('beijing2008', 4);
    
        +------------------------+-----------------------+-------------------------+
        | left('beijing2008', 7) | left('beijing', null) | right('beijing2008', 4) |
        +------------------------+-----------------------+-------------------------+
        | beijing                | NULL                  | 2008                    |
        +------------------------+-----------------------+-------------------------+
        1 row in set (0.00 sec)
    
    > select substring('beijing2008', 8, 4), substring('beijing2008', 1, 7);
    
        +--------------------------------+--------------------------------+
        | substring('beijing2008', 8, 4) | substring('beijing2008', 1, 7) |
        +--------------------------------+--------------------------------+
        | 2008                           | beijing                        |
        +--------------------------------+--------------------------------+
        1 row in set (0.00 sec)

二、數值函數

  • MySQL 中另一類很重要的函數就是數值函數,這些函數能處理不少數值方面的運算。數據庫

    函數 功能
    abs(x) 返回 x 的絕對值
    ceil(x) 返回大於 x 的最小整數值
    floor(x) 返回小於 x 的最大整數值
    mod(x, y) 返回 x/y 的模,模數和被模數任何一個爲 NULL 結果都爲 NULL
    rand() 返回 0~1 內的隨機值
    round(x, y) 返回參數 x 四捨五入的有 y 位小數的值,若是不寫 y,則默認 y 爲 0,即將 x 四捨五入後取整
    truncate(x, y) 返回數字 x 截斷爲 y 位小數的結果
  • 示例網絡

    > select abs(-0.8), abs(0.8);
    
        +-----------+----------+
        | abs(-0.8) | abs(0.8) |
        +-----------+----------+
        |       0.8 |      0.8 |
        +-----------+----------+
        1 row in set (0.00 sec)
    
    > select ceil(-0.8), ceil(0.8);
    
        +------------+-----------+
        | ceil(-0.8) | ceil(0.8) |
        +------------+-----------+
        |          0 |         1 |
        +------------+-----------+
        1 row in set (0.01 sec)
    
    > select floor(-0.8), floor(0.8);
    
        +-------------+------------+
        | floor(-0.8) | floor(0.8) |
        +-------------+------------+
        |          -1 |          0 |
        +-------------+------------+
        1 row in set (0.00 sec)
    
    > select mod(15, 10), mod(1, 11), mod(null, 10);
    
        +-------------+------------+---------------+
        | mod(15, 10) | mod(1, 11) | mod(null, 10) |
        +-------------+------------+---------------+
        |           5 |          1 |          NULL |
        +-------------+------------+---------------+
        1 row in set (0.00 sec)
    
    > select rand(), rand() * 100, ceil(rand() * 100);
    
        +--------------------+--------------------+--------------------+
        | rand()             | rand() * 100       | ceil(rand() * 100) |
        +--------------------+--------------------+--------------------+
        | 0.6922199192384444 | 37.314064183564916 |                 79 |
        +--------------------+--------------------+--------------------+
        1 row in set (0.00 sec)
    
    > 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)
    
    > select round(1.235, 2), truncate(1.235, 2);
    
        +-----------------+--------------------+
        | round(1.235, 2) | truncate(1.235, 2) |
        +-----------------+--------------------+
        |            1.24 |               1.23 |
        +-----------------+--------------------+
        1 row in set (0.00 sec)

三、日期和時間函數

  • 經常使用日期和時間函數函數

    函數 功能
    curdate() 返回當前日期,只包含年月日
    curtime() 返回當前時間,只包含時分秒
    now() 返回當前日期和時間,年月日時分秒全都包含
    unix_timestamp(date) 返回日期 date 的 unix 時間戳
    from_unixtime(timestamp) 返回 unix 時間戳的日期和時間值,和 unix_timestamp(date) 互逆
    week(date) 返回日期 date 爲一年中的第幾周
    year(date) 返回日期 date 的年份
    hour(time) 返回 time 的小時值
    minute(time) 返回 time 的分鐘值
    monthname(date) 返回 date 的月份名
    date_format(date, fmt) 返回按字符串 fmt 格式化日期 date 值
    date_add(date, interval expr type) 返回與 date 相差 interval 時間段的日期,interval 是間隔類型關鍵字,expr 是一個表達式,這個表達式對應後面的類型,type 是日期間隔類型
    datediff(expr, expr2) 返回起始時間 expr 和結束時間 expr2 之間的天數
  • 日期和時間格式加密

    格式符 格式說明
    %S、%s 兩位數字形式的秒(00, 01, ..., 59)
    %i 兩位數字形式的分(00, 01, ..., 59)
    %H 兩位數字形式的小時,24 小時(00, 01, ..., 23)
    %h、%I 兩位數字形式的小時,12 小時(00, 01, ..., 12)
    %k 數字形式的小時,24 小時(0, 1, ..., 23)
    %l 數字形式的小時,12 小時(0, 1, ..., 12)
    %T 24 小時的時間形式(hh:mm:ss)
    %r 12 小時的時間形式(hh:mm:ss AM
    %p AM 或 PM
    %W 一週中每一天的名稱(Sunday, Monday, ..., Saturday)
    %a 一週中每一天的名稱縮寫(Sum, Mon, ..., Sat)
    %d 兩位數字表示月中的天數(00, 01, ..., 31)
    %e 數字形式表示月中的天數(1, 2, ..., 31)
    %D 英文後綴表示月中的天數(1st, 2nd, 3rd, ...)
    %w 以數字形式表示週中的天數(0 = Sunday, 1 = Monday, ..., 6 = Saturday)
    %j 以 3 位數字表示年中的天數(001, 002, ..., 366)
    %U 周(0, 1, 52),其中 Sunday 爲週中的第一天
    %u 周(0, 1, 52),其中 Monday 爲週中的第一天
    %M 月名(January, February, ..., December)
    %b 縮寫的月名(January, February, ..., December)
    %m 兩位數字表示的月份(01, 02, ..., 12)
    %c 數字表示的月份(1, 2, ..., 12)
    %Y 四爲數字表示的年份
    %y 兩位數字表示的年份
    %% 直接值 "%"
  • 日期間隔類型unix

    表達式類型 描述 格式
    HOUR 小時 hh
    MINUTE mm
    SECOND ss
    YEAR YY
    MONTH MM
    DAY DD
    YEAR_MONTH 年和月 YY-MM
    DAY_HOUR 日和小時 DD hh
    DAY_MINUTE 日和分鐘 DD hh:mm
    DAY_SECOND 日和秒 DD hh:mm:ss
    HOUR_MINUTE 小時和分 hh:mm
    HOUR_SECOND 小時和秒 HH:ss
    MINUTE_SECOND 分和秒 mm:ss
  • 示例code

    > select curdate();
    
        +------------+
        | curdate()  |
        +------------+
        | 2018-06-20 |
        +------------+
        1 row in set (0.00 sec)
    
    > select curtime();
    
        +-----------+
        | curtime() |
        +-----------+
        | 15:27:19  |
        +-----------+
        1 row in set (0.00 sec)
    
    > select now();
    
        +---------------------+
        | now()               |
        +---------------------+
        | 2018-06-20 15:28:12 |
        +---------------------+
        1 row in set (0.00 sec)
    
    > select unix_timestamp(now());
    
        +-----------------------+
        | unix_timestamp(now()) |
        +-----------------------+
        |            1529479736 |
        +-----------------------+
        1 row in set (0.00 sec)
    
    > select from_unixtime(1529479736);
    
        +---------------------------+
        | from_unixtime(1529479736) |
        +---------------------------+
        | 2018-06-20 15:28:56       |
        +---------------------------+
        1 row in set (0.00 sec)
    
    > select week(now()), year(now());
    
        +-------------+-------------+
        | week(now()) | year(now()) |
        +-------------+-------------+
        |          24 |        2018 |
        +-------------+-------------+
        1 row in set (0.00 sec)
    
    > select hour(curtime()), minute(curtime());
    
        +-----------------+-------------------+
        | hour(curtime()) | minute(curtime()) |
        +-----------------+-------------------+
        |              15 |                37 |
        +-----------------+-------------------+
        1 row in set (0.00 sec)
    
    > select monthname(now());
    
        +------------------+
        | monthname(now()) |
        +------------------+
        | June             |
        +------------------+
        1 row in set (0.00 sec)
    
    > select date_format(now(), '%M, %D, %Y');
    
        +----------------------------------+
        | date_format(now(), '%M, %D, %Y') |
        +----------------------------------+
        | June, 20th, 2018                 |
        +----------------------------------+
        1 row in set (0.00 sec)
    
    # 第 1 列返回了當前日期時間,第 2 列返回距離當前日期 31 天后的日期時間,第 3 列返回距離當前日期一年兩個月後的日期時間
    > 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-06-20 15:44:16 | 2018-07-21 15:44:16 | 2019-08-20 15:44:16    |
        +---------------------+---------------------+------------------------+
        1 row in set (0.00 sec)
    
    # 第 1 列返回了當前日期時間,第 2 列返回距離當前日期 31 天前的日期時間,第 3 列返回距離當前日期一年兩個月前的日期時間
    > 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-06-20 15:46:56 | 2018-05-20 15:46:56 | 2017-04-20 15:46:56    |
        +---------------------+---------------------+------------------------+
        1 row in set (0.00 sec)
    
    > select datediff(now(), '2008-08-08');
    
        +-------------------------------+
        | datediff(now(), '2008-08-08') |
        +-------------------------------+
        |                          3603 |
        +-------------------------------+
        1 row in set (0.00 sec)

四、流程函數

  • 流程函數也是很經常使用的一類函數,用戶可使用這類函數在一個 SQL 語句中實現條件選擇,這樣作可以提升語句的效率。orm

    函數 功能
    if(value, t f) 若是 value 是真,返回 t,不然返回 f
    ifnull(value1, value2) 若是 value1 不爲空,返回 value1,不然返回 value2
    case when [value] then [result] ... else [default] end 若是 value 是真,返回 result,不然返回 default
    case [expr] when [value] then [result] ... else [default] end 若是 expr 等於 value,返回 result,不然返回 default
  • 示例ip

    > select salary, if(salary > 2000, 'high', 'low') from salary;
    
        +---------+----------------------------------+
        | salary  | if(salary > 2000, 'high', 'low') |
        +---------+----------------------------------+
        | 1000.00 | low                              |
        | 2000.00 | low                              |
        | 3000.00 | high                             |
        | 4000.00 | high                             |
        | 5000.00 | high                             |
        |    NULL | low                              |
        +---------+----------------------------------+
        6 rows in set (0.00 sec)
    
    > select salary, ifnull(salary, 0) from salary;
    
        +---------+-------------------+
        | salary  | ifnull(salary, 0) |
        +---------+-------------------+
        | 1000.00 |           1000.00 |
        | 2000.00 |           2000.00 |
        | 3000.00 |           3000.00 |
        | 4000.00 |           4000.00 |
        | 5000.00 |           5000.00 |
        |    NULL |              0.00 |
        +---------+-------------------+
        6 rows in set (0.00 sec)
    
    > select 
        salary, 
        case when salary <= 2000 then 'low' else 'high' end 
      from 
        salary;
    
        +---------+-----------------------------------------------------+
        | salary  | case when salary <= 2000 then 'low' else 'high' end |
        +---------+-----------------------------------------------------+
        | 1000.00 | low                                                 |
        | 2000.00 | low                                                 |
        | 3000.00 | high                                                |
        | 4000.00 | high                                                |
        | 5000.00 | high                                                |
        |    NULL | high                                                |
        +---------+-----------------------------------------------------+
        6 rows in set (0.00 sec)
    
    > select 
        salary, 
        case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end 
      from 
        salary;
    
        +---------+-----------------------------------------------------------------------+
        | salary  | case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end |
        +---------+-----------------------------------------------------------------------+
        | 1000.00 | low                                                                   |
        | 2000.00 | mid                                                                   |
        | 3000.00 | high                                                                  |
        | 4000.00 | high                                                                  |
        | 5000.00 | high                                                                  |
        |    NULL | high                                                                  |
        +---------+-----------------------------------------------------------------------+
        6 rows in set (0.00 sec)

五、其它經常使用函數

  • MySQL 提供的函數很豐富,除了前面介紹的字符串函數、數字函數、日期函數、流程函數之外還有不少其餘函數。

    函數 功能
    database() 返回當前數據庫名
    version() 返回當前數據庫版本
    user() 返回當前登陸用戶名
    inet_aton(ip) 返回 IP 地址的數字表示,將字符串的IP地址轉換爲數字表示的網絡字節序,這樣能夠更方便地進行 IP 或者網段的比較
    inet_ntoa(num) 返回數字表明的 IP 地址
    password(str) 返回字符串 str 的加密版本,一個 41 位長的字符串,Removed in MySQL 8.0.11.
    md5() 返回字符串 str 的 MD5 值,經常使用來對應用中的數據進行加密
  • 示例

    > select database();
    
        +------------+
        | database() |
        +------------+
        | test       |
        +------------+
        1 row in set (0.00 sec)
    
    > select version();
    
        +-----------+
        | version() |
        +-----------+
        | 8.0.11    |
        +-----------+
        1 row in set (0.01 sec)
    
    > select user();
    
        +----------------+
        | user()         |
        +----------------+
        | root@localhost |
        +----------------+
        1 row in set (0.00 sec)
    
    > select inet_aton('192.16.0.100');
    
        +---------------------------+
        | inet_aton('192.16.0.100') |
        +---------------------------+
        |                3222274148 |
        +---------------------------+
        1 row in set (0.00 sec)
    
    > select inet_ntoa(3222274148);
    
        +-----------------------+
        | inet_ntoa(3222274148) |
        +-----------------------+
        | 192.16.0.100          |
        +-----------------------+
        1 row in set (0.00 sec)
    
    > select PASSWORD('123456');
    
        +-------------------------------------------+
        | PASSWORD('123456')                        |
        +-------------------------------------------+
        | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
        +-------------------------------------------+
        1 row in set (0.08 sec)
    
    > select md5('12345');
    
        +----------------------------------+
        | md5('12345')                     |
        +----------------------------------+
        | 827ccb0eea8a706c4c34a16891f84e7b |
        +----------------------------------+
        1 row in set (0.00 sec)
相關文章
相關標籤/搜索