MySql基本函数

 数值函数

  1. ROUND(a, b):对数值a,保留b位小数
  2. CEILING(a):对数值a向上取整
  3. FLOOR(a):对数值a向下取整
  4. ABS(a):对数值a取绝对值
  5. RAND():取得0-1间的随机值

字符串函数

1
SELECT strFunction();
  1. LENGTH(str):得到字符串str的长度
  2. UPPER(str):将字符串str全部转换成大写
  3. LOWER(str):全转小写
  4. L/RTRIM(str):移除字符串左/右边的空格或预设字符
  5. Trim(str): 删除字符串左右所有空格或于定义字符
  6. LEFT/RIGHT(str, num):取出从左边/右边开始的num个字符
1
2
SELECT LEFT('Kindergarten', 4) -- Kind
SELECT RIGHT('Kindergarten', 6) -- garten
  1. SUBSTRING(str, num1, num2):字符截取函数,num1代表起始位置(包含在内),num2代表长度,如果num2参数没赋值,那么默认获取从起始位置一直到字符串结束位置的字符。
1
2
SELECT SUBSTRING('Kindergarten', 1, 4) -- Kind
SELECT SUBSTRING('Kindergarten', 1, 4) -- Kind
  1. LOCATE(target_str, str):搜索str里的target_str,返回从左往右,target_str第一次出现在str的位置下标,搜索不区分大小写。如果target_str不存在str里,则返回0。
1
SELECT LOCATE('garten', ''Kindergarten'') --7 
  1. REPLACT(str, target_str, replace_str):替换一个字符或者字符串。从str里查找要替换的target_str,替换成replace_str。
1
SELECT REPLACE('Kindergarten', 'garten', 'garden') -- 'Kindergarden'
  1. CONCAT(str1, str2):用来串联str1,str2两个字符串。
1
SELECT CONCAT('Hakim ', 'Jabari') -- Hakim Jabari

日期函数

1
SELECT dateFunction();
  1. NOW():获取电脑上当前的日期时间

    1
    SELECT NOW(); --2021-04-04 09:31:48
  2. CURDATE:获取电脑上当前日期

    1
    SELECT CURDATE(); --2021-04-04
  3. CURTIME:获取当前时间

    1
    SELECT CURTIME(); -- 09:34:00
  4. YEAR/DAY/MONTH/HOUR/MINUTE/SECOND(function()):提取获取到的当前日期的年份/日期/月份/小时/分钟/秒

    1
    2
    3
    4
    5
    SELECT YEAR(NOW()),
    MONTH(NOW()),
    DAY(NOW()),
    MINUTE(NOW()),
    SECOND(NOW()); -- 用NOW能够提取时分秒,因为NOW返回的时间就有时分秒

  5. DAYNAME(FUNCTION()):返回字符串格式的星期数

    1
    2
    SELECT DAYNAME(NOW()),
    MONTHNAME(NOW());

  6. EXTRACT():它是sql标准语言的一部分,适用于其他DBMS,可以提取指定的

    1
    SELECT EXTRACT(YEAR FROM NOW()); -- 2021

格式化日期和时间

  1. DATE_FORMAT(date, format_str):date是日期值,format_str是格式字符串。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- SELECT DATE_FORMAT(NOW(),'%M %d %Y') -- April 05 2021
    -- SELECT DATE_FORMAT(NOW(),'%H:%i %p') -- 08:34 AM

    -- str_format params
    -- %y:获得年份的后两位 21
    -- %m:获得月份的后两位 04
    -- %d:获得日期 05
    -- %i:获得当前分钟值 33
    -- %p:获得pm或者am AM
    -- %Y:获得年份值 2021
    -- %M:获得字符月份值 April
    -- %H:获得当前小时值 08

计算日期和时间

  1. DATE_ADD(NOW(), INTERVAL 1 DAY/YEAR):想在日期基础上增加一天或者1小时,或者计算两天间的间隔可以用此函数。函数表达式表示可以给当前时间增加一天或一年。当传入的INTERVAL是负值时代表回到过去的日期。

    1
    2
    3
    4
    -- SELECT NOW() -- 2021-04-05 08:40:45
    -- SELECT DATE_ADD(NOW(),INTERVAL 1 DAY) -- 2021-04-06 08:41:32
    -- SELECT DATE_ADD(NOW(),INTERVAL 1 YEAR) -- 2022-04-05 08:42:42
    -- SELECT DATE_ADD(NOW(),INTERVAL -1 YEAR) -- 2020-04-05 08:42:58
  2. DATE_SUB(NOW(), INTERVAL 1 DAY/YEAR):在一个日期的基础上,减去另一个日期。

    1
    2
    3
    -- SELECT NOW() -- 2021-04-05 08:40:45
    -- SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR) -- 2020-04-05 08:44:58
    -- SELECT DATE_SUB(NOW(),INTERVAL -1 YEAR) -- 2022-04-05 08:45:18
  3. DATEDIFF('2019-01-03 09:00', '2019-01-04 10:00'):计算两个日期的间隔,只返回天数的间隔。

    1
    SELECT DATEDIFF('2022-01-02 09:00','2021-01-02 10:00') -- 365
  4. TIME_TO_SEC:返回从零点开始计算到当前时间的间隔时间,值是秒。

    1
    SELECT TIME_TO_SEC('09:00') - TIME_TO_SEC('08:58') -- 120

IFNULL & COALESCE

  1. IFNULL(selected_column, if_null_value):当select的selected_column为NULL时,就为将原本查询的NULL替换为if_null_value。
  2. COALESCE(selected_column, other_column, if_null_value):当select的selected_column为NULL时,返回other_column的值,如果other_column也是NULL,则返回if_null_value自定义的值。

IF函数

  1. IF(expression, first, second):判断一个列的值,如果符合表达式,则返回first值,否则返回second值,表达式可以是函数或任何值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    mysql> SELECT *
    -> FROM payments
    -> LIMIT 10;
    +------------+-----------+------------+------------+--------+----------------+
    | payment_id | client_id | invoice_id | date | amount | payment_method |
    +------------+-----------+------------+------------+--------+----------------+
    | 1 | 5 | 2 | 2019-02-12 | 8.18 | 1 |
    | 2 | 1 | 6 | 2019-01-03 | 74.55 | 1 |
    | 3 | 3 | 11 | 2019-01-11 | 0.03 | 1 |
    | 4 | 5 | 13 | 2019-01-26 | 87.44 | 1 |
    | 5 | 3 | 15 | 2019-01-15 | 80.31 | 1 |
    | 6 | 3 | 17 | 2019-01-15 | 68.10 | 1 |
    | 7 | 5 | 18 | 2019-01-08 | 32.77 | 1 |
    | 8 | 5 | 18 | 2019-01-08 | 10.00 | 2 |
    +------------+-----------+------------+------------+--------+----------------+
    8 rows in set (0.00 sec)

    mysql> SELECT
    -> client_id,
    -> invoice_id,
    -> date,
    -> IF(payment_method=1, "Online", "Offline")
    -> FROM payments
    -> LIMIT 10;
    +-----------+------------+------------+-------------------------------------------+
    | client_id | invoice_id | date | IF(payment_method=1, "Online", "Offline") |
    +-----------+------------+------------+-------------------------------------------+
    | 5 | 2 | 2019-02-12 | Online |
    | 1 | 6 | 2019-01-03 | Online |
    | 3 | 11 | 2019-01-11 | Online |
    | 5 | 13 | 2019-01-26 | Online |
    | 3 | 15 | 2019-01-15 | Online |
    | 3 | 17 | 2019-01-15 | Online |
    | 5 | 18 | 2019-01-08 | Online |
    | 5 | 18 | 2019-01-08 | Offline |
    +-----------+------------+------------+-------------------------------------------+
    8 rows in set (0.00 sec)

CASE运算符

  1. ```mysql
    CASE
    when [EXPRESSION] THEN [RETURN_VALUE] 
    when [EXPRESSION] THEN [RETURN_VALUE]
    when ...
    ELSE [RETURN_VALUE]
    
    END AS COLUMN_NAME
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    判断多个列的值,如果符合表达式,则返回对应的值,否则返回ELSE对应设置的值,表达式可以是函数或任何值。

    ```sql
    mysql> SELECT client_id,
    -> date,
    -> CASE
    -> WHEN (amount < 10) THEN "LOW_VALUE_C"
    -> WHEN (amount > 10) THEN "HIGH_VALUE_C"
    -> ELSE "UNKNOWN_C"
    -> END AS value_evaluate
    -> FROM payments
    -> LIMIT 10;
    +-----------+------------+----------------+
    | client_id | date | value_evaluate |
    +-----------+------------+----------------+
    | 5 | 2019-02-12 | LOW_VALUE_C |
    | 1 | 2019-01-03 | HIGH_VALUE_C |
    | 3 | 2019-01-11 | LOW_VALUE_C |
    | 5 | 2019-01-26 | HIGH_VALUE_C |
    | 3 | 2019-01-15 | HIGH_VALUE_C |
    | 3 | 2019-01-15 | HIGH_VALUE_C |
    | 5 | 2019-01-08 | HIGH_VALUE_C |
    | 5 | 2019-01-08 | UNKNOWN_C |
    +-----------+------------+----------------+
    8 rows in set (0.00 sec)