MySql视图触发器函数存储过程

视图 =>查询返回结果集=>虚拟表=>字段、条件...

触发器=>满足条件增删改

函数=>实现某些功能,返回一个结果

存储过程 =>类似视图和函数的结合

视图:是一条SELECT语句执行后返回的结果集

作用:

实现细粒度授权:通过视图限定用户查看指定的数据(列、行)

简化复杂的查询操作:将复杂的查询封装在视图中

数据授权最小级别:SELECT

最小粒度:表级别、视图、存储过程...

复制代码
DROP TABLE IF EXISTS course;
CREATE TABLE course (
  sid int(11) NOT NULL AUTO_INCREMENT,
  sname varchar(32) NOT NULL,
  PRIMARY KEY (sid)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `course` VALUES ('1', '语文');
INSERT INTO `course` VALUES ('2', '数学');
INSERT INTO `course` VALUES ('3', '英语');
INSERT INTO `course` VALUES ('4', '物理');
INSERT INTO `course` VALUES ('5', '');

创建视图

复制代码
CREATE VIEW view_name AS (
  SQL语句
);

show create view view_name\G;

使用视图

SELECT * FROM c_xf;

视图就是一张虚拟表,可以像普通表一样使用

查看数据库中有哪些视图

show table status where comment='view'\G;

查看视图创建语句

show create view 视图名;

删除视图

drop view c_xf;

修改视图

alter view c_xf as (SQL语句)

===================================

触发器:表相关的数据库对象,在满足指定条件 时,触发执行定义的SQL语句集合

!!慎用 隐性的!!

触发条件:event:INSERT ,UPDATE,DELETE(没有select)

time:BEFORE,AFTER

触发频率:针对每一行数据

触发器定义在表上

1、单个sql语句

create trigger 触发器名 时机 事件 on 表名 for each row 执行语句;

例:创建一个名为trig1的触发器,如果在course表插入一条数据后,自动往time表中插入一条数据(时间为now())

time:id,datetime

2、多个sql语句

复制代码
delimiter //
create trigger 触发器名 时机 事件 on 表名 for each row
begin
  SQL语句;
  SQL语句;
end //
delimiter ;

SHOW TRIGGERS \G //列出当前库所有触发器的基本信息

SHOW CREATE TRIGGER trig2 \G //查看某一个触发器的完整创建语句

删除触发器

drop trigger 触发器名 ;

函数(实现指定功能)

接收一些参数,并返回一个值的SQL代码

作用:提供代码的复用性和可读性,使用方便

CONCAT=>字符串拼接

复制代码
delimiter \\
create function 函数名(参数 类型) returns 返回值类型
[deterministric|no sql|reads sql data]
begin
  函数体;
  return 值;
end \\
delimiter ;
  • 必须写 RETURNS 指定返回类型
  • 体内必须有 RETURN 返回数据
  • 多条语句用 BEGIN END
  • 改分隔符避免分号截断

如果你的 MySQL 开启了二进制日志 (binlog), 必须明确函数是否为确定型,所以强制要求声明 DETERMINISTIC/NO SQL/READS SQL DATA中的一个, 否则会阻止创建函数

DETERMINISTIC:确定的,相同输入一定相同输出

NO SQL:没有SQL语句,只是计算

READS SQL DATA:只查询数据,不修改数据

DECLARE声明局部变量 ,必须写在BEGIN开头,定义变量的名称和类型

SET给已声明的变量赋值,把计算结果 / 值存到变量中

复制代码
delimiter //
create function new_price(price double(10,2),rate double(5,2))
returns double(10,2)
deterministic
begin
   declare t_price double(10,2);
   set t_price=price*(1-rate);
   return t_price;
 end //
delimiter;

该函数只依赖输入的pricerate两个参数,没有任何外部依赖 ,所以是 DETERMINISTIC

创建函数

调用函数

select new_price(price,0.15);

展示函数

SHOW CREATE FUNCTION 函数名\G

删除函数

drop function [if exists] 函数名;

:没有修改函数的方法, 主流方式是 "先删后建"

存储过程 (MySQL支持弱,用得也不多)

存储过程类似视图和函数的结合

存储过程完成特定SQL语句功能 ,并编译保存在数据库

用户需要的时候,通过CALL调用

  • 复杂的SQL操作封装到存储过程中,简化对SQL的调用
  • 能提升速度,会多占用一些磁盘空间
  • 定制化查询(权限)

语法

复制代码
delimiter //
create procedure 过程名(
    [IN 入参 数据类型],
    [OUT 出参 数据类型],
    [INOUT 出入参 数据类型]
)
BEGIN
    -- 业务SQL语句
    执行语句;
END //
delimiter ;

call procedure_name();

IN(输入参数)、OUT(输出参数)、INOUT(输入输出参数

创建存储过程,查询产品表中的所有信息

创建存储过程,查询产品表中指定的cid的信息

创建存储过程,返回产品表的最高价

SELECT MAX(price) INTO max_price FROM product; // 将查询结果直接赋值给变量

SELECT ... INTO 要求查询结果只能是 1 行 1 列(单值),否则会报错

错误:参数与期望的数量不一样

定义参数:set @max_prrice=0;

|------------|----------------|---------|-------------|
| 变量类型 | 格式 | 作用域 | 生命周期 |
| 用户变量 | @变量名 | 当前会话 | 会话断开即销毁 |
| 全局系统变量 | @@global.变量名 | 所有会话 | mysql运行期间 |
| 会话系统变量 | @@session.变量名 | 当前会话 | 会话断开即销毁 |
| 局部变量 | declare 变量名 类型 | 存过程/函数内 | 过程/函数执行完即销毁 |

查看存储过程

SHOW PROCEDURE STATUS \G

查看存储过程的创建语句

SHOW CREATE PROCEDURE get_products_max\G

删除存储过程

DROP PROCEDURE [IF EXISTS] get_products_max;

修改 => 先删除后修改

相关推荐
hikktn1 小时前
Oracle 行锁 ORA-00054 高效重试机制实战:MERGE 批量更新 + FOR UPDATE NOWAIT 完整方案
数据库·oracle
￰meteor1 小时前
【数据库导学】
数据库
zxrhhm1 小时前
Oracle检查点Checkpoint深度解析
数据库·oracle
rising start1 小时前
三、深入理解MySQL索引底层
数据库·mysql
weixin_426150701 小时前
AI辅助Oracle容量规划:告别拍脑袋扩容
运维·数据库·人工智能·oracle
l1t1 小时前
DeepSeek总结的PostgreSQL 表访问方法
数据库·postgresql
数据库小学妹1 小时前
CTE+阶段式递归:用公共表表达式搞定复杂业务逻辑,告别SQL难题!
数据库·经验分享·b树·sql
UtopianCoding1 小时前
数据库语法对比详细规则
数据库·mysql·gaussdb
KaMeidebaby1 小时前
卡梅德生物技术快报|多肽库筛选:基于全质粒 PCR 的噬菌体文库构建与小分子表位淘选实战
前端·数据库·其他·百度·新浪微博