MySQL 函数

MySQL 有很多内置的函数,以下列出了这些函数的说明。


MySQL字符串函数

函数描述实例
ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。返回字符串 CSDN 的第一个字符的 ASCII 码:
SELECT ASCII("CSDN") AS NumCodeOfFirstChar; -- 返回 67
CHAR_LENGTH(s)返回字符串 s 的字符数。返回字符串 CSDN 的字符数:
SELECT CHAR_LENGTH("CSDN") AS LengthOfString; -- 返回 4
CHARACTER_LENGTH(s)同 CHAR_LENGTH(s) 函数。返回字符串 CSDN 的字符数:
SELECT CHARACTER_LENGTH("CSDN") AS LengthOfString; -- 返回 4
CONCAT(s1,s2,…sn)字符串 s1,s2等多个字符串合并为一个字符串。合并多个字符串:
SELECT CONCAT("Hello ","World") AS ConcatEnactString; -- 返回 Hello World
CONCAT_WS(x,s1,s2,…sn)同 CONCAT(s1,s2,…sn) 函数,但是每个字符串之间要加上 x,x 可以是分隔符。合并多个字符串,并添加分隔符:
SELECT CONCAT_WS("-","Hello","World") AS ConcatEnactString; -- 返回 Hello-World
FIELD(s,s1,s2,…sn)返回第一个字符串 s 在字符串列表(s1,s2,…sn)中的位置。返回字符串 c 在列表值中的位置:
SELECT FIELD("c","a","b","c","d","e"); -- 返回 3
FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置。返回字符串 c 在指定字符串中的位置:
SELECT FIND_IN_SET("c","a,b,c,d,e"); -- 返回 3
FORMAT(x,n)函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入。格式化数字 “#,###.##” 形式:
SELECT FORMAT(260800.5634, 2); -- 返回 260,800.56
INSERT(s1,x,len,s2)字符串 s2 替换 s1 中的 x 位置开始长度为 len 的字符串。从字符串第一个位置开始的 6 个字符替换为 CSDN:
SELECT INSERT("google.com",1,6,"CSDN"); -- 返回 CSDN.com
REPLACE(s,s1,s2)字符串 s2 替换 s 中的 s1 字符串。将字符串 google.com 中的 google 替换为 CSDN:
SELECT REPLACE("google.com","google","CSDN"); -- 返回 CSDN.com
LOCATE(s1,s)从字符串 s 中获取 s1 的开始位置。从字符串 my test string 中获取 test 的开始位置:
SELECT LOCATE("test","my test string"); -- 返回 4
POSITION(s1 in s)同 LOCATE(s1,s) 函数。从字符串 my test string 中获取 test 的开始位置:
SELECT POSITION("test" in "my test string"); -- 返回 4
LCASE(s)将字符串 s 的所有字母转换为小写字母。将字符串 CSDN 的所有字母转换为小写字母:
SELECT LCASE("CSDN"); -- 返回 csdn
LOWER(s)将字符串 s 的所有字母转换为小写字母。将字符串 CSDN 的所有字母转换为小写字母:
SELECT LOWER("CSDN"); -- 返回 csdn
UCASE(s)将字符串 s 的所有字母转换为大写字母。将字符串 csdn 的所有字母转换为大写字母:
SELECT UCASE("csdn"); -- 返回 CSDN
UPPER(s)将字符串 s 的所有字母转换为大写字母。将字符串 csdn 的所有字母转换为大写字母:
SELECT UPPER("csdn"); -- 返回 CSDN
LEFT(s,n)返回字符串 s 的前 n 个字符。返回字符串 CSDN 的前两个字符:
SELECT LEFT("CSDN",2); -- 返回 CS
RIGHT(s,n)返回字符串 s 的后 n 个字符。返回字符串 CSDN 的后两个字符:
SELECT RIGHT("CSDN",2); -- 返回 DN
MID(s,start,length)从字符串 s 的 start 位置截取长度为 length 的子字符串。从字符串 CSDN 的第 2 个位置截取 2 个字符:
SELECT MID("CSDN",2,2); -- 返回 SD
SUBSTR(s,start,length)同 MID(s,start,length) 函数。从字符串 CSDN 的第 2 个位置截取 2 个字符:
SELECT SUBSTR("CSDN",2,2); -- 返回 SD
SUBSTRING(s,start,length)同 SUBSTR(s,start,length) 函数。从字符串 CSDN 的第 2 个位置截取 2 个字符:
SELECT SUBSTRING("CSDN",2,2); -- 返回 SD
SUBSTRING_INDEX(s,delimiter,number)返回字符串 s 从左边/右边开始第 number 个出现的分隔符 delimiter 左边/右边的子字符串。如果 number 是正数,返回字符串 s 从左边开始第 number 个出现的分隔符 delimiter 左边的子字符串;如果 number 是负数,返回字符串 s 从右边开始第 number 的绝对值个出现的分隔符 delimiter 右边的子字符串。从字符串 CSDN 的第 2 个位置截取 2 个字符:
SELECT SUBSTRING_INDEX("a*b*c*d","*",2); -- 返回 a*b
LPAD(s1,len,s2)在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len。将字符串 xx 填充到 abc 字符串的开始处:
SELECT LPAD("abc",5,"xx"); -- 返回 xxabc
RPAD(s1,len,s2)在字符串 s1 的结尾处填充字符串 s2,使字符串长度达到 len。将字符串 xx 填充到 abc 字符串的结尾处:
SELECT RPAD("abc",5,"xx"); -- 返回 abcxx
LTRIM(s)去掉字符串 s 开始处的空格。去掉字符串 CSDN 开始处的空格:
SELECT LTRIM(" CSDN"); -- 返回 CSDN
RTRIM(s)去掉字符串 s 结尾处的空格。去掉字符串 CSDN 结尾处的空格:
SELECT RTRIM("CSDN "); -- 返回 CSDN
TRIM(s)去掉字符串 s 开始和结尾处的空格。去掉字符串 CSDN 开始和结尾处的空格:
SELECT TRIM(" CSDN "); -- 返回 CSDN
SPACE(n)返回 n 个空格。返回 10 个空格:
SELECT SPACE(10);
REPEAT(s,n)将字符串 s 重复 n 次。将字符串 CSDN 重复三次:
SELECT REPEAT("CSDN",3); -- 返回 CSDNCSDNCSDN
REVERSE(s)将字符串 s 的顺序反转。将字符串 CSDN 的顺序反转:
SELECT REVERSE("CSDN"); -- 返回 NDSC
STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0,如果 s1>s2 返回 1,如果 s1<s2 返回 -1。比较字符串:
SELECT STRCMP("CSDN","CSDN"); -- 返回 0

MySQL 数字函数

函数描述实例
ABS(x)返回 x 的绝对值。返回 -1 的绝对值:
SELECT ABS(-1); -- 返回 1
PI()返回圆周率(π)。返回圆周率(π):
SELECT PI();
SIN(x)返回 x 的正弦值(参数为弧度)。返回 π/2 的正弦值:
SELECT SIN(PI()/2);
COS(x)返回 x 的余弦值(参数为弧度)。返回 π/2 的余弦值:
SELECT COS(PI()/2);
TAN(x)返回 x 的正切值(参数为弧度)。返回 π/4 的正切值:
SELECT TAN(PI()/4);
COT(x)返回 x 的余切值(参数为弧度)。返回 π/4 的余切值:
SELECT COT(PI()/4);
ASIN(x)返回 x 的反正弦值(参数为弧度)。返回 1 的反正弦值:
SELECT ASIN(1);
ACOS(x)返回 x 的反余弦值(参数为弧度)。返回 1 的反余弦值:
SELECT ACOS(1);
ATAN(x)返回 x 的反正切值(参数为弧度)。返回 1 的反正切值:
SELECT ATAN(1);
ATAN2(x,y)返回 (x,y) 的反正切值(参数为弧度)。返回坐标 (-1,2) 的反正切值:
SELECT ATAN2(-1,2);
DEGREES(x)将弧度转换为角度。将 π/2 转换为角度:
SELECT DEGREES(PI()/2);
RADIANS(x)将角度转换为弧度。将 90° 转换为弧度:
SELECT RADIANS(90);
MAX(expression)返回一个表达式的最大值,expression 是一个字段。返回 Products 表中 Price 字段的最大值:
SELECT MAX(Price) AS MaxPrice FROM Products;
MIN(expression)返回一个表达式的最小值,expression 是一个字段。返回 Products 表中 Price 字段的最小值:
SELECT MIN(Price) AS MinPrice FROM Products;
AVG(expression)返回一个表达式的平均值,expression 是一个字段。返回 Products 表中 Price 字段的平均值:
SELECT AVG(Price) AS AveragePrice FROM Products;
SUM(expression)返回一个表达式的总和,expression 是一个字段。返回 Products 表中 Price 字段的总和:
SELECT SUM(Price) AS TotalPrice FROM Products;
COUNT(expression)返回查询的记录总数,expression 参数是一个字段或者 * 号。返回 Products 表中总共有多少条记录:
SELECT COUNT(*) FROM Products;
CEIL(x)x 向上取整。1.5 向上取整:
SELECT CEIL(1.5); -- 返回 2
CEILING(x)同 CEIL(x) 函数。1.5 向上取整:
SELECT CEILING(1.5); -- 返回 2
FLOOR(x)x 向下取整。1.5 向下取整:
SELECT FLOOR(1.5); -- 返回 1
n DIV m整除,n 为被除数,m 为除数。计算 12 除以 5:
SELECT 12 DIV 5; -- 返回 2
MOD(n,m)返回 n 除以 m 的余数。返回 12 除以 5 的余数:
SELECT MOD(12,5); -- 返回 2
EXP(x)返回 e 的 x 次方。计算 e 的 3 次方:
SELECT EXP(3);
POW(n,x)返回 n 的 x 次方。计算 2 的 3 次方:
SELECT POW(2,3); -- 返回 8
POWER(n,x)同 POW(n,x) 函数。计算 2 的 3 次方:
SELECT POWER(2,3); -- 返回 8
SQRT(x)返回 x 的平方根。返回 36 的平方根:
SELECT SQRT(36); -- 返回 6
GREATEST(s1,s2,…sn)返回列表中的最大值。返回以下数字列表中的最大值:
SELECT GREATEST(3,12,24,10,6,20); -- 返回 24
返回以下字符串列表中的最大值:
SELECT GREATEST("Google","CSDN","Microsoft"); -- 返回 Microsoft
LEAST(s1,s2,…sn)返回列表中的最小值。返回以下数字列表中的最小值:
SELECT LEAST(3,12,24,10,6,20); -- 返回 3
返回以下字符串列表中的最小值:
SELECT LEAST("Google","CSDN","Microsoft"); -- 返回 CSDN
LN(x)返回 x 的自然对数,以 e 为底。返回 2 的自然对数:
SELECT LN(2);
LOG2(x)返回以 2 为底的对数。返回以 2 为底 6 的对数:
SELECT LOG2(6);
LOG10(x)返回以 10 为底的对数。返回以 10 为底 100 的对数:
SELECT LOG10(100);
LOG([base],x)返回以 base 为底的对数,可选参数 base 如果省略,则返回以 e 为底的自然对数。返回以 6 为底 36 的对数:
SELECT LOG(6,36);
RAND()返回 0 到 1 的随机数。返回 0 到 1 的随机数:
SELECT RAND();
ROUND(x,[y])返回离 x 最近的整数,可选参数 y 表示要四舍五入的小数位数,如果省略,则返回整数。3.1415926 保留 2 位小数:
SELECT ROUND(3.1415926,2); -- 返回 3.14
TRUNCATE(x,y)返回 x 保留小数点后 y 位的值(与 ROUND(x,[y]) 函数最大的区别是不会进行四舍五入)。3.1415926 保留 4 位小数,不进行四舍五入:
SELECT TRUNCATE(3.1415926,4); -- 返回 3.1415
SIGN(x)返回 x 的符号,x 是负数、0、正数分别返回 -1、0、1。返回 -6 的符号:
SELECT SIGN(-6); -- 返回 -1

MySQL 日期函数

函数描述实例
CURDATE()返回当前日期。返回当前日期:
SELECT CURDATE();
CURRENT_DATE()同 CURDATE() 函数。返回当前日期:
SELECT CURRENT_DATE();
CURTIME()返回当前时间。返回当前时间:
SELECT CURTIME();
CURRENT_TIME()同 CURTIME() 函数。返回当前时间:
SELECT CURRENT_TIME();
NOW()返回当前日期和时间。返回当前日期和时间:
SELECT NOW();
SYSDATE()同 NOW() 函数。返回当前日期和时间:
SELECT SYSDATE();
CURRENT_TIMESTAMP()同 SYSDATE() 函数。返回当前日期和时间:
SELECT CURRENT_TIMESTAMP();
LOCALTIME()同 CURRENT_TIMESTAMP() 函数。返回当前日期和时间:
SELECT LOCALTIME();
LOCALTIMESTAMP()同 LOCALTIME() 函数。返回当前日期和时间:
SELECT LOCALTIMESTAMP();
ADDDATE(d,INTERVAL n type)计算起始日期 d 加上一个时间段后的日期,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。返回 2022-10-10 10:26:36 加上 10 天后的日期和时间:
SELECT ADDDATE("2022-10-10 10:26:36",INTERVAL 10 DAY) -- 返回 2022-10-20 10:26:36;
返回 2022-10-10 10:26:36 加上 10 分钟后的日期和时间:
SELECT ADDDATE("2022-10-10 10:26:36",INTERVAL 10 MINUTE) -- 返回 2022-10-10 10:36:36;
返回 2022-10-10 10:26:36 减去 10 小时后的日期和时间:
SELECT ADDDATE("2022-10-10 10:26:36",INTERVAL -10 HOUR) -- 返回 2022-10-10 00:26:36;
返回 2022-10-10 10:26:36 减去 10 个月后的日期和时间:
SELECT ADDDATE("2022-10-10 10:26:36",INTERVAL -10 MONTH) -- 返回 2021-12-10 10:26:36;
DATE_ADD(d,INTERVAL n type)同 ADDDATE(d,INTERVAL x type) 函数。返回 2022-10-10 10:26:36 加上 10 天后的日期和时间:
SELECT DATE_ADD("2022-10-10 10:26:36",INTERVAL 10 DAY) -- 返回 2022-10-20 10:26:36;
返回 2022-10-10 10:26:36 加上 10 分钟后的日期和时间:
SELECT DATE_ADD("2022-10-10 10:26:36",INTERVAL 10 MINUTE) -- 返回 2022-10-10 10:36:36;
返回 2022-10-10 10:26:36 减去 10 小时后的日期和时间:
SELECT DATE_ADD("2022-10-10 10:26:36",INTERVAL -10 HOUR) -- 返回 2022-10-10 00:26:36;
返回 2022-10-10 10:26:36 减去 10 个月后的日期和时间:
SELECT DATE_ADD("2022-10-10 10:26:36",INTERVAL -10 MONTH) -- 返回 2021-12-10 10:26:36;
SUBDATE(d,INTERVAL n type)计算起始日期 d 减去一个时间段后的日期,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。返回 2022-10-10 10:26:36 减去 10 天后的日期和时间:
SELECT SUBDATE("2022-10-10 10:26:36",INTERVAL 10 DAY) -- 返回 2022-09-30 10:26:36;
返回 2022-10-10 10:26:36 减去 10 分钟后的日期和时间:
SELECT SUBDATE("2022-10-10 10:26:36",INTERVAL 10 MINUTE) -- 返回 2022-10-10 10:16:36;
返回 2022-10-10 10:26:36 加上 10 小时后的日期和时间:
SELECT SUBDATE("2022-10-10 10:26:36",INTERVAL -10 HOUR) -- 返回 2022-10-10 20:26:36;
返回 2022-10-10 10:26:36 加上 10 个月后的日期和时间:
SELECT SUBDATE("2022-10-10 10:26:36",INTERVAL -10 MONTH) -- 返回 2023-08-10 10:26:36;
DATE_SUB(d,INTERVAL n type)同 SUBDATE(d,INTERVAL x type) 函数。返回 2022-10-10 10:26:36 减去 10 天后的日期和时间:
SELECT DATE_SUB("2022-10-10 10:26:36",INTERVAL 10 DAY) -- 返回 2022-09-30 10:26:36;
返回 2022-10-10 10:26:36 减去 10 分钟后的日期和时间:
SELECT DATE_SUB("2022-10-10 10:26:36",INTERVAL 10 MINUTE) -- 返回 2022-10-10 10:16:36;
返回 2022-10-10 10:26:36 加上 10 小时后的日期和时间:
SELECT DATE_SUB("2022-10-10 10:26:36",INTERVAL -10 HOUR) -- 返回 2022-10-10 20:26:36;
返回 2022-10-10 10:26:36 加上 10 个月后的日期和时间:
SELECT DATE_SUB("2022-10-10 10:26:36",INTERVAL -10 MONTH) -- 返回 2023-08-10 10:26:36;
ADDTIME(t,n)计算起始时间 t 加上一个时间段后的时间。返回 2022-10-10 10:26:36 加上 10 秒后的日期和时间:
SELECT ADDTIME("2022-10-10 10:26:36",10) -- 返回 2022-10-10 10:26:46;
返回 2022-10-10 10:26:36 加上 2 小时 10 分钟 20 秒后的日期和时间:
SELECT ADDTIME("2022-10-10 10:26:36","02:10:20") -- 返回 2022-10-10 12:36:56;
返回 2022-10-10 10:26:36 减去 10 秒后的日期和时间:
SELECT ADDTIME("2022-10-10 10:26:36",-10) -- 返回 2022-10-10 10:26:26;
返回 2022-10-10 10:26:36 减去 2 小时 10 分钟 20 秒后的日期和时间:
SELECT ADDTIME("2022-10-10 10:26:36","-02:10:20") -- 返回 2022-10-10 08:16:16;
SUBTIME(t,n)计算起始时间 t 减去一个时间段后的时间。返回 2022-10-10 10:26:36 减去 10 秒后的日期和时间:
SELECT SUBTIME("2022-10-10 10:26:36",10) -- 返回 2022-10-10 10:26:26;
返回 2022-10-10 10:26:36 减去 2 小时 10 分钟 20 秒后的日期和时间:
SELECT SUBTIME("2022-10-10 10:26:36","02:10:20") -- 返回 2022-10-10 08:16:16;
返回 2022-10-10 10:26:36 加上 10 秒后的日期和时间:
SELECT SUBTIME("2022-10-10 10:26:36",-10) -- 返回 2022-10-10 10:26:46;
返回 2022-10-10 10:26:36 加上 2 小时 10 分钟 20 秒后的日期和时间:
SELECT SUBTIME("2022-10-10 10:26:36","-02:10:20") -- 返回 2022-10-10 12:36:56;
PERIOD_ADD(p,n)为年-月组合日期添加一个时段。2022 年 10 月加上 2 个月:
SELECT PERIOD_ADD(202210,2) -- 返回 202212;
2022 年 10 月减去 2 个月:
SELECT PERIOD_ADD(202210,-2) -- 返回 202208;
TIMESTAMP(d,t)一个参数时,函数返回日期或日期时间表达式;两个参数时,函数返回两个参数的和。一个参数:
SELECT TIMESTAMP("2022-10-10") -- 返回 2022-10-10 00:00:00;
两个参数:
SELECT TIMESTAMP("2021-12-31 10:26:46","20:00:00") -- 返回 2022-01-01 06:26:46;
DATE(d)从日期或日期时间表达式中提取日期。从 2022-10-10 10:26:36 中提取日期:
SELECT DATE("2022-10-10 10:26:36") -- 返回 2022-10-10;
TIME(d)从时间或日期时间表达式中提取时间。从 2022-10-10 10:26:36 中提取时间:
SELECT TIME("2022-10-10 10:26:36") -- 返回 10:26:36;
EXTRACT(type FROM d)从日期 d 中获取指定的值,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。返回 2022-10-10 10:26:36 的年份部分:
SELECT EXTRACT(YEAR FROM "2022-10-10 10:26:36") -- 返回 2022;
返回 2022-10-10 10:26:36 是第几周:
SELECT EXTRACT(WEEK FROM "2022-10-10 10:26:36") -- 返回 41;
QUARTER(d)返回日期 d 是第几季度,返回 1 到 4。返回 2022-06-10 是第几季度:
SELECT QUARTER("2022-06-10") -- 返回 2;
YEARWEEK(d,[mode])返回年份及第几周(1 到 53),mode 中 0 表示周天是一周的起始日期,1 表示周一是一周的起始日期,2 表示周天是一周的起始日期,3 表示周一是一周的起始日期,以此类推。返回年份及第几周:
SELECT YEARWEEK("2023-01-01"); -- 返回 202301
SELECT YEARWEEK("2023-01-01",0); -- 返回 202301
SELECT YEARWEEK("2023-01-01",1); -- 返回 202252
SELECT YEARWEEK("2023-01-01",2); -- 返回 202301
SELECT YEARWEEK("2023-01-01",3); -- 返回 202252
WEEK(d)返回日期 d 是第几周,返回 0 到 53。返回 2022-01-01 是第几周:
SELECT WEEK("2022-01-01") -- 返回 0;
WEEKOFYEAR(d)返回日期 d 是第几周,返回 1 到 52。返回 2022-01-01 是第几周:
SELECT WEEKOFYEAR("2022-01-01") -- 返回 52;
YEAR(d)返回日期 d 的年份部分。返回 2022-01-10 的年份部分:
SELECT YEAR("2022-01-10") -- 返回 2022;
MONTH(d)返回日期 d 的月份部分,1 到 12。返回 2022-01-10 的月份部分:
SELECT MONTH("2022-01-10") -- 返回 1;
DAY(d)返回日期 d 的日期部分,1 到 31。返回 2022-10-01 的日期部分:
SELECT DAY("2022-10-01") -- 返回 1;
HOUR(t)返回时间 t 的小时部分。返回 24:10:20 的小时部分:
SELECT HOUR("24:10:20") -- 返回 24;
MINUTE(t)返回时间 t 的分钟部分,0 到 59。返回 12:00:20 的分钟部分:
SELECT MINUTE("12:00:20") -- 返回 0;
SECOND(t)返回时间 t 的秒钟部分,0 到 59。返回 12:10:00 的秒钟部分:
SELECT SECOND("12:10:00") -- 返回 0;
MICROSECOND(t)返回时间 t 的微秒部分。返回 12:10:20.000068 的微秒部分:
SELECT MICROSECOND("12:10:20.000068") -- 返回 68;
DAYNAME(d)返回日期 d 是星期几,如 Monday、Tuesday。返回 2022-10-10 是星期几:
SELECT DAYNAME("2022-10-10") -- 返回 Monday;
DAYOFWEEK(d)返回日期 d 是星期几,1 星期日,2 星期一,以此类推。返回 2022-10-10 是星期几:
SELECT DAYOFWEEK("2022-10-10") -- 返回 2;
WEEKDAY(d)返回日期 d 是星期几,0 星期一,1 星期二,以此类推。返回 2022-10-10 是星期几:
SELECT WEEKDAY("2022-10-10") -- 返回 0;
MONTHNAME(d)返回日期 d 是几月,如 January、February。返回 2022-10-10 是几月:
SELECT MONTHNAME("2022-10-10") -- 返回 October;
DAYOFMONTH(d)计算日期 d 是本月的第几天。返回 2022-10-10 是本月的第几天:
SELECT DAYOFMONTH("2022-10-10") -- 返回 10;
DAYOFYEAR(d)计算日期 d 是本年的第几天。返回 2022-10-10 是本年的第几天:
SELECT DAYOFYEAR("2022-10-10") -- 返回 283;
LAST_DAY(d)返回日期 d 所在月份的最后一天。返回 2022-10-10 所在月份的最后一天:
SELECT LAST_DAY("2022-10-10") -- 返回 2022-10-31;
FROM_DAYS(n)计算从 0000 年 01 月 01 日开始 n 天后的日期。返回 0000 年 01 月 01 日开始 10000 天后的日期:
SELECT FROM_DAYS(10000) -- 返回 0027-05-19;
TO_DAYS(d)计算日期 d 距离 0000 年 01 月 01 日的天数。返回 2022-10-10 12:26:36 距离 0000 年 01 月 01 日的天数:
SELECT TO_DAYS("2022-10-10 12:26:36") -- 返回 738803;
TIMESTAMPDIFF(type,d1,d2)计算日期 d1->d2 之间的时间差,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。计算两个时间相隔多少周:
SELECT TIMESTAMPDIFF(WEEK,"2022-06-10 10:26:36","2022-10-10 12:26:36") -- 返回 17;
计算两个时间相隔多少分钟:
SELECT TIMESTAMPDIFF(MINUTE,"2022-10-12","2022-10-10 12:26:36") -- 返回 -2133;
DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数。返回 2022-01-01->2022-02-02 之间相隔的天数:
SELECT DATEDIFF("2022-01-01","2022-02-02") -- 返回 -32;
PERIOD_DIFF(p1,p2)计算时段 p1->p2 之间相隔的月数。返回 202210->202202 之间相隔的月数:
SELECT PERIOD_DIFF(202210,202202) -- 返回 8;
TIMEDIFF(t1,t2)计算时间 t1->t2 之间相隔的时间。返回 12:10:20->18:10:20 之间相隔的时间:
SELECT TIMEDIFF("20:10:20","18:10:20") -- 返回 02:00:00;
DATE_FORMAT(d,f)按表达式 f 的要求显示日期 d。格式化日期:
SELECT DATE_FORMAT("2022-01-01 12:10:20","%Y-%m-%d %r") -- 返回 2022-01-01 12:10:20 PM;
TIME_FORMAT(t,f)按表达式 f 的要求显示时间 t。格式化时间:
SELECT TIME_FORMAT("12:10:20","%r") -- 返回 12:10:20 PM;
MAKEDATE(year,day-of-year)基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期。返回 2022 年第 10 天的日期:
SELECT MAKEDATE(2022,10) -- 返回 2022-01-10;
MAKETIME(hour,minute,second)组合时间,参数分别为小时、分钟、秒。12 时 10 分 20 秒:
SELECT MAKETIME(12,10,20) -- 返回 12:10:20;
SEC_TO_TIME(s)将以秒为单位的时间 s 转换为时分秒的格式。将 4320 秒转换为时分秒的格式:
SELECT SEC_TO_TIME(4320) -- 返回 01:12:00;
TIME_TO_SEC(t)将时分秒 t 转换为以秒为单位的时间。将 01:12:00 转换为以秒为单位的时间:
SELECT TIME_TO_SEC("01:12:00") -- 返回 4320;
STR_TO_DATE(string,format)将字符串转换为日期。将 August 10 2022 转换为日期:
SELECT STR_TO_DATE("August 10 2022","%M %d %Y") -- 返回 2022-08-10;

MySQL 高级函数

函数描述实例
BIN(x)返回 x 的二进制编码。16 的二进制编码:
SELECT BIN(16) -- 返回 10000;
BINARY(s)将字符串 s 转换为二进制字符串。将字符串 CSDN 转换为二进制字符串:
SELECT BINARY("CSDN") -- 返回 CSDN;
CASE expression
WHEN condition1 THEN result1
WHEN condition2 THEN result2

WHEN conditionN THEN resultN
ELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1;如果 condition2 成立,则返回 result2;如果 conditionN 成立,则返回 resultN;当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。返回今天是星期几:
SELECT CASE DAYOFWEEK(NOW())
WHEN 1 THEN "星期日"
WHEN 2 THEN "星期一"
WHEN 3 THEN "星期二"
WHEN 4 THEN "星期三"
WHEN 5 THEN "星期四"
WHEN 6 THEN "星期五"
WHEN 7 THEN "星期六"
ELSE "异常"
END;
CAST(x AS type)转换数据类型。将字符串 20200101 转换为日期:
SELECT CAST("20200101" AS DATE) -- 返回 2020-01-01;
COALESCE(s1,s2,…sn)返回参数中的第一个非空表达式(从左向右)。返回参数中的第一个非空表达式(从左向右):
SELECT COALESCE(NULL,NULL,"CSDN",NULL,"Google") -- 返回 CSDN;
CONNECTION_ID()返回唯一的连接 ID。返回唯一的连接 ID:
SELECT CONNECTION_ID();
CONV(x,f1,f2)将 x 由 f1 进制转换为 f2 进制。将 12 由十进制转换为二进制:
SELECT CONV(12,10,2) -- 返回 1100;
CONVERT(s USING cs)将字符串 s 的字符集转换为 cs。将字符串 ABC 的字符集转换为 GBK:
SELECT CHARSET(CONVERT("ABC" USING GBK)) -- 返回 gbk;
USER()返回当前用户和 IP 地址。返回当前用户和 IP 地址:
SELECT USER();
SYSTEM_USER()同 USER() 函数。返回当前用户和 IP 地址:
SELECT SYSTEM_USER();
SESSION_USER()同 SYSTEM_USER() 函数。返回当前用户和 IP 地址:
SELECT SESSION_USER();
CURRENT_USER()返回当前用户。返回当前用户:
SELECT CURRENT_USER();
DATABASE()返回当前数据库名。返回当前数据库名:
SELECT DATABASE();
VERSION()返回数据库版本号。返回数据库版本号:
SELECT VERSION();
IF(expression,s1,s2)如果表达式 expression 成立,返回 s1;否则,返回 s2。判断 1+1=2 是否正确:
SELECT IF(1 + 1 = 2,"True","False") -- 返回 True;
IFNULL(s1,s2)如果 s1 不为 NULL,返回 s1,否则,返回 s2。SELECT IFNULL(NULL,"Hello World") -- 返回 Hello World;
NULLIF(s1,s2)比较 s1 和 s2,如果 s1 与 s2 相等,返回 NULL;否则,返回 s1。SELECT NULLIF("ABC","ABC") -- 返回 ;
ISNULL(expression)判断表达式是否为 NULL。判断表达式是否为 NULL:
SELECT ISNULL(NULL) -- 返回 1;
LAST_INSERT_ID()返回最近生成的 AUTO_INCREMENT 值。返回最近生成的 AUTO_INCREMENT 值:
SELECT LAST_INSERT_ID();

以下是 MySQL 8.0 版本新增的一些常用函数:

函数描述实例
JSON_OBJECT(k1,v1,k2,v2,…kn,vn)将键值对转换为 JSON 对象。将键值对转换为 JSON 对象:
SELECT JSON_OBJECT("name","小明","gender","男","age",12) -- 返回 {"age": 12, "name": "小明", "gender": "男"};
JSON_ARRAY(a1,a2,…an)将值转换为 JSON 数组。将值转换为 JSON 数组:
SELECT JSON_ARRAY(1,2,"three") -- 返回 [1, 2, "three"];
JSON_EXTRACT(json,path)从 JSON 中提取指定的值。从 JSON 中提取 name 的值:
SELECT JSON_EXTRACT(JSON_OBJECT("name","小明","gender","男","age",12),"$.name") -- 返回 "小明";
从 JSON 中提取索引为 0 的值:
SELECT JSON_EXTRACT(JSON_ARRAY(1,2,"three"),"$[0]") -- 返回 1;
JSON_CONTAINS(json1,json2,[path])检查 JSON 中是否包含指定的值,可选参数 path 表示在指定的路径中检查,如果省略,则在整个 JSON 中检查。在整个 JSON 中检查是否包含 “小明”:
SELECT JSON_CONTAINS(JSON_OBJECT("name","小明","gender","男","age",12),'"小明"') -- 返回 0;
在整个 JSON 中检查是否包含 {“name”:“小明”}:
SELECT JSON_CONTAINS(JSON_OBJECT("name","小明","gender","男","age",12),'{"name":"小明"}') -- 返回 1;
在指定路径中检查是否包含 “小明”:
SELECT JSON_CONTAINS(JSON_OBJECT("name","小明","gender","男","age",12),'"小明"',"$.name") -- 返回 1;
ROW_NUMBER() [OVER(PARTITION BY expression ORDER BY expression)]生成其分区内每行的行号。OVER是可选参数,PARTITION BY 表示如何将查询结果划分分区,如果省略,则将所有查询结果视为一个分区;ORDER BY 表示如何将每个分区的查询结果排序,如果省略,则每个分区的查询结果是无序的。查询 sales 表,生成其分区内每行的行号。:
SELECT
year,country,product,profit,
ROW_NUMBER() AS row_number1,
ROW_NUMBER() OVER(PARTITION BY country) AS row_number2,
ROW_NUMBER() OVER(PARTITION BY country ORDER BY year,product) AS row_number3
FROM sales;
RANK() [OVER(PARTITION BY expression ORDER BY expression)]生成其分区内每行的行号(带间隔)。OVER是可选参数,PARTITION BY 表示如何将查询结果划分分区,如果省略,则将所有查询结果视为一个分区;ORDER BY 表示如何将每个分区的查询结果排序,如果省略,则每个分区的查询结果是无序的。查询 sales 表,生成其分区内每行的行号。:
SELECT
year,country,product,
ROW_NUMBER() OVER(PARTITION BY country ORDER BY year,product) AS row_number
RANK() OVER(PARTITION BY country ORDER BY year,product) AS rank
FROM sales;
DENSE_RANK() [OVER(PARTITION BY expression ORDER BY expression)]生成其分区内每行的行号(不带间隔)。OVER是可选参数,PARTITION BY 表示如何将查询结果划分分区,如果省略,则将所有查询结果视为一个分区;ORDER BY 表示如何将每个分区的查询结果排序,如果省略,则每个分区的查询结果是无序的。查询 sales 表,生成其分区内每行的行号。:
SELECT
year,country,product,
ROW_NUMBER() OVER(PARTITION BY country ORDER BY year,product) AS row_number
RANK() OVER(PARTITION BY country ORDER BY year,product) AS rank
DENSE_RANK() OVER(PARTITION BY country ORDER BY year,product) AS dense_rank
FROM sales;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值