MySQL中的函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数和加密函数等其他函数
7.1 数学函数
-
绝对值函数ABS(x)和返回圆周率的函数PI()
-
平方根函数SQRT(x)和求余函数MOD(x,y)
-
获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)
CEIL(x)和CEILING(x)的意义相同,返回不小于x的 小整数值,返回 值转化为一个BIGINT。
FLOOR(x)返回不大于x的 大整数值,返回值转化为一个BIGINT。
-
获取随机数的函数RAND()和RAND(x)
RAND(x)返回一个随机浮点值v,范围在0到1之间(0 ≤ v ≤ 1.0)。若已指定一个整数参数x,则它被用作种子值,用来产生重复列。
-
函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)
ROUND(x)返回 接近于参数x的整数,对x值进行四舍五入。
ROUND(x,y)返回 接近于参数x的数,其值保留到小数点后面y位,若y为负值,则将保留x值到小数点左边y位。
TRUNCATE(x,y)返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y设为负数,则截(归零)x小数点左起第y位开始后面所有低位的值。
-
符号函数SIGN(x)
SIGN(x)返回参数的符号,x的值为负、零或正时返回结果依次为-1、0或1。
-
幂运算函数POW(x,y)、POWER(x,y)和EXP(x)
POW(x,y)或者POWER(x,y)函数返回x的y次乘方的结果值。 EXP(x)返回e的x乘方后的值。
SELECT ROUND(AVG(empid),1) FROM emp; SELECT TRUNCATE(AVG(empid),1) FROM emp;
7.2 字符串函数
-
计算字符串字符数的函数和字符串长度的函数
CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。
-
合并字符串函数CONCAT(s1,s2,…)、 CONCAT_WS(x,s1,s2,…)
-
替换字符串的函数INSERT(s1,x,len,s2)
-
字母大小写转换函数 LOWER (str)或者LCASE (str)可以将字符串str中的字母字符全部转换成 小写字母。 UPPER(str)或者UCASE(str可以将字符串str中的字母字符全部转换成大写字母。
-
获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
-
填充字符串的函数LPAD(s1,len,s2)和RP
-
删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
-
重复生成字符串的函数REPEAT(s,n)
-
空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)SPACE(n)返回一个由n个空格组成的字符串。
-
比较字符串大小的函数STRCMP(s1,s2)
-
获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)
-
匹配子串开始位置的函数
LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)3个函数的作
-
字符串逆序的函数REVERSE(s)
REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相 反。
-
返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)
FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回值为0。如果s为NULL,则返回值为0,原因 是NULL不能同任何值进行同等比较。
-
返回子串位置的函数FIND_IN_SET(s1,s2)
FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为 NULL,则返回值为NULL。 这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。
SELECT CHAR_LENGTH('helloworld');
-- 字符串拼接
SELECT CONCAT('hello','-','world','-','你好');
-- 以*来拼接后面的字符串
SELECT CONCAT_WS('*','hello','world','你好');
-- 查找hello,再后面的字符串列表中的位置 从 1 开始
SELECT FIELD('hello','你好','延安','helloworld');
SELECT FIND_IN_SET('hello','你好,延安,hello,world');
SELECT empid,empname,empsex FROM emp;
SELECT CONCAT_WS('-',empid,empname,empsex) FROM emp;
SELECT FORMAT("256998.855",1);
-- 从第6个开始4个长度替换为ab
SELECT INSERT('helloworld',6,4,'ab');
-- 检索world再helloworld中出现的位置
SELECT LOCATE('world','helloworld');
-- 从左边截取
SELECT LEFT('helloworld',8);
-- 从右边截取
SELECT RIGHT('helloworld',8);
-- 从第6个位置开始截取到最后
SELECT SUBSTR('helloworld',6);
-- 从第6个位置开始截取三个长度
SELECT SUBSTR('helloworld',6,3);
7.3 日期和时间函数
1.系统当前时间
SELECT NOW();
SELECT SYSDATE();
SELECT CURDATE(); -- 年月日
SELECT CURRENT_DATE(); -- 年月日
SELECT CURRENT_TIME; -- 时分秒
SELECT CURTIME(); -- 时分秒
2.addXXX()加上
-- adddate()加上天数
SELECT ADDDATE(NOW(),40);
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 MINUTE); -- 5 分钟
SELECT ADDDATE('2020-10-19 12:32:45',5); -- 5 天
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 YEAR); -- 5 年
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 MONTH); -- 5 个月
-- 加上秒,最大到59
SELECT ADDTIME(NOW(),59),NOW();
3.DATEDIFF() 两个时间相差天数
SELECT DATEDIFF(NOW(),'2020-5-8');
4.DATE_FORMAT 日期格式化
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点%i分%s秒')
简写 | 含义 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
5.DATE_SUB(date,INTERVAL expr type) 减去多少天
SELECT DATE_SUB(NOW(),INTERVAL 45 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 3 YEAR);
SELECT DATE_SUB(NOW(),INTERVAL 3 MONTH);
6.EXTRACT
EXTRACT(type FROM date)函数所使用的时间间隔类型说明符与DATE_ADD()或DATE_SUB()的相同,但它从日期中提取一部分,而不是执行日期运算
SELECT EXTRACT(DAY FROM NOW()) ;
SELECT EXTRACT(YEAR FROM NOW()) ;
SELECT EXTRACT(MONTH FROM NOW()) ;
7.MONTH(),MONTHNAME() 获取月份函数
SELECT MONTH(NOW()); -- 获取月份数字
SELECT MONTHNAME(NOW()); -- 获取月份 英文
8.DAYNAME(d)、DAYOFWEEK(d)和WEEKDAY(d)
DAYNAME(d)函数返回d对应的工作日的英文名称,例如Sunday、 Monday等
DAYOFWEEK(d)函数返回d对应的一周中的索引(位置,1表示周日,2表示周一,...,7表示周六)。
WEEKDAY(d)返回d对应的工作日索引:0表示周一,1表示周二,...,6表示周日。
9.WEEK(d)和WEEKOFYEAR(d)
WEEK(d)计算日期d是一年中的第几周WEEK()的双参数形式允许指定该星期是否起始于周日或周一,以及返回值的范围是否为0~53或1~53。 若Mode参数被省略,则使用default_week_format 系统自变量的值.
WEEKOFYEAR(d)计算某天位于一年中的第几周,范围是1~53,相当于WEEK(d,3)。
SELECT WEEK(NOW()),WEEK(NOW(),0),WEEK(NOW(),1),WEEK(NOW(),3);
10.DAYOFYEAR(d)和DAYOFMONTH(d)
DAYOFYEAR(d)函数返回d是一年中的第几天,范围是1~366。
DAYOFMONTH(d)函数返回d是一个月中的第几天,范围是1~31。
11.YEAR(),QUARTER(),MINUTE(),SECOND()
YEAR(date)返回date对应的年份,范围是1970~2069.
QUARTER(date)返回date对应的一年中的季度值,范围是1~4。
MINUTE(time)返回time对应的分钟数,范围是0~59。
SECOND(time)返回time对应的秒数,范围是0~59。
7.4条件判断函数
1.IF(expr,v1,v2)函数
IF(expr, v1, v2):如果表达式expr是TRUE(expr <> 0 and expr <> NULL),则返回值为v1;否则返回值为v2.IF()的返回值为数字值或字符串值,具体情况视其所在语境而定
SELECT salary, IF(salary>20000,'高工资','低工资') FROM employees;
2.IFNULL(v1,v2)函数
IFNULL(v1,v2):假如v1不为NULL,则IFNULL()的返回值为v1;否则其返回值为v2。
SELECT manager_id,IFNULL(manager_id,'无上级领导') FROM employees;
3.CASE函数
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2]…[ELSE rn+1] END:如果expr值等于某个vn,则返回对应位置THEN后面的结果;如果与所有值都不相等,则返回ELSE后面的rn+1
SELECT salary,
CASE salary WHEN 24000 THEN '高工资'
WHEN 17000 THEN '基本工资'
END
FROM employees;
SELECT job_id,
CASE job_id WHEN 'AD_PRES' THEN 'CEO'
WHEN 'AD_VP' THEN '经理'
WHEN 'IT_PROG' THEN 'IT'
ELSE '基本工种'
END jobtype
FROM employees;
7.5系统信息函数
SELECT VERSION(); -- 版本
SELECT CONNECTION_ID(); -- 查看当前用户的链接数
-- 查看链接的详细信息
SHOW PROCESSLIST; -- 前100条
SHOW FULL PROCESSLIST; -- 所有信息
-
Id列,用户登录MySQL时,系统分配的是“connection id”。
-
User列,显示当前用户。如果不是root,这个命令就只显示用户权限范围内的SQL语句。
-
Host列,显示这个语句是从哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户。
-
db列,显示这个进程目前连接的是哪个数据库。
-
Command列,显示当前连接执行的命令,一般取值为休眠 (Sleep)、查询(Query)、连接(Connect)。
-
Time列,显示这个状态持续的时间,单位是秒。
-
State列,显示使用当前连接的SQL语句的状态,很重要的列。后续会有所有状态的描述, State只是语句执行中的某一个状态一个SQL语 句,以查询为例,可能需要经过Copying to tmp table、Sorting result、 Sending data等状态才可以完成。
-
Info列,显示这个SQL语句,是判断问题语句的一个重要依据。
7.6 获取用户名函数
SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER();
7.7 获取最后一个自动生成的ID的值函数
LAST_INSERT_ID()函数返回 后生成的AUTO_INCREMENT值。
select LAST_INSERT_ID()
在向数 据表中插入一条新记录时,LAST_INSERT_ID()返回带有 AUTO_INCREMENT约束的字段 新生成的值;使用一条INSERT语句插入多行时,LAST_INSERT_ID()只返回插的第一行数据时产生的值之所以这样,是因为这 使依靠其他服务器复制同样的INSERT语句变得简单。
7.8其他函数
格式化函数FORMAT(x,n)
SELECT FORMAT(14722.25862, 4),FORMAT(14722.25868, 4),FORMAT(14722.25862,0);
类型转换函数:CAST(x, AS type)和CONVERT(x, type)函数将一个类型的值转换为另一个类型的值,可转换的type有BINARY、CHAR(n)、DATE、TIME、 DATETIME、DECIMAL、SIGNED、UNSIGNED。