玩转Mysql系列 - 第10篇:常用的几十个函数详解

打算提升sql技能的,可以加我微信itsoku,带你成为sql高手。

这是Mysql系列第10篇。

环境:mysql5.7.25,cmd命令中进行演示。

MySQL 数值型函数

函数名称作 用
abs求绝对值
sqrt求二次方根
mod求余数
ceil 和 ceiling两个函数功能相同,都是返回不小于参数的最小整数,即向上取整
floor向下取整,返回值转化为一个BIGINT
rand生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列
round对所传参数进行四舍五入
sign返回参数的符号
pow 和 power两个函数的功能相同,都是所传参数的次方的结果值
sin求正弦值
asin求反正弦值,与函数 SIN 互为反函数
cos求余弦值
acos求反余弦值,与函数 COS 互为反函数
tan求正切值
atan求反正切值,与函数 TAN 互为反函数
cot求余切值
abs:求绝对值

函数 ABS(x) 返回 x 的绝对值。正数的绝对值是其本身,负数的绝对值为其相反数,0 的绝对值是 0。


        
        
  1. mysql> select  abs( 5), abs(- 2.4), abs(- 24), abs( 0);
  2. +--------+-----------+----------+--------+
  3. abs( 5) |  abs(- 2.4) |  abs(- 24) |  abs( 0) |
  4. +--------+-----------+----------+--------+
  5. |       5 |        2.4 |        24 |       0 |
  6. +--------+-----------+----------+--------+
  7. 1 row  in set ( 0.00 sec)
sqrt:求二次方跟(开方)

函数 SQRT(x) 返回非负数 x 的二次方根。负数没有平方根,返回结果为 NULL。


        
        
  1. mysql> select  sqrt( 25), sqrt( 120), sqrt(- 9);
  2. +----------+--------------------+----------+
  3. sqrt( 25) |  sqrt( 120)          |  sqrt(- 9) |
  4. +----------+--------------------+----------+
  5. |         5 |  10.954451150103322 |      NULL |
  6. +----------+--------------------+----------+
  7. 1 row  in set ( 0.00 sec)
mod:求余数

函数 MOD(x,y) 返回 x 被 y 除后的余数,MOD() 对于带有小数部分的数值也起作用,它返回除法运算后的余数。


        
        
  1. mysql> select  mod( 63, 8), mod( 120, 10), mod( 15.5, 3);
  2. +-----------+-------------+-------------+
  3. mod( 63, 8) |  mod( 120, 10) |  mod( 15.5, 3) |
  4. +-----------+-------------+-------------+
  5. |          7 |            0 |          0.5 |
  6. +-----------+-------------+-------------+
  7. 1 row  in set ( 0.00 sec)
ceil和ceiling:向上取整

函数 CEIL(x) 和 CEILING(x) 的意义相同,返回不小于 x 的最小整数值,返回值转化为一个 BIGINT。


        
        
  1. mysql> select  ceil(- 2.5), ceiling( 2.5);
  2. +------------+--------------+
  3. ceil(- 2.5) |  ceiling( 2.5) |
  4. +------------+--------------+
  5. |         - 2 |             3 |
  6. +------------+--------------+
  7. 1 row  in set ( 0.00 sec)
floor:向下取整

floor(x) 函数返回小于 x 的最大整数值。


        
        
  1. mysql> select  floor( 5), floor( 5.66), floor(- 4), floor(- 4.66);
  2. +----------+-------------+-----------+--------------+
  3. floor( 5) |  floor( 5.66) |  floor(- 4) |  floor(- 4.66) |
  4. +----------+-------------+-----------+--------------+
  5. |         5 |            5 |        - 4 |           - 5 |
  6. +----------+-------------+-----------+--------------+
  7. 1 row  in set ( 0.00 sec)
rand:生成一个随机数

生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列


        
        
  1. mysql> select  rand(),  rand(),  rand();
  2. +--------------------+--------------------+--------------------+
  3. rand()             |  rand()             |  rand()             |
  4. +--------------------+--------------------+--------------------+
  5. 0.5224735778965741 |  0.3678060549942833 |  0.2716095720153391 |
  6. +--------------------+--------------------+--------------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql> select  rand( 1), rand( 2), rand( 1);
  9. +---------------------+--------------------+---------------------+
  10. rand( 1)             |  rand( 2)            |  rand( 1)             |
  11. +---------------------+--------------------+---------------------+
  12. 0.40540353712197724 |  0.6555866465490187 |  0.40540353712197724 |
  13. +---------------------+--------------------+---------------------+
  14. 1 row  in set ( 0.00 sec)
  15. mysql> select  rand( 1), rand( 2), rand( 1);
  16. +---------------------+--------------------+---------------------+
  17. rand( 1)             |  rand( 2)            |  rand( 1)             |
  18. +---------------------+--------------------+---------------------+
  19. 0.40540353712197724 |  0.6555866465490187 |  0.40540353712197724 |
  20. +---------------------+--------------------+---------------------+
  21. 1 row  in set ( 0.00 sec)
round:四舍五入函数

返回最接近于参数 x 的整数;ROUND(x,y) 函数对参数x进行四舍五入的操作,返回值保留小数点后面指定的y位。


        
        
  1. mysql> select  round(- 6.6), round(- 8.44), round( 3.44);
  2. +-------------+--------------+-------------+
  3. round(- 6.6) |  round(- 8.44) |  round( 3.44) |
  4. +-------------+--------------+-------------+
  5. |          - 7 |           - 8 |            3 |
  6. +-------------+--------------+-------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql> select  round(- 6.66, 1), round( 3.33, 3), round( 88.66,- 1), round( 88.46,- 2);
  9. +----------------+---------------+-----------------+-----------------+
  10. round(- 6.66, 1) |  round( 3.33, 3) |  round( 88.66,- 1) |  round( 88.46,- 2) |
  11. +----------------+---------------+-----------------+-----------------+
  12. |           - 6.7 |          3.330 |               90 |              100 |
  13. +----------------+---------------+-----------------+-----------------+
  14. 1 row  in set ( 0.00 sec)
sign:返回参数的符号

返回参数的符号,x 的值为负、零和正时返回结果依次为 -1、0 和 1。


        
        
  1. mysql> select  sign(- 6), sign( 0), sign( 34);
  2. +----------+---------+----------+
  3. sign(- 6) |  sign( 0) |  sign( 34) |
  4. +----------+---------+----------+
  5. |       - 1 |        0 |         1 |
  6. +----------+---------+----------+
  7. 1 row  in set ( 0.00 sec)
pow 和 power:次方函数

POW(x,y) 函数和 POWER(x,y) 函数用于计算 x 的 y 次方。


        
        
  1. mysql> select  pow( 5,- 2), pow( 10, 3), pow( 100, 0), power( 4, 3), power( 6,- 3);
  2. +-----------+-----------+------------+------------+----------------------+
  3. pow( 5,- 2) |  pow( 10, 3) |  pow( 100, 0) |  power( 4, 3) |  power( 6,- 3)          |
  4. +-----------+-----------+------------+------------+----------------------+
  5. |       0.04 |       1000 |           1 |          64 |  0.004629629629629629 |
  6. +-----------+-----------+------------+------------+----------------------+
  7. 1 row  in set ( 0.00 sec)
sin:正弦函数

SIN(x) 返回 x 的正弦值,其中 x 为弧度值。


        
        
  1. mysql> select  sin( 1), sin( 0.5* pi()), pi();
  2. +--------------------+---------------+----------+
  3. sin( 1)             |  sin( 0.5* pi()) |  pi()     |
  4. +--------------------+---------------+----------+
  5. 0.8414709848078965 |              1 |  3.141593 |
  6. +--------------------+---------------+----------+
  7. 1 row  in set ( 0.00 sec)

注:PI() 函数返回圆周率(3.141593)

其他几个三角函数在此就不说了,有兴趣的可以自己去练习一下。

MySQL 字符串函数

函数名称作 用
length计算字符串长度函数,返回字符串的字节长度
concat合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个
insert替换字符串函数
lower将字符串中的字母转换为小写
upper将字符串中的字母转换为大写
left从左侧字截取符串,返回字符串左边的若干个字符
right从右侧字截取符串,返回字符串右边的若干个字符
trim删除字符串左右两侧的空格
replace字符串替换函数,返回替换后的新字符串
substr 和 substring截取字符串,返回从指定位置开始的指定长度的字符换
reverse字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串
length:返回字符串直接长度

返回值为字符串的字节长度,使用 uft8(UNICODE 的一种变长字符编码,又称万国码)编码字符集时,一个汉字是 3 个字节,一个数字或字母是一个字节。


        
        
  1. mysql> select  length( 'javacode2018'), length( '路人甲Java'), length( '路人');
  2. +------------------------+-------------------------+------------------+
  3. length( 'javacode2018') |  length( '路人甲Java')    |  length( '路人')   |
  4. +------------------------+-------------------------+------------------+
  5. |                      12 |                       13 |                 6 |
  6. +------------------------+-------------------------+------------------+
  7. 1 row  in set ( 0.00 sec)
concat:合并字符串

CONCAT(sl,s2,…) 函数返回结果为连接参数产生的字符串,或许有一个或多个参数。

若有任何一个参数为 NULL,则返回值为 NULL。若所有参数均为非二进制字符串,则结果为非二进制字符串。若自变量中含有任一二进制字符串,则结果为一个二进制字符串。


        
        
  1. mysql> select  concat( '路人甲', 'java'), concat( '路人甲', null, 'java');
  2. +----------------------------+---------------------------------+
  3. concat( '路人甲', 'java')    |  concat( '路人甲', null, 'java')    |
  4. +----------------------------+---------------------------------+
  5. | 路人甲java                 |  NULL                            |
  6. +----------------------------+---------------------------------+
  7. 1 row  in set ( 0.00 sec)
insert:替换字符串

INSERT(s1,x,len,s2) 返回字符串 s1,子字符串起始于 x 位置,并且用 len 个字符长的字符串代替 s2。

x的值从1开始,第一个字符的x=1,若 x 超过字符串长度,则返回值为原始字符串。

假如 len 的长度大于其他字符串的长度,则从位置 x 开始替换。

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


        
        
  1. mysql> select
  2.     ->    insert( '路人甲Java'24'**'AS col1,
  3.     ->    insert( '路人甲Java', - 14, '**'AS col2,
  4.     ->    insert( '路人甲Java'320, '**'AS col3;
  5. +---------+---------------+----------+
  6. | col1    | col2          | col3     |
  7. +---------+---------------+----------+
  8. | 路**va  | 路人甲 Java    | 路人**   |
  9. +---------+---------------+----------+
  10. 1 row  in set ( 0.00 sec)
lower:将字母转换成小写

LOWER(str) 可以将字符串 str 中的字母字符全部转换成小写。


        
        
  1. mysql> select  lower( '路人甲JAVA');
  2. +------------------------+
  3. lower( '路人甲JAVA')    |
  4. +------------------------+
  5. | 路人甲java             |
  6. +------------------------+
  7. 1 row  in set ( 0.00 sec)
upper:将字母转换成大写

UPPER(str) 可以将字符串 str 中的字母字符全部转换成大写。


        
        
  1. mysql> select  upper( '路人甲java');
  2. +------------------------+
  3. upper( '路人甲java')    |
  4. +------------------------+
  5. | 路人甲 JAVA             |
  6. +------------------------+
  7. 1 row  in set ( 0.00 sec)
left:从左侧截取字符串

LEFT(s,n) 函数返回字符串 s 最左边的 n 个字符,s=1表示第一个字符。


        
        
  1. mysql> select  left( '路人甲JAVA', 2), left( '路人甲JAVA', 10), left( '路人甲JAVA',- 1);
  2. +-------------------------+--------------------------+--------------------------+
  3. left( '路人甲JAVA', 2)    |  left( '路人甲JAVA', 10)    |  left( '路人甲JAVA',- 1)    |
  4. +-------------------------+--------------------------+--------------------------+
  5. | 路人                    | 路人甲 JAVA               |                          |
  6. +-------------------------+--------------------------+--------------------------+
  7. 1 row  in set ( 0.00 sec)
right:从右侧截取字符串

RIGHT(s,n) 函数返回字符串 s 最右边的 n 个字符。


        
        
  1. mysql> select  right( '路人甲JAVA', 1), right( '路人甲JAVA', 10), right( '路人甲JAVA',- 1);
  2. +--------------------------+---------------------------+---------------------------+
  3. right( '路人甲JAVA', 1)    |  right( '路人甲JAVA', 10)    |  right( '路人甲JAVA',- 1)    |
  4. +--------------------------+---------------------------+---------------------------+
  5. | A                        | 路人甲 JAVA                |                           |
  6. +--------------------------+---------------------------+---------------------------+
  7. 1 row  in set ( 0.00 sec)
trim:删除字符串两侧空格

TRIM(s) 删除字符串 s 两侧的空格。


        
        
  1. mysql> select  '[   路人甲Java   ]', concat( '[', trim( '   路人甲Java   '), ']');
  2. +-----------------------+---------------------------------------------+
  3. | [   路人甲 Java   ]    |  concat( '[', trim( '   路人甲Java   '), ']')    |
  4. +-----------------------+---------------------------------------------+
  5. | [   路人甲 Java   ]    | [路人甲 Java]                                |
  6. +-----------------------+---------------------------------------------+
  7. 1 row  in set ( 0.00 sec)
replace:字符串替换

REPLACE(s,s1,s2) 使用字符串 s2 替换字符串 s 中所有的字符串 s1。

substr 和 substring:截取字符串

substr(str,pos)

substr(str from pos)

substr(str,pos,len)

substr(str from pos for len)

substr()是substring()的同义词。

没有len参数的形式是字符串str从位置pos开始返回一个子字符串。

带有len参数的形式是字符串str从位置pos开始返回长度为len的子字符串。

使用FROM的形式是标准的SQL语法。

也可以对pos使用负值,在这种情况下,子字符串的开头是字符串末尾的pos字符,而不是开头。在这个函数的任何形式中pos可以使用负值。

对于所有形式的substring(),从中提取子串的字符串中第一个字符的位置被认为是1。


        
        
  1. /** 第三个字符之后的子字符串:inese **/
  2. SELECT  substring( 'chinese'3);
  3. /** 倒数第三个字符之后的子字符串:ese **/
  4. SELECT  substring( 'chinese', - 3);
  5. /** 第三个字符之后的两个字符:in **/
  6. SELECT  substring( 'chinese'32);
  7. /** 倒数第三个字符之后的两个字符:es **/
  8. SELECT  substring( 'chinese', - 32);
  9. /** 第三个字符之后的子字符串:inese **/
  10. SELECT  substring( 'chinese'  FROM  3);
  11. /** 倒数第三个字符之后的子字符串:ese **/
  12. SELECT  substring( 'chinese'  FROM - 3);
  13. /** 第三个字符之后的两个字符:in **/
  14. SELECT  substring( 'chinese'  FROM  3  FOR  2);
  15. /** 倒数第三个字符之后的两个字符:es **/
  16. SELECT  substring( 'chinese'  FROM - 3  FOR  2);
reverse:反转字符串

REVERSE(s) 可以将字符串 s 反转,返回的字符串的顺序和 s 字符串的顺序相反。


        
        
  1. mysql> select  reverse( '路人甲Java');
  2. +--------------------------+
  3. reverse( '路人甲Java')    |
  4. +--------------------------+
  5. | avaJ甲人路               |
  6. +--------------------------+
  7. 1 row  in set ( 0.00 sec)

MySQL 日期和时间函数

函数名称作 用
curdate 和 current_date两个函数作用相同,返回当前系统的日期值
curtime 和 current_time两个函数作用相同,返回当前系统的时间值
now 和 sysdate两个函数作用相同,返回当前系统的日期和时间值
unix_timestamp获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
from_unixtime将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数
month获取指定日期中的月份
monthname获取指定日期中的月份英文名称
dayname获取指定曰期对应的星期几的英文名称
dayofweek获取指定日期是一周中是第几天,返回值范围是1~7,1=周日
week获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53
dayofyear获取指定曰期是一年中的第几天,返回值范围是1~366
dayofmonth获取指定日期是一个月中是第几天,返回值范围是1~31
year获取年份,返回值范围是 1970〜2069
time_to_sec将时间参数转换为秒数
sec_to_time将秒数转换为时间,与TIME_TO_SEC 互为反函数
date_add 和 adddate两个函数功能相同,都是向日期添加指定的时间间隔
date_sub 和 subdate两个函数功能相同,都是向日期减去指定的时间间隔
addtime时间加法运算,在原始时间上添加指定的时间
subtime时间减法运算,在原始时间上减去指定的时间
datediff获取两个日期之间间隔,返回参数 1 减去参数 2 的值
date_format格式化指定的日期,根据参数返回指定格式的值
weekday获取指定日期在一周内的对应的工作日索引
curdate 和 current_date:两个函数作用相同,返回当前系统的日期值

CURDATE() 和 CURRENT_DATE() 函数的作用相同,将当前日期按照“YYYY-MM-DD”或“YYYYMMDD”格式的值返回,具体格式根据函数用在字符串或数字语境中而定,返回的date类型。


        
        
  1. mysql> select  curdate(), current_date(), current_date()+ 1;
  2. +------------+----------------+------------------+
  3. curdate()  |  current_date() |  current_date()+ 1 |
  4. +------------+----------------+------------------+
  5. 2019- 09- 17 |  2019- 09- 17     |          20190918 |
  6. +------------+----------------+------------------+
  7. 1 row  in set ( 0.00 sec)
curtime 和 current_time:获取系统当前时间

CURTIME() 和 CURRENT_TIME() 函数的作用相同,将当前时间以“HH:MM:SS”或“HHMMSS”格式返回,具体格式根据函数用在字符串或数字语境中而定,返回time类型。


        
        
  1. mysql> select  curtime(), current_time(), current_time()+ 1;
  2. +-----------+----------------+------------------+
  3. curtime() |  current_time() |  current_time()+ 1 |
  4. +-----------+----------------+------------------+
  5. 16: 11: 25  |  16: 11: 25       |            161126 |
  6. +-----------+----------------+------------------+
  7. 1 row  in set ( 0.00 sec)
now 和 sysdate:获取当前时间日期

NOW() 和 SYSDATE() 函数的作用相同,都是返回当前日期和时间值,格式为“YYYY-MM-DD HH:MM:SS”或“YYYYMMDDHHMMSS”,具体格式根据函数用在字符串或数字语境中而定,返回datetime类型。


        
        
  1. mysql> select  now(), sysdate();
  2. +---------------------+---------------------+
  3. now()               |  sysdate()           |
  4. +---------------------+---------------------+
  5. 2019- 09- 17  16: 13: 28 |  2019- 09- 17  16: 13: 28 |
  6. +---------------------+---------------------+
  7. 1 row  in set ( 0.00 sec)
unix_timestamp:获取UNIX时间戳

UNIX_TIMESTAMP(date) 若无参数调用,返回一个无符号整数类型的 UNIX 时间戳('1970-01-01 00:00:00'GMT之后的秒数)。


        
        
  1. mysql> select  unix_timestamp(), unix_timestamp( now()), now(), unix_timestamp( '2019-09-17 12:00:00');
  2. +------------------+-----------------------+---------------------+---------------------------------------+
  3. unix_timestamp() |  unix_timestamp( now()) |  now()               |  unix_timestamp( '2019-09-17 12:00:00') |
  4. +------------------+-----------------------+---------------------+---------------------------------------+
  5. |        1568710893 |             1568710893 |  2019- 09- 17  17: 01: 33 |                             1568692800 |
  6. +------------------+-----------------------+---------------------+---------------------------------------+
  7. 1 row  in set ( 0.00 sec)
from_unixtime:时间戳转日期

FROM_UNIXTIME(unix_timestamp[,format]) 函数把 UNIX 时间戳转换为普通格式的日期时间值,与 UNIX_TIMESTAMP () 函数互为反函数。

有2个参数:

unix_timestamp:时间戳(秒)

format:要转化的格式 比如“”%Y-%m-%d“” 这样格式化之后的时间就是 2017-11-30

可以有的形式:

格式说明
%M月名字(January~December)
%W星期名字(Sunday~Saturday)
%D有英语前缀的月份的日期(1st, 2nd, 3rd, 等等)
%Y年, 数字, 4 位
%y年, 数字, 2 位
%a缩写的星期名字(Sun~Sat)
%d月份中的天数, 数字(00~31)
%e月份中的天数, 数字(0~31)
%m月, 数字(01~12)
%c月, 数字(1~12)
%b缩写的月份名字(Jan~Dec)
%j一年中的天数(001~366)
%H小时(00~23)
%k小时(0~23)
%h小时(01~12)
%I(i的大写)小时(01~12)
%l(L的小写)小时(1~12)
%i分钟, 数字(00~59)
%r时间,12 小时(hh:mm:ss [AP]M)
%T时间,24 小时(hh:mm:ss)
%S秒(00~59)
%s秒(00~59)
%pAM或PM
%W一个星期中的天数英文名称(Sunday~Saturday)
%w一个星期中的天数(0=Sunday ~6=Saturday)
%U星期(0~52), 这里星期天是星期的第一天
%u星期(0~52), 这里星期一是星期的第一天
%%输出%

        
        
  1. mysql> select  from_unixtime( 1568710866), from_unixtime( 1568710866, '%Y-%m-%d %H:%h:%s');
  2. +---------------------------+-----------------------------------------------+
  3. from_unixtime( 1568710866) |  from_unixtime( 1568710866, '%Y-%m-%d %H:%h:%s') |
  4. +---------------------------+-----------------------------------------------+
  5. 2019- 09- 17  17: 01: 06       |  2019- 09- 17  17: 05: 06                           |
  6. +---------------------------+-----------------------------------------------+
  7. 1 row  in set ( 0.00 sec)
month:获取指定日期的月份

MONTH(date) 函数返回指定 date 对应的月份,范围为 1~12。


        
        
  1. mysql> select  month( '2017-12-15'), month( now());
  2. +---------------------+--------------+
  3. month( '2017-12-15') |  month( now()) |
  4. +---------------------+--------------+
  5. |                   12 |             9 |
  6. +---------------------+--------------+
  7. 1 row  in set ( 0.00 sec)
monthname:获取指定日期月份的英文名称

MONTHNAME(date) 函数返回日期 date 对应月份的英文全名。


        
        
  1. mysql> select  monthname( '2017-12-15'), monthname( now());
  2. +-------------------------+------------------+
  3. monthname( '2017-12-15') |  monthname( now()) |
  4. +-------------------------+------------------+
  5. December                |  September        |
  6. +-------------------------+------------------+
  7. 1 row  in set ( 0.00 sec)
dayname:获取指定日期的星期名称

DAYNAME(date) 函数返回 date 对应的工作日英文名称,例如 Sunday、Monday 等。


        
        
  1. mysql> select  now(), dayname( now());
  2. +---------------------+----------------+
  3. now()               |  dayname( now()) |
  4. +---------------------+----------------+
  5. 2019- 09- 17  17: 13: 08 |  Tuesday        |
  6. +---------------------+----------------+
  7. 1 row  in set ( 0.00 sec)
dayofweek:获取日期对应的周索引

DAYOFWEEK(d) 函数返回 d 对应的一周中的索引(位置)。1 表示周日,2 表示周一,……,7 表示周六。这些索引值对应于ODBC标准。


        
        
  1. mysql> select  now(), dayofweek( now());
  2. +---------------------+------------------+
  3. now()               |  dayofweek( now()) |
  4. +---------------------+------------------+
  5. 2019- 09- 17  17: 14: 21 |                 3 |
  6. +---------------------+------------------+
  7. 1 row  in set ( 0.00 sec)
week:获取指定日期是一年中的第几周

WEEK(date[,mode]) 函数计算日期 date 是一年中的第几周。WEEK(date,mode) 函数允许指定星期是否起始于周日或周一,以及返回值的范围是否为 0~52 或 1~53。

WEEK函数接受两个参数:

  • date是要获取周数的日期。

  • mode是一个可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,返回的周数应在052之间或053之间。

如果忽略mode参数,默认情况下WEEK函数将使用default_week_format系统变量的值。

要获取default_week_format变量的当前值,请使用SHOW VARIABLES语句如下:


        
        
  1. mysql>  SHOW  VARIABLES  LIKE  'default_week_format';
  2. +---------------------+-------+
  3. Variable_name       |  Value |
  4. +---------------------+-------+
  5. | default_week_format |  0     |
  6. +---------------------+-------+
  7. 1 row  in set,  1 warning ( 0.00 sec)

在我们的服务器中,default_week_format的默认值为0,下表格说明了mode参数如何影响WEEK函数:

模式一周的第一天范围
0星期日0-53
1星期一0-53
2星期日1-53
3星期一1-53
4星期日0-53
5星期一0-53
6星期日1-53
7星期一1-53

上表中“今年有4天以上”表示:

  • 如果星期包含1月1日,并且在新的一年中有4天或更多天,那么这周是第1周。

  • 否则,这一周的数字是前一年的最后一周,下周是第1周。


        
        
  1. mysql> select  now(), week( now());
  2. +---------------------+-------------+
  3. now()               |  week( now()) |
  4. +---------------------+-------------+
  5. 2019- 09- 17  17: 20: 28 |           37 |
  6. +---------------------+-------------+
  7. 1 row  in set ( 0.00 sec)
dayofyear:获取指定日期在一年中的位置

DAYOFYEAR(d) 函数返回 d 是一年中的第几天,范围为 1~366。


        
        
  1. mysql> select  now(), dayofyear( now()), dayofyear( '2019-01-01');
  2. +---------------------+------------------+-------------------------+
  3. now()               |  dayofyear( now()) |  dayofyear( '2019-01-01') |
  4. +---------------------+------------------+-------------------------+
  5. 2019- 09- 17  17: 22: 00 |               260 |                        1 |
  6. +---------------------+------------------+-------------------------+
  7. 1 row  in set ( 0.00 sec)
dayofmonth:获取指定日期在一个月的位置

DAYOFMONTH(d) 函数返回 d 是一个月中的第几天,范围为 1~31。


        
        
  1. mysql> select  now(), dayofmonth( now()), dayofmonth( '2019-01-01');
  2. +---------------------+-------------------+--------------------------+
  3. now()               |  dayofmonth( now()) |  dayofmonth( '2019-01-01') |
  4. +---------------------+-------------------+--------------------------+
  5. 2019- 09- 17  17: 23: 09 |                 17 |                         1 |
  6. +---------------------+-------------------+--------------------------+
  7. 1 row  in set ( 0.00 sec)
year:获取年份

YEAR() 函数可以从指定日期值中来获取年份值。


        
        
  1. mysql> select  now(), year( now()), year( '2019-01-02');
  2. +---------------------+-------------+--------------------+
  3. now()               |  year( now()) |  year( '2019-01-02') |
  4. +---------------------+-------------+--------------------+
  5. 2019- 09- 17  17: 28: 10 |         2019 |                2019 |
  6. +---------------------+-------------+--------------------+
  7. 1 row  in set ( 0.00 sec)
time_to_sec:将时间转换为秒值

TIME_TO_SEC(time) 函数返回将参数 time 转换为秒数的时间值,转换公式为“小时 ×3600+ 分钟 ×60+ 秒”。


        
        
  1. mysql> select  time_to_sec( '15:15:15'), now(), time_to_sec( now());
  2. +-------------------------+---------------------+--------------------+
  3. time_to_sec( '15:15:15') |  now()               |  time_to_sec( now()) |
  4. +-------------------------+---------------------+--------------------+
  5. |                    54915 |  2019- 09- 17  17: 30: 44 |               63044 |
  6. +-------------------------+---------------------+--------------------+
  7. 1 row  in set ( 0.00 sec)
sec_to_time:将秒值转换为时间格式

SEC_TO_TIME(seconds) 函数返回将参数 seconds 转换为小时、分钟和秒数的时间值。


        
        
  1. mysql> select  sec_to_time( 100), sec_to_time( 10000);
  2. +------------------+--------------------+
  3. sec_to_time( 100) |  sec_to_time( 10000) |
  4. +------------------+--------------------+
  5. 00: 01: 40         |  02: 46: 40           |
  6. +------------------+--------------------+
  7. 1 row  in set ( 0.00 sec)
date_add和adddate:向日期添加指定时间间隔

DATE_ADD(date,INTERVAL expr type)

date:参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

type:参数可以是下列值

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

        
        
  1. mysql> select  date_add( '2019-01-01', INTERVAL  10 day), adddate( '2019-01-01 16:00:00',interval  100  SECOND);
  2. +----------------------------------------+----------------------------------------------------+
  3. date_add( '2019-01-01', INTERVAL  10 day) |  adddate( '2019-01-01 16:00:00',interval  100  SECOND) |
  4. +----------------------------------------+----------------------------------------------------+
  5. 2019- 01- 11                             |  2019- 01- 01  16: 01: 40                                |
  6. +----------------------------------------+----------------------------------------------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql> select  date_add( '2019-01-01', INTERVAL - 10 day), adddate( '2019-01-01 16:00:00',interval - 100  SECOND);
  9. +-----------------------------------------+-----------------------------------------------------+
  10. date_add( '2019-01-01', INTERVAL - 10 day) |  adddate( '2019-01-01 16:00:00',interval - 100  SECOND) |
  11. +-----------------------------------------+-----------------------------------------------------+
  12. 2018- 12- 22                              |  2019- 01- 01  15: 58: 20                                 |
  13. +-----------------------------------------+-----------------------------------------------------+
  14. 1 row  in set ( 0.00 sec)
date_sub和subdate:日期减法运算

DATE_SUB(date,INTERVAL expr type)

date:参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。

type的类型和date_add中的type一样。


        
        
  1. mysql> select  date_sub( '2019-01-01', INTERVAL  10 day), subdate( '2019-01-01 16:00:00',interval  100  SECOND);
  2. +----------------------------------------+----------------------------------------------------+
  3. date_sub( '2019-01-01', INTERVAL  10 day) |  subdate( '2019-01-01 16:00:00',interval  100  SECOND) |
  4. +----------------------------------------+----------------------------------------------------+
  5. 2018- 12- 22                             |  2019- 01- 01  15: 58: 20                                |
  6. +----------------------------------------+----------------------------------------------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql> select  date_sub( '2019-01-01', INTERVAL - 10 day), subdate( '2019-01-01 16:00:00',interval - 100  SECOND);
  9. +-----------------------------------------+-----------------------------------------------------+
  10. date_sub( '2019-01-01', INTERVAL - 10 day) |  subdate( '2019-01-01 16:00:00',interval - 100  SECOND) |
  11. +-----------------------------------------+-----------------------------------------------------+
  12. 2019- 01- 11                              |  2019- 01- 01  16: 01: 40                                 |
  13. +-----------------------------------------+-----------------------------------------------------+
  14. 1 row  in set ( 0.00 sec)
addtime:时间加法运算

ADDTIME(time,expr) 函数用于执行时间的加法运算。添加 expr 到 time 并返回结果。

其中:time 是一个时间或日期时间表达式,expr 是一个时间表达式。


        
        
  1. mysql> select  addtime( '2019-09-18 23:59:59', '0:1:1'),  addtime( '10:30:59', '5:10:37');
  2. +----------------------------------------+-------------------------------+
  3. addtime( '2019-09-18 23:59:59', '0:1:1') |  addtime( '10:30:59', '5:10:37') |
  4. +----------------------------------------+-------------------------------+
  5. 2019- 09- 19  00: 01: 00                    |  15: 41: 36                      |
  6. +----------------------------------------+-------------------------------+
  7. 1 row  in set ( 0.00 sec)
subtime:时间减法运算

SUBTIME(time,expr) 函数用于执行时间的减法运算。

函数返回 time。expr 表示的值和格式 time 相同。time 是一个时间或日期时间表达式, expr 是一个时间。


        
        
  1. mysql> select  subtime( '2019-09-18 23:59:59', '0:1:1'), subtime( '10:30:59', '5:12:37');
  2. +----------------------------------------+-------------------------------+
  3. subtime( '2019-09-18 23:59:59', '0:1:1') |  subtime( '10:30:59', '5:12:37') |
  4. +----------------------------------------+-------------------------------+
  5. 2019- 09- 18  23: 58: 58                    |  05: 18: 22                      |
  6. +----------------------------------------+-------------------------------+
  7. 1 row  in set ( 0.00 sec)
datediff:获取两个日期的时间间隔

DATEDIFF(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数。date1 和 date2 为日期或 date-and-time 表达式。计算时只用到这些值的日期部分。


        
        
  1. mysql> select  datediff( '2017-11-30', '2017-11-29'as col1,  datediff( '2017-11-30', '2017-12-15'as col2;
  2. +------+------+
  3. | col1 | col2 |
  4. +------+------+
  5. |     1 |  - 15 |
  6. +------+------+
  7. 1 row  in set ( 0.00 sec)
date_format:格式化指定的日期

DATE_FORMAT(date,format) 函数是根据 format 指定的格式显示 date 值。

DATE_FORMAT() 函数接受两个参数:

date:是要格式化的有效日期值format:是由预定义的说明符组成的格式字符串,每个说明符前面都有一个百分比字符(%)。

format:格式和上面的函数from_unixtime中的format一样,可以参考上面的。


        
        
  1. mysql> select  date_format( '2017-11-30', '%Y%m%d'as col0, now()  as col1,  date_format( now(), '%Y%m%d%H%i%s'as col2;
  2. +----------+---------------------+----------------+
  3. | col0     | col1                | col2           |
  4. +----------+---------------------+----------------+
  5. 20171130 |  2019- 09- 17  17: 56: 12 |  20190917175612 |
  6. +----------+---------------------+----------------+
  7. 1 row  in set ( 0.00 sec)
weekday:获取指定日期在一周内的索引位置

WEEKDAY(date) 返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。


        
        
  1. mysql> select  now(), weekday( now());
  2. +---------------------+----------------+
  3. now()               |  weekday( now()) |
  4. +---------------------+----------------+
  5. 2019- 09- 17  18: 01: 34 |               1 |
  6. +---------------------+----------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql> select  now(), dayofweek( now());
  9. +---------------------+------------------+
  10. now()               |  dayofweek( now()) |
  11. +---------------------+------------------+
  12. 2019- 09- 17  18: 01: 34 |                 3 |
  13. +---------------------+------------------+
  14. 1 row  in set ( 0.00 sec)

MySQL 聚合函数

函数名称作用
max查询指定列的最大值
min查询指定列的最小值
count统计查询结果的行数
sum求和,返回指定列的总和
avg求平均值,返回指定列数据的平均值

MySQL 流程控制函数

函数名称作用
if判断,流程控制
ifnull判断是否为空
case搜索语句
if:判断

IF(expr,v1,v2)

当 expr 为真是返回 v1 的值,否则返回 v2


        
        
  1. mysql> select  if( 1< 2, 1, 0) c1, if( 1> 5, '√', '×') c2, if( strcmp( 'abc', 'ab'), 'yes', 'no') c3;
  2. +----+----+-----+
  3. | c1 | c2 | c3  |
  4. +----+----+-----+
  5. |   1 | ×  | yes |
  6. +----+----+-----+
  7. 1 row  in set ( 0.00 sec)
ifnull:判断是否为空

IFNULL(v1,v2):v1为空返回v2,否则返回v1。


        
        
  1. mysql> select  ifnull( null, '路人甲Java'), ifnull( '非空', '为空');
  2. +------------------------------+---------------------------+
  3. ifnull( null, '路人甲Java')    |  ifnull( '非空', '为空')     |
  4. +------------------------------+---------------------------+
  5. | 路人甲 Java                   | 非空                      |
  6. +------------------------------+---------------------------+
  7. 1 row  in set ( 0.00 sec)
case:搜索语句,类似于java中的if..else if..else

类似于java中的if..else if..else

有2种写法

方式1:


        
        
  1. CASE  <表达式>
  2.     WHEN <值 1THEN <操作>
  3.     WHEN <值 2THEN <操作>
  4.    ...
  5.     ELSE <操作>
  6. END  CASE;

方式2:


        
        
  1. CASE
  2.      WHEN <条件 1THEN <命令>
  3.      WHEN <条件 2THEN <命令>
  4.     ...
  5.      ELSE commands
  6. END  CASE;

示例:

准备数据:


        
        
  1. CREATE  TABLE t_stu (
  2.   id    INT  AUTO_INCREMENT   COMMENT  '编号',
  3.   name  VARCHAR( 10COMMENT  '姓名',
  4.   sex   TINYINT  COMMENT  '性别,0:未知,1:男,2:女',
  5.    PRIMARY  KEY (id)
  6. COMMENT  '学生表';
  7. insert into t_stu (name,sex)  VALUES 
  8.   ( '张学友', 1),
  9.   ( '刘德华', 1),
  10.   ( '郭富城', 1),
  11.   ( '蔡依林', 2),
  12.   ( 'xxx', 0);

        
        
  1. mysql> select *  from t_stu;
  2. +----+-----------+------+
  3. | id | name      | sex  |
  4. +----+-----------+------+
  5. |   1 | 张学友    |     1 |
  6. |   2 | 刘德华    |     1 |
  7. |   3 | 郭富城    |     1 |
  8. |   4 | 蔡依林    |     2 |
  9. |   5 | xxx       |     0 |
  10. +----+-----------+------+
  11. 5 rows  in set ( 0.00 sec)

需求:查询所有学生信息,输出:姓名,性别(男、女、未知),如下:


        
        
  1. mysql>  SELECT
  2.       t. name 姓名,
  3.       ( CASE t. sex
  4.         WHEN  1
  5.           THEN  '男'
  6.         WHEN  2
  7.           THEN  '女'
  8.         ELSE  '未知'  END) 性别
  9.      FROM t_stu t;
  10. +-----------+--------+
  11. | 姓名      | 性别   |
  12. +-----------+--------+
  13. | 张学友    | 男     |
  14. | 刘德华    | 男     |
  15. | 郭富城    | 男     |
  16. | 蔡依林    | 女     |
  17. | xxx       | 未知   |
  18. +-----------+--------+
  19. 5 rows  in set ( 0.00 sec)
  20. mysql>  SELECT
  21.     t. name          姓名,
  22.     ( CASE
  23.      WHEN t. sex =  1
  24.      THEN  '男'
  25.      WHEN t. sex =  2
  26.      THEN  '女'
  27.      ELSE  '未知'  END) 性别
  28.      FROM t_stu t;
  29. +-----------+--------+
  30. | 姓名      | 性别   |
  31. +-----------+--------+
  32. | 张学友    | 男     |
  33. | 刘德华    | 男     |
  34. | 郭富城    | 男     |
  35. | 蔡依林    | 女     |
  36. | xxx       | 未知   |
  37. +-----------+--------+
  38. 5 rows  in set ( 0.00 sec)

其他函数

函数名称作用
version数据库版本号
database当前的数据库
user当前连接用户
password返回字符串密码形式
md5返回字符串的md5数据

        
        
  1. mysql>  SELECT  version();
  2. +------------+
  3. version()  |
  4. +------------+
  5. 5.7 .25-log |
  6. +------------+
  7. 1 row  in set ( 0.00 sec)
  8. mysql>  SELECT  database();
  9. +--------------+
  10. database()   |
  11. +--------------+
  12. | javacode2018 |
  13. +--------------+
  14. 1 row  in set ( 0.00 sec)
  15. mysql>  SELECT  user();
  16. +----------------+
  17. user()         |
  18. +----------------+
  19. | root@localhost |
  20. +----------------+
  21. 1 row  in set ( 0.00 sec)
  22. mysql>  SELECT   password( '123456');
  23. +-------------------------------------------+
  24. password( '123456')                        |
  25. +-------------------------------------------+
  26. | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
  27. +-------------------------------------------+
  28. 1 row  in set,  1 warning ( 0.00 sec)
  29. mysql>  SELECT  md5( '123456');
  30. +----------------------------------+
  31. md5( '123456')                    |
  32. +----------------------------------+
  33. | e10adc3949ba59abbe56e057f20f883e |
  34. +----------------------------------+
  35. 1 row  in set ( 0.00 sec)

今天介绍函数比较多,大家搜藏一下,慢慢消化,喜欢的帮忙转发一下,谢谢。

Mysql系列目录

  1. 第1篇:mysql基础知识

  2. 第2篇:详解mysql数据类型(重点)

  3. 第3篇:管理员必备技能(必须掌握)

  4. 第4篇:DDL常见操作

  5. 第5篇:DML操作汇总

  6. 第6篇:select查询基础篇

  7. 第7篇:玩转select条件查询,避免采坑

  8. 第8篇:详解排序和分页(order by & limit)

  9. 第9篇:分组查询详解(group by & having)

mysql系列大概有20多篇,喜欢的请关注一下,欢迎大家加我微信itsoku或者留言交流mysql相关技术!

来源:https://itsoku.blog.csdn.net/article/details/100985736
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值