千家信息网

MySQL的函数和触发器的使用

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,前言MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标
千家信息网最后更新 2025年01月23日MySQL的函数和触发器的使用

前言

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

一、系统封装函数

MySQL 有很多内置的函数,可以快速解决开发中的一些业务需求,大概包括流程控制函数,数值型函数、字符串型函数、日期时间函数、聚合函数等。以下列出了这些分类中常用的函数。

1、控制流程函数

  • case...when

根据值判断返回值,类比编程中的IF-ELSE判断。

-- DEMO 01SELECT CASE DATE_FORMAT(NOW(),'%Y-%m-%d')     WHEN '2019-12-29' THEN 'today'     WHEN '2019-12-28' THEN 'yesterday'     WHEN '2019-12-30' THEN 'tommor'     ELSE 'Unknow' END;-- DEMO 02SELECT (CASE WHEN 1>0 THEN 'true' ELSE 'false' END) AS result;
  • if(expr1,expr2,expr3)

如果表达式 expr1 是TRUE,则 IF()的返回值为expr2; 否则返回值则为 expr3。

SELECT IF(1>2,'1>2','1<2') AS result ; SELECT IF(1<2,'yes ','no') AS result ;SELECT IF(STRCMP('test','test'),'no','yes');
  • ifnull(expr1,expr2)

如果表达式 expr1不为NULL,则返回值为expr1;否则返回值为 expr2。

SELECT IFNULL(NULL,'cicada');SELECT IFNULL(1/1,'no');

2、常用字符串函数

  • CHAR_LENGTH()

返回值为字符串的长度 。

SELECT CHAR_LENGTH(' c i c ') ;-- 包含空格SELECT LENGTH(' S q l ') ;
  • CONCAT(str1...)

拼接串联字符串。

SELECT CONCAT('My', 'S', 'ql');SELECT CONCAT('My', NULL, 'QL'); -- 包含Null 则返回NullSELECT CONCAT("%", "Java", "%"); -- mybatis中拼接模糊查询
  • ELT(N,str1,str2,...)

若N = 1,则返回值为 str1 ,若N = 2,则返回值为 str2 ,以此类推,可以用来转换返回页面的状态。

SELECT ELT(1,'提交','审核中','规则通过') ;SELECT ELT(2,'提交','审核中','规则通过') ;
  • FORMAT(X,D)

格式化数字类型。

SELECT FORMAT(3.1455,2) ; -- 四舍五入保留两位SELECT TRUNCATE(3.1455,2) ; -- 直接截取两位
  • TRIM(str)

清空字符串空格。

SELECT LTRIM('  hel l o ') ;-- 清空左边SELECT RTRIM('  hel l o ') ;-- 清空右边SELECT TRIM('  hel l o ') ; -- 清空两边SELECT REPLACE('M y S Q L',' ','') ; -- 替换掉全部空格

3、数值函数

  • FLOOR(X)

返回不大于X的最大整数值 。

SELECT FLOOR(1.23); -- 1SELECT FLOOR(-1.23); -- -2
  • MOD(N,M)

模操作。返回N 被 M除后的余数。

SELECT MOD(29,9); -- 2SELECT 29 MOD 9; -- 2
  • RAND() RAND(N)

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

SELECT RAND(); -- 0.923SELECT RAND(20) = RAND(20) ; -- TRUE

4、时间日期函数

  • ADDDATE(date,INTERVAL expr type)

给指定日期,以指定类型进行运算。

SELECT DATE_ADD('2019-12-29', INTERVAL 3 DAY); -- 2020-01-01
  • CURDATE()

将当前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。

SELECT CURDATE(); -- '2019-12-29' 字符串SELECT CURDATE() + 0; -- 20180725 数字
  • DATE(expr)

提取日期或时间日期表达式expr中的日期部分。

SELECT DATE('2019-12-31 01:02:03'); -- '2019-12-31'SELECT DATE('2019-12-31 01:02:03')+0; -- 20191231
  • DATE_FORMAT(date,format)

根据format 字符串进行 date 值的格式化。

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2019-12-29SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2019年12月29日

5、聚合函数

AVG([distinct] expr)  求平均值COUNT({*|[distinct] } expr)  统计行的数量MAX([distinct] expr)  求最大值MIN([distinct] expr)  求最小值SUM([distinct] expr)  求累加和

二、自定义函数

1、概念简介

函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。函数注重返回值,而触发器注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合。

2、使用方式

create function 函数名([参数列表]) returns 数据类型begin sql语句; return 值;end;

参数列表的格式是: 变量名 数据类型。

  • 无参案例
CREATE FUNCTION mysum1 () RETURNS INT RETURN (2+3)*2;SELECT mysum1 () ;
  • 有参函数

表结构

CREATE TABLE t01_user (    id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY  COMMENT '主键ID',  user_name varchar(20) DEFAULT NULL COMMENT '用户名称') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户表';

函数用法

create function get_name(p_id INT) returns VARCHAR(20)begin     declare userName varchar(20);    select user_name from t01_user where id=p_id into userName;    return userName;end;SELECT get_name(1) ;

3、函数查看

show create function get_name ;

4、删除函数

drop function get_name ;

5、函数注意事项

函数是事先经过编译,才能在服务器环境调用,所以MySQL集群环境需要同步编译;MySQL是多线程环境,所以要保证函数也是线程安全 。

三、触发器

1、触发器简介

触发器是特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL。也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动触发调用。

2、创建触发器

触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
  • trigger_name:触发器命名 ;
  • trigger_time: 触发动作的时间 ;
  • trigger_event: 激活触发器的语句类型 ;
  • tbl_name: 触发器作用的表明,非临时表 ;
  • trigger_stmt:触发程序执行的语句 ;

表数据同步

当向用户表 t01_user 写入数据时,同时向 t02_back 表写入一份备份数据。

-- 用户备份表CREATE TABLE t02_back (    id int(11) NOT NULL PRIMARY KEY COMMENT '主键ID',  user_name varchar(20) DEFAULT NULL COMMENT '用户名称') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户备份';-- 触发器程序DROP TRIGGER IF EXISTS user_back_trigger ;CREATE TRIGGER user_back_trigger AFTER INSERT ON t01_user FOR EACH ROWBEGIN    INSERT INTO t02_back (id,user_name)VALUES (new.id,new.user_name);END ;-- 测试案例INSERT INTO t01_user (user_name) VALUES ('smile'),('mysql') ;SELECT * FROM t02_back ;

3、查看触发器

查看触发器是指数据库中已存在的触发器的定义、状态、语法信息等。可以在TRIGGERS表中查看触发器信息。

SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='user_back_trigger';

4、删除触发器

DROP TRIGGER语句可以删除MYSQL中已经定义的触发器,删除触发器的基本语法。

DROP TRIGGER [schema_name.]trigger_name

5、触发器注意事项

  • 触发事件

对于相同的表,相同的事件只能创建一个触发器,比如对表t01_user创建两次AFTER INSERT触发器,就会报错。

  • 执行效率

触发器可以减少应用端和数据库的通信次数和业务逻辑,但是基于行触发的逻辑,如果数据集非常大,效率会降低。

  • 事务问题

触发器执行和原表的执行语句是否在同一个事务中,取决于触发表的存储引擎是否支持事务。

函数 触发器 数据 语句 字符 字符串 日期 数据库 用户 格式 类型 时间 存储 事件 事务 参数 备份 常用 数值 数字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 龙岗区正规网络技术代理价钱 阿里云服务器能玩梦幻西游 华为V3服务器管理raid 数据库和区块链有什么不同 注意电厂网络安全 工业机器人软件开发平台包括 数据库查询某个字段中的一部分 腾越互联网科技 公务员考试报名系统数据库 测试仪器软件开发 杭州安全软件开发性价比 数据库没有启动请查找原因 北京铁建互联网科技 服务器电源线三根什么规格 广安网络安全工作 校园网络安全防护知识 违反公司网络安全的检讨 苏州dell服务器类别 数据库快捷键保存修改 空间数据库的研究内容是什么 梅州软件开发怎么选 华为服务器怎么进u盘 易捎互联网科技有限公司 南美有服务器的手游 万方数据库怎么查找权威性文献 校园网络安全防护知识 使命召唤六无法连接远程服务器 烟台联想服务器零售 中兴数据研究所软件开发部 网络安全周2020年线上
0