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;

修改 => 先删除后修改

相关推荐
IvorySQL6 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl6 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦8 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈10 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客10 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q11 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL12 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃13 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo809713 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat13 小时前
MySQL回表机制解析与优化策略
数据库·sql