0
点赞
收藏
分享

微信扫一扫

七、系统函数

一天清晨 2022-04-25 阅读 16
数据库

MySQL中的函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数和加密函数等其他函数

7.1 数学函数

  1. 绝对值函数ABS(x)和返回圆周率的函数PI()

  2. 平方根函数SQRT(x)和求余函数MOD(x,y)

  3. 获取整数的函数CEIL(x)CEILING(x)FLOOR(x)

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

    FLOOR(x)返回不大于x的 大整数值,返回值转化为一个BIGINT。

  4. 获取随机数的函数RAND()RAND(x)

    RAND(x)返回一个随机浮点值v,范围在0到1之间(0 ≤ v ≤ 1.0)。若已指定一个整数参数x,则它被用作种子值,用来产生重复列。

  5. 函数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位开始后面所有低位的值。

  6. 符号函数SIGN(x)

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

  7. 幂运算函数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 字符串函数

  1. 计算字符串字符数的函数和字符串长度的函数

    CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。

  2. 合并字符串函数CONCAT(s1,s2,…)、 CONCAT_WS(x,s1,s2,…)

  3. 替换字符串的函数INSERT(s1,x,len,s2)

  4. 字母大小写转换函数 LOWER (str)或者LCASE (str)可以将字符串str中的字母字符全部转换成 小写字母。 UPPER(str)或者UCASE(str可以将字符串str中的字母字符全部转换成大写字母。

  5. 获取指定长度的字符串的函数LEFT(s,n)RIGHT(s,n)

  6. 填充字符串的函数LPAD(s1,len,s2)RP

  7. 删除空格的函数LTRIM(s)、RTRIM(s)TRIM(s)

  8. 重复生成字符串的函数REPEAT(s,n)

  9. 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)SPACE(n)返回一个由n个空格组成的字符串。

  10. 比较字符串大小的函数STRCMP(s1,s2)

  11. 获取子串的函数SUBSTRING(s,n,len)MID(s,n,len)

  12. 匹配子串开始位置的函数

    LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)3个函数的作

  13. 字符串逆序的函数REVERSE(s)

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

  14. 返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)

    FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回值为0。如果s为NULL,则返回值为0,原因 是NULL不能同任何值进行同等比较。

  15. 返回子串位置的函数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)
%pAM 或 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; -- 所有信息

 

  1. Id列,用户登录MySQL时,系统分配的是“connection id”。

  2. User列,显示当前用户。如果不是root,这个命令就只显示用户权限范围内的SQL语句。

  3. Host列,显示这个语句是从哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户。

  4. db列,显示这个进程目前连接的是哪个数据库。

  5. Command列,显示当前连接执行的命令,一般取值为休眠 (Sleep)、查询(Query)、连接(Connect)。

  6. Time列,显示这个状态持续的时间,单位是秒。

  7. State列,显示使用当前连接的SQL语句的状态,很重要的列。后续会有所有状态的描述, State只是语句执行中的某一个状态一个SQL语 句,以查询为例,可能需要经过Copying to tmp table、Sorting result、 Sending data等状态才可以完成。

  8. 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。

举报

相关推荐

0 条评论