zoukankan      html  css  js  c++  java
  • MySQL学习总结之路(第五章:函数)

    目录

    MySQL学习总结之路(第一章:服务与数据库管理)

    MySQL学习总结之路(第二章:表)

    MySQL学习总结之路(第三章:数据类型)

    MySQL学习总结之路(第四章:运算符)

    MySQL学习总结之路(第五章:函数)

    MySQL学习总结之路(第六章:表类型【存储引擎】的选择)

    1、MySQL中常用字符串函数

    函数 功能
    CANCAT(S1,S2,…Sn) 
    连接 S1,S2,…Sn 为一个字符串
    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,n ,pad) 
    用字符串 pad 对 str 最左边进行填充,直到长度为 n 个字符长度
    RPAD(str,n,pad) 
    用字符串 pad 对 str 最右边进行填充,直到长度为 n 个字符长度
    LTRIM(str) 
    去掉字符串 str 左侧的空格
    RTRIM(str)
    去掉字符串 str 行尾的空格
    REPEAT(str,x) 
    返回 str 重复 x 次的结果
    REPLACE(str,a,b) 
    用字符串 b 替换字符串 str 中所有出现的字符串 a 
    STRCMP(s1,s2) 
    比较字符串 s1 和 s2 
    TRIM(str) 
    去掉字符串行尾和行头的空格
    SUBSTRING(str,x,y) 
    返回从字符串 str x 位置起 y 个字符长度的字串

    1:CANCAT(S1,S2,…Sn)函数,把传入的参数连接成为一个字符串。注意:和null拼接后直接返回NULL

    mysql> select concat('aaa','bbb','d'),concat('dd',null);
    +-------------------------+-------------------+
    | concat('aaa','bbb','d') | concat('dd',null) |
    +-------------------------+-------------------+
    | aaabbbd                 | NULL              |
    +-------------------------+-------------------+
    1 row in set (0.00 sec)

    2:INSERT(str ,x,y,instr)函数:将字符串 str 从第 x 位置开始,y 个字符长的子串替换为字符串 instr。

    将字符串“123456”中从第3个字符开始,后面的3个字符替换成“me”

    mysql> select insert('123456',3,3,'me');
    +---------------------------+
    | insert('123456',3,3,'me') |
    +---------------------------+
    | 12me6                     |
    +---------------------------+
    1 row in set (0.02 sec)

    3:LOWER(str)和 UPPER(str)函数:把字符串转换成小写或大写。

    mysql> select lower("ZHANG"),upper("zhang");
    +----------------+----------------+
    | lower("ZHANG") | upper("zhang") |
    +----------------+----------------+
    | zhang          | ZHANG          |
    +----------------+----------------+
    1 row in set (0.00 sec)

    4:LEFT(str,x)和 RIGHT(str,x)函数:分别返回字符串最左边的 x 个字符和最右边的 x 个字符。注意:如果第二个参数是 NULL,那么将不返回任何字符串。 

    mysql> select left('zhang',2),left('zhang',null),right('zhang',2),left('zhang',10);
    +-----------------+--------------------+------------------+------------------+
    | left('zhang',2) | left('zhang',null) | right('zhang',2) | left('zhang',10) |
    +-----------------+--------------------+------------------+------------------+
    | zh              | NULL               | ng               | zhang            |
    +-----------------+--------------------+------------------+------------------+
    1 row in set (0.00 sec)

     5:LPAD(str,n ,pad)和 RPAD(str,n ,pad)函数:用字符串 pad 对 str 最左边和最右边进行填充,直到长度为 n 个字符长度。

    mysql> select lpad('bin',8,'zhang'),rpad('zhang',8,'bin'),rpad('beijing',20,'2008');
    +-----------------------+-----------------------+---------------------------+
    | lpad('bin',8,'zhang') | rpad('zhang',8,'bin') | rpad('beijing',20,'2008') |
    +-----------------------+-----------------------+---------------------------+
    | zhangbin              | zhangbin              | beijing2008200820082      |
    +-----------------------+-----------------------+---------------------------+
    1 row in set (0.00 sec)

    6:LTRIM(str)和 RTRIM(str)函数:去掉字符串 str 左侧和右侧空格。

    mysql> select '   zhang',ltrim('   zhang'),rtrim('zhang    ');
    +----------+-------------------+--------------------+
    | zhang    | ltrim('   zhang') | rtrim('zhang    ') |
    +----------+-------------------+--------------------+
    |    zhang | zhang             | zhang              |
    +----------+-------------------+--------------------+
    1 row in set (0.00 sec)

    7:REPEAT(str,x)函数:返回 str 重复 x 次的结果。

    mysql> select repeat('mysql',5);
    +---------------------------+
    | repeat('mysql',5)         |
    +---------------------------+
    | mysqlmysqlmysqlmysqlmysql |
    +---------------------------+
    1 row in set (0.00 sec)

    8:REPLACE(str,a,b)函数:用字符串 b 替换字符串 str 中所有出现的字符串 a。

    mysql> select replace('mysql','sql','ddd');
    +------------------------------+
    | replace('mysql','sql','ddd') |
    +------------------------------+
    | myddd                        |
    +------------------------------+
    1 row in set (0.00 sec)

    9:STRCMP(s1,s2)函数:比较字符串 s1 和 s2 的 ASCII 码值的大小。如果 s1 比 s2 小,那么返回-1;如果 s1 与 s2 相等,那么返回 0;如果 s1 比 s2 大,那么返回 1。

    mysql> select strcmp('a','b'),strcmp('b','b'),strcmp('c','b'),strcmp('a','A');
    +-----------------+-----------------+-----------------+-----------------+
    | strcmp('a','b') | strcmp('b','b') | strcmp('c','b') | strcmp('a','A') |
    +-----------------+-----------------+-----------------+-----------------+
    |              -1 |               0 |               1 |               0 |
    +-----------------+-----------------+-----------------+-----------------+
    1 row in set (0.01 sec)

    10:TRIM(str)函数:去掉目标字符串的开头和结尾的空格。

    mysql> select trim('  111 $  mysql $   ');
    +-----------------------------+
    | trim('  111 $  mysql $   ') |
    +-----------------------------+
    | 111 $  mysql $              |
    +-----------------------------+
    1 row in set (0.01 sec)

    11:SUBSTRING(str,x,y)函数:返回从字符串 str 中的第 x 位置起 y 个字符长度的字串。

    mysql> select substring('mysqlisdd',4,4);
    +----------------------------+
    | substring('mysqlisdd',4,4) |
    +----------------------------+
    | qlis                       |
    +----------------------------+
    1 row in set (0.00 sec)

     2、数值函数

    函数
    功能
    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 位小数的结果

    1: ABS(x)函数:返回 x 的绝对值。

    mysql> select abs(-0.3),abs(0.3);
    +-----------+----------+
    | abs(-0.3) | abs(0.3) |
    +-----------+----------+
    |       0.3 |      0.3 |
    +-----------+----------+
    1 row in set (0.36 sec)

    2:CEIL(x)函数,返回大于x的最大整数

    mysql> select ceil(-0.2),ceil(0.2);
    +------------+-----------+
    | ceil(-0.2) | ceil(0.2) |
    +------------+-----------+
    |          0 |         1 |
    +------------+-----------+
    1 row in set (0.00 sec)

     3:FLOOR(x)函数,返回小于x的最大整数,和CEIL刚好相反

    mysql> select floor(-0.2),floor(0.2);
    +-------------+------------+
    | floor(-0.2) | floor(0.2) |
    +-------------+------------+
    |          -1 |          0 |
    +-------------+------------+
    1 row in set (0.00 sec)

    4:MOD(x,y)函数:返回 x/y 的模。和 x%y 的结果相同,模数和被模数任何一个为 NULL 结果都为 NULL。如下例所示:

    mysql> 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)

    5:RAND()函数,返回0到1之间的随机数

    mysql> select rand(),rand();
    +-------------------+---------------------+
    | rand()            | rand()              |
    +-------------------+---------------------+
    | 0.541937319135235 | 0.10546984067696132 |
    +-------------------+---------------------+
    1 row in set (0.00 sec)

    6:ROUND(x,y)函数,返回参数 x 的四舍五入的有 y 位小数的值。如果是整数,将会保留 y 位数量的 0;如果不写 y,则默认 y 为 0,即将 x 四舍五入后取整。

    mysql> select round(1.2,2),round(1.3),round(1,2);
    +--------------+------------+------------+
    | round(1.2,2) | round(1.3) | round(1,2) |
    +--------------+------------+------------+
    |         1.20 |          1 |          1 |
    +--------------+------------+------------+
    1 row in set (0.00 sec)

    7:TRUNCATE(x,y)函数:返回数字 x 截断为 y 位小数的结果。(注意 TRUNCATE 和 ROUND 的区别在于 TRUNCATE 仅仅是截断,而不进行四舍五入。)

    mysql> 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.31 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 的月份名
    DATE_FORMAT(date,fmt) 返回按字符串 fmt 格式化日期 date 值
    DATE_ADD(date,INTERVAL expr type)  返回一个日期或时间值加上一个时间间隔的时间值
    DATEDIFF(expr,expr2) 返回起始时间 expr 和结束时间 expr2 之间的天数

    1:CURDATE()函数:返回当前日期,只包含年月日

    mysql> select curdate();
    +------------+
    | curdate()  |
    +------------+
    | 2021-05-25 |
    +------------+
    1 row in set (0.00 sec)

    2:CURTIME()函数:返回当前时间,只包含时分秒

    mysql> select curtime();
    +-----------+
    | curtime() |
    +-----------+
    | 14:07:06  |
    +-----------+
    1 row in set (0.00 sec)

    3:NOW()函数:返回当前的日期和时间,年月日时分秒全都包含。

    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2021-05-25 14:07:33 |
    +---------------------+
    1 row in set (0.00 sec)

    4:UNIX_TIMESTAMP(date)函数:返回日期 date 的 UNIX 时间戳。

    mysql> select unix_timestamp(now());
    +-----------------------+
    | unix_timestamp(now()) |
    +-----------------------+
    |            1621922906 |
    +-----------------------+
    1 row in set (0.30 sec)

    5:FROM_UNIXTIME ( unixtime ) 函 数 : 返 回 UNIXTIME 时 间 戳 的 日 期 值 , 和UNIX_TIMESTAMP(date)互为逆操作。

    mysql> select from_unixtime(1621922906);
    +---------------------------+
    | from_unixtime(1621922906) |
    +---------------------------+
    | 2021-05-25 14:08:26       |
    +---------------------------+
    1 row in set (0.31 sec)

    6:WEEK(DATE)和 YEAR(DATE)函数:前者返回所给的日期是一年中的第几周,后者返回所给的日期是哪一年。

    mysql> select week(now()),year(now());
    +-------------+-------------+
    | week(now()) | year(now()) |
    +-------------+-------------+
    |          21 |        2021 |
    +-------------+-------------+
    1 row in set (0.00 sec)

    7:HOUR(time)和 MINUTE(time)函数:前者返回所给时间的小时,后者返回所给时间的分钟。

    mysql> select hour(now()),minute(now());
    +-------------+---------------+
    | hour(now()) | minute(now()) |
    +-------------+---------------+
    |          14 |            11 |
    +-------------+---------------+
    1 row in set (0.00 sec)

    8:MONTHNAME(date)函数:返回 date 的英文月份名称。

    mysql> select monthname(now());
    +------------------+
    | monthname(now()) |
    +------------------+
    | May              |
    +------------------+
    1 row in set (0.30 sec)

    9:DATE_FORMAT(date,fmt)函数:按字符串 fmt 格式化日期 date 值,此函数能够按指定的格式显示日期,可用到的格式符如表:

    格式符 格式说明
    %S,%s 两位数字形式的秒(00,01,...,59)
    %i  两位数字形式的分(00,01,...,59)
    %H 两位数字形式的小时,24 小时(00,01,...,23)
    %h,%I 两位数字形式的小时,12 小时(01,02,...,12)
    %k 数字形式的小时,24 小时(0,1,...,23)
    %l  数字形式的小时,12 小时(1,2,...,12)
    %T 24 小时的时间形式(hh:mm:ss)
    %r 12 小时的时间形式(hh:mm:ssAM 或 hh:mm:ssPM)
    %p  AM 或 PM
    %W  一周中每一天的名称(Sunday,Monday,...,Saturday)
    %a 一周中每一天名称的缩写(Sun,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 4 位数字表示的年份
    %y 两位数字表示的年份
    %% 直接值“%”
    mysql> select date_format(now(),'%M,%D,%Y');
    +-------------------------------+
    | date_format(now(),'%M,%D,%Y') |
    +-------------------------------+
    | May,25th,2021                 |
    +-------------------------------+
    1 row in set (0.00 sec)

     10:DATE_ADD(date,INTERVAL expr type)函数:返回与所给日期 date 相差 INTERVAL 时间段的日期。

               其中 INTERVAL 是间隔类型关键字,expr 是一个表达式,这个表达式对应后面的类型,type
        是间隔类型,MySQL 提供了 13 种间隔类型,如下表

    MySQL 中的日期间隔类型

    表达式类型 描述 格式
    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

    例:第 1 列返回了当前日期时间,第 2 列返回距离当前日期31 天后的日期时间,第 3 列返回距离当前日期一年两个月后的日期时间。

    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 |
    +---------------------+---------------------+------------------------+
    | 2021-05-25 14:32:30 | 2021-06-25 14:32:30 | 2022-07-25 14:32:30    |
    +---------------------+---------------------+------------------------+
    1 row in set (0.03 sec)

    同样也可以用负数让它返回之前的某个日期时间,如下第 1 列返回了当前日期时间,第 2列返回距离当前日期 31 天前的日期时间,第 3 列返回距离当前日期一年两个月前的日期时间。

    mysql> select now() current,date_add(now(),interval -31 day) bef31days,date_add(now(),interval '-1_-2' year_month) bef_oneyear_twomonth;
    +---------------------+---------------------+----------------------+
    | current             | bef31days           | bef_oneyear_twomonth |
    +---------------------+---------------------+----------------------+
    | 2021-05-25 14:34:38 | 2021-04-24 14:34:38 | 2020-03-25 14:34:38  |
    +---------------------+---------------------+----------------------+
    1 row in set (0.00 sec)

     11:DATEDIFF(date1,date2)函数:用来计算两个日期之间相差的天数

    mysql> select datediff('2013-09-01',now());
    +------------------------------+
    | datediff('2013-09-01',now()) |
    +------------------------------+
    |                        -2823 |
    +------------------------------+
    1 row in set (0.30 sec)

    4、流程函数

    MySQL中的流程函数

    函数 功能
    IF(value,t f) 如果 value 是真,返回 t;否则返回 f
    IFNULL(value1,value2) 如果 value1 不为空返回 value1,否则返回 value2

    CASE WHEN [value1]
    THEN[result1]…ELSE[default]END

    如果 value1 是真,返回 result1,否则返回 default

    CASE [expr] WHEN [value1]
    THEN[result1]…ELSE[default]END

    如果 expr 等于 value1,返回 result1,否则返回 default

    1:IF(value,t f),例子:创建并初始化一个职员薪水表,插入一些测试数据,我们认为月薪在 2000 元以上的职员属于高薪,用“high”表示;而2000 元以下的职员属于低薪,用“low”表示

    mysql> create table salary(userid int,salary decimal(9,2));
    Query OK, 0 rows affected (0.47 sec)
    
    mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    mysql> select * from salary;
    +--------+---------+
    | userid | salary  |
    +--------+---------+
    |      1 | 1000.00 |
    |      2 | 2000.00 |
    |      3 | 3000.00 |
    |      4 | 4000.00 |
    |      5 | 5000.00 |
    |      1 |    NULL |
    +--------+---------+
    6 rows in set (0.00 sec)
    
    mysql> select if(salary>2000,'high','low') from salary;
    +------------------------------+
    | if(salary>2000,'high','low') |
    +------------------------------+
    | low                          |
    | low                          |
    | high                         |
    | high                         |
    | high                         |
    | low                          |
    +------------------------------+
    6 rows in set (0.31 sec)

    2:IFNULL(value1,value2)函数,一般用来替换 NULL 值的,我们知道 NULL 值是不能参与数值运算的,下面这个语句就是把 NULL 值用 0 来替换

    mysql> select ifnull(salary,0) from salary;
    +------------------+
    | ifnull(salary,0) |
    +------------------+
    |          1000.00 |
    |          2000.00 |
    |          3000.00 |
    |          4000.00 |
    |          5000.00 |
    |             0.00 |
    +------------------+
    6 rows in set (0.00 sec)

    3:CASE WHEN [value1] THEN[result1]…ELSE[default]END 函 数 : 我 们 也 可 以 用 case when…then 函数实现上面例子中高薪低薪的问题

    mysql> select case when salary<=2000 then 'low' else 'high' end from salary;
    +---------------------------------------------------+
    | case when salary<=2000 then 'low' else 'high' end |
    +---------------------------------------------------+
    | low                                               |
    | low                                               |
    | high                                              |
    | high                                              |
    | high                                              |
    | high                                              |
    +---------------------------------------------------+
    6 rows in set (0.29 sec)

    4:CASE [expr] WHEN [value1] THEN[result1]…ELSE[default]END 函数:这里还可以分多种情况把职员的薪水分多个档次,比如下面的例子分成高、中、低 3 种情况。

    mysql> select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
    +-----------------------------------------------------------------------+
    | case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end |
    +-----------------------------------------------------------------------+
    | low                                                                   |
    | mid                                                                   |
    | high                                                                  |
    | high                                                                  |
    | high                                                                  |
    | high                                                                  |
    +-----------------------------------------------------------------------+
    6 rows in set (0.00 sec)

     5、其他常用函数

    MySQL 中的其他常用函数

    函数  功能
    DATABASE()  返回当前数据库名
    VERSION() 返回当前数据库版本
    USER() 返回当前登录用户名
    INET_ATON(IP)  返回 IP 地址的数字表示
    INET_NTOA(num) 返回数字代表的 IP 地址
    PASSWORD(str) 返回字符串 str 的加密版本
    MD5()  返回字符串 str 的 MD5 值

    1:DATABASE()函数:返回当前数据库名。

    mysql> select database();
    +------------+
    | database() |
    +------------+
    | test       |
    +------------+
    1 row in set (0.00 sec)

    2:VERSION()函数:返回当前数据库版本。

    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 5.7.26    |
    +-----------+
    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.30 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)

    6:PASSWORD(str)函数:返回字符串 str 的加密版本,一个 41 位长的字符串。

    mysql> select password('1223456');
    +-------------------------------------------+
    | password('1223456')                       |
    +-------------------------------------------+
    | *3B5C2394E86BB91F1D03C5A1F2D3962BB287590B |
    +-------------------------------------------+
    1 row in set, 1 warning (0.33 sec)

    7:MD5(str)函数:返回字符串 str 的 MD5 值,常用来对应用中的数据进行加密。

    mysql> select md5('123456');
    +----------------------------------+
    | md5('123456')                    |
    +----------------------------------+
    | e10adc3949ba59abbe56e057f20f883e |
    +----------------------------------+
    1 row in set (0.30 sec)

    本章完结!!!

  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/19930521zhang/p/14756416.html
Copyright © 2011-2022 走看看