zoukankan      html  css  js  c++  java
  • MySQL之函数

    MySQL中提供了许多内置函数:

    内置函数

    一、数学函数

      ROUND(x, y)

        返回参数x的四舍五入的有y位小数的值

      RAND()

        返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。

    二、聚合函数(常用于GROUP BY从句的SELECT查询中)

      AVG(col)返回指定列的平均值

      COUNT(col)返回指定列中非NULL值的个数

      MIN(col)返回指定列的最小值

      MAX(col)返回指定列的最大值

      SUM(col)返回指定列的所有值之和

      GROUP_CONCAT(col)返回由属于一组的列值连接组合而成的结果

    三、字符串函数

      CHAR_LENGTH(str)

        返回值为字符串str的长度,长度的单位为字符。一个多字节字符算作一个单字符。

      CONCAT(str1,str2,...)

        字符串拼接

        如有任何一个参数为NULL,则返回值为NULL。

      CONCAT_WS(separator, str1, str2, ...)

        字符串拼接(自定义连接符)

        CONCAT_WS() 不会忽略任何空字符串。(然而会忽略所有的NULL)。

      CONV(N, from_base, to_base)

        进制转换

        例如:

          SELECT CONV('a', 16, 2);  表示将a由16进制转换为2进制字符串表示

      FORMAT(X, D)

        将数字X的格式写为‘#,###,###.##’,以四舍五入的方式保留小数点后D位,并将结果以字符串的形式返回。若D为0,则返回结果不带有小数点,或不含小数部分。

        例如:

          SELECT FORMAT(12332.1,4);结果为'12,332.1000'

      INSERT(str, pos, len, newstr)

        在str的指定位置插入字符串

          pos:要替换位置起始位置

          len:替换的长度

          newstr:新字符串

        特别的:

          如果pos超过原字符串长度,则返回原字符串

          如果len超过原字符串长度,则由新字符串完全替换

      INSERT(str, substr)

        返回字符串str中子字符串的第一个出现位置。

      LEFT(str, len)

        返回字符串str从开始的len位置的子序列字符。

      LOWER(str)

        变小写

      UPPER(str)

        变大写

      REVERSE(str)

        返回字符串str,顺序和字符顺序相反。

      SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)

        不带有len参数的格式从字符串str返回一个子字符串,起始于位置pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置pos。使用FROM的格式为标准SQL语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos字符,而不是字符串的开头位置。在以下格式的函数中可以对pos使用一个负值。

    mysql> select substring('Quadratically',5);
    +------------------------------+
    | substring('Quadratically',5) |
    +------------------------------+
    | ratically                    |
    +------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('foobarbar' from 4);
    +-------------------------------+
    | substring('foobarbar' from 4) |
    +-------------------------------+
    | barbar                        |
    +-------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('Quadratically',5,6)
        -> ;
    +--------------------------------+
    | substring('Quadratically',5,6) |
    +--------------------------------+
    | ratica                         |
    +--------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('Sakila',-3);
    +------------------------+
    | substring('Sakila',-3) |
    +------------------------+
    | ila                    |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('Sakila',-5,3);
    +--------------------------+
    | substring('Sakila',-5,3) |
    +--------------------------+
    | aki                      |
    +--------------------------+
    1 row in set (0.00 sec)
    
    mysql> select substring('Sakila' from -4 for 2);
    +-----------------------------------+
    | substring('Sakila' from -4 for 2) |
    +-----------------------------------+
    | ki                                |
    +-----------------------------------+
    1 row in set (0.00 sec)  

    四、日期和时间函数

      CURDATE()或CURRENT_DATE()  返回当前的日期

      CURTIME()或CURRENT_TIME()  返回当前的时间

      DAYOFWEEK(date)  返回date所代表的一星期中的第几天(1-7)

      DAYOFMONTH(date)  返回date所代表的是一个月的第几天(1-31)

      DAYOFYEAR(date)  返回date是一年的第几天(1-366)

      DAYNAME(date)  返回date的星期名,如:select dayname(current_date);

      FROM_UNIXTIME(ts, fmt)  根据指定的fmt格式,格式化unix时间戳ts

       HOUR(time)  返回time的小时值(0~23)

      MINUTE(time)  返回time的分钟值(0~59)

      MONTH(time)  返回date的月份值(1~12)

      MONTHNAME(date)  返回date的月份名,如:select monthname(current_date);

      NOW()  返回当前的日期和时间

      QUARTER(date)  返回date在一年中的季节(1~4),如select quarter(currter_date);

      WEEK(date)  返回日期date为一年中第几个星期(0~53)

      YEAR(date)  返回日期date的年份(1000~9999)

      重点:

      date_format(date, format)根据format字符串格式化date值

    mysql> select date_format('2009-10-04 22:23:00','%W %M %Y');
    +-----------------------------------------------+
    | date_format('2009-10-04 22:23:00','%W %M %Y') |
    +-----------------------------------------------+
    | Sunday October 2009                           |
    +-----------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select date_format('2007-10-04 22:23:00','%H:%i:%s');
    +-----------------------------------------------+
    | date_format('2007-10-04 22:23:00','%H:%i:%s') |
    +-----------------------------------------------+
    | 22:23:00                                      |
    +-----------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select date_format('1900-10-04 22:23:00','%D %y %a %d %m %b %j');
    +-----------------------------------------------------------+
    | date_format('1900-10-04 22:23:00','%D %y %a %d %m %b %j') |
    +-----------------------------------------------------------+
    | 4th 00 Thu 04 10 Oct 277                                  |
    +-----------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select date_format('1997-10-04 22:23:00','%H %k %I %r %T %S %w');
    +-----------------------------------------------------------+
    | date_format('1997-10-04 22:23:00','%H %k %I %r %T %S %w') |
    +-----------------------------------------------------------+
    | 22 22 10 10:23:00 PM 22:23:00 00 6                        |
    +-----------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select date_format('1999-01-01','%x %V');
    +-----------------------------------+
    | date_format('1999-01-01','%x %V') |
    +-----------------------------------+
    | 1998 52                           |
    +-----------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select date_format('2006-06-00','%d');
    +--------------------------------+
    | date_format('2006-06-00','%d') |
    +--------------------------------+
    | 00                             |
    +--------------------------------+
    1 row in set (0.00 sec)  

    五、加密函数    

      MD5()

        计算字符串str的MD5校验和

      PASSWORD(str)

        返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

    六、控制流函数

      CASE WHEN [test1] THEN [result1] ... ELSE [default] END

        如果testN是真,则返回resultN,否则返回default

      CASE [test] WHEN [vall] THEN [result] ... ELSE [default] END

        如果test和valN相等,则返回resultN,否则返回default

      

      IF(test,t,f)

        如果test是真,返回t;否则返回f

      IF NULL(arg1,arg2)

        如果arg1不是空,返回arg1,否则返回arg2

      NULLIF(arg1,arg2)

        如果arg1=arg2返回NULL;否则返回arg1

    更多函数:中文猛击这里 OR 官方猛击这里

    举例:

    # 1、博客园 时间处理
    CREATE TABLE blog (
        id INT PRIMARY KEY auto_increment,
        NAME CHAR (32),
        sub_time datetime
    );
    
    #2、插入数据
    INSERT INTO blog (NAME, sub_time)
    VALUES
        ('第1篇','2015-03-01 11:31:21'),
        ('第2篇','2015-03-11 16:31:21'),
        ('第3篇','2016-07-01 10:21:31'),
        ('第4篇','2016-07-22 09:23:21'),
        ('第5篇','2016-07-23 10:11:11'),
        ('第6篇','2016-07-25 11:21:31'),
        ('第7篇','2017-03-01 15:33:21'),
        ('第8篇','2017-03-01 17:32:21'),
        ('第9篇','2017-03-01 18:31:21');
    
    #3. 提取sub_time字段的值,按照格式后的结果即"年月"来分组
    SELECT DATE_FORMAT(sub_time,'%Y-%m') as y_m,COUNT(1) as num  FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m');
    
    
    # 结果:
    +---------+-----+
    | y_m     | num |
    +---------+-----+
    | 2015-03 |   2 |
    | 2016-07 |   4 |
    | 2017-03 |   3 |
    +---------+-----+
    rows in set (0.00 sec)
    

      

  • 相关阅读:
    【LeetCode】155. Min Stack 最小栈
    【Java】修改Eclipse默认编码
    负数取模
    【算法第四版笔记】1.1 基础编程模型
    【计算方法】02
    【计算方法】01
    【Java】Java8中List排序
    选择排序算法
    排序算法
    【Java】Eclipse修改JSP文件默认编码
  • 原文地址:https://www.cnblogs.com/Black-rainbow/p/9188443.html
Copyright © 2011-2022 走看看