当前位置: 首页 > news >正文

Mysql-视图,函数,存储过程,触发器

Mysql-视图,函数,存储过程,触发器

  • 一、视图
    • 1. 创建视图
    • 2. 使用视图
    • 3. 查看视图
    • 4. 修改视图
    • 5. 删除视图
  • 二、函数
    • 1. 定义函数
    • 2. 查看函数
    • 3. 删除函数
  • 三、存储过程
    • 1. 创建存储过程
    • 2. 查看存储过程
    • 3. 删除存储过程
  • 四、触发器
    • 1. 创建触发器
    • 2. 查看触发器
    • 3. 删除触发器
  • 总结


一、视图

select语句执行后的结果集

  • 特性:对多张表的引用,一张虚拟表,只存储查询方法,不存储具体数据。
  • 作用:
    简化查询操作,增强可读性
    用户权限可以设定到视图级别(表数据的行、列级别权限控制)
  • 场景:
# 临时禁用外键约束检查
SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for course
-- ----------------------------
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;-- ----------------------------
-- Records of course
-- ----------------------------
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', '');-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS student;
CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(32) NOT NULL,course_id int(11) NOT NULL,PRIMARY KEY (id),KEY fk_student_course (course_id),CONSTRAINT fk_student_course FOREIGN KEY (course_id) REFERENCES course (sid)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '小飞', '1');
INSERT INTO `student` VALUES ('2', 'hukey', '2');
INSERT INTO `student` VALUES ('3', '小王', '3');
INSERT INTO `student` VALUES ('4', '阿狗', '4');

查询小飞上的所有课程的相关信息
id, name, sname

select id,name,sname from student left join course on student.course_id = course.sid where name=“小飞”;

1. 创建视图

create view view_student_course as ( select id,name,sname from student left join course on student.course_id = course.sid where name=“小飞”);

2. 使用视图

查询
select * from view_student_course;

创建所有学生的视图并用这个视图查看"小飞"的信息

root@test 10: 04>create view view_student_course_all as ( select id,name,sname from student left join couurse on student.course_id = course.sid);
Query OK, 0 rows affected (0.01 sec)root@test 10: 05>select *  from view_student_course_all;
+----+--------+--------+
| id | name   | sname  |
+----+--------+--------+
|  1 | 小飞   | 语文   |
|  2 | hukey  | 数学   |
|  3 | 小王   | 英语   |
|  4 | 阿狗   | 物理   |
+----+--------+--------+
4 rows in set (0.00 sec)root@test 10: 05>select *  from view_student_course_all where name="小飞";
+----+--------+--------+
| id | name   | sname  |
+----+--------+--------+
|  1 | 小飞   | 语文   |
+----+--------+--------+
1 row in set (0.00 sec)

3. 查看视图

查看有哪些视图
show table status where comment="view"\G

查看视图的创建语句

root@test 10: 08>show create view view_student_course_all\G
*************************** 1. row ***************************View: view_student_course_allCreate View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_student_course_all` AS select `student`.`id` AS `id`,`student`.`name` AS `name`,`course`.`sname` AS `sname` from (`student` left join `course` on((`student`.`course_id` = `course`.`sid`)))
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

4. 修改视图

alter view `视图名字`AS (sql);

root@test 10: 22>alter view view_student_course_all as (select * from student);
Query OK, 0 rows affected (0.00 sec)root@test 10: 22>select * from view_student_course_all;
+----+--------+-----------+
| id | name   | course_id |
+----+--------+-----------+
|  1 | 小飞   |         1 |
|  2 | hukey  |         2 |
|  3 | 小王   |         3 |
|  4 | 阿狗   |         4 |
+----+--------+-----------+

5. 删除视图

drop view `视图名字`;

drop view view_student_course;


二、函数

是可以接收参数并返回一个值的SQL代码

1. 定义函数

自定义函数: 计算折扣价=> 单价,折扣

delimiter //
create function fun_price(price decimal(10,2), rate decimal(3,2)) returns decimal(10,2) DETERMINISTIC
begin declare result decimal(10,2);set result = price*rate;return result;
end //
delimiter ;

DETERMINISTIC => 声明该函数是确定性函数,即输入相同时,输出结果也相同

使用函数

select pname, fun_price(price,0.9) from product;


2. 查看函数

show function status\G

查看函数的创建语句

root@test 10: 40>show create function fun_price\G
*************************** 1. row ***************************Function: fun_pricesql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONCreate Function: CREATE DEFINER=`root`@`localhost` FUNCTION `fun_price`(price decimal(10,2), rate decimal(3,2)) RETURNS decimal(10,2)DETERMINISTIC
begin declare result decimal(10,2);set result = price*rate;return result;
end
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

3. 删除函数

drop function 函数名;

没有修改函数的方法 => 删除后重新建


三、存储过程

一组可编程函数,为了完成特定功能的SQL语句集,经过编译保存在数据中,用户可以通过存储过程的名字,参数来调用执行

  • 封装:将重复性执行的内容写到存储过程,简化SQL调用
  • 统一接口,确保数据安全

视图VS存储过程

DELIMITER 是一个特殊的命令,用于修改 SQL 语句的分隔符。避免在包含多条 SQL 语句的代码中块分号(;)被误判为语句结束符

delimiter //
create procedure procedure_name([arg_list])
begin ---SQL
end //
delimiter ;

1. 创建存储过程

创建一个存储过程 product表中所有产品信息

delimiter //
create procedure get_all_products()
begin select * from product;
end //
delimiter ;

调用

call get_all_products()

创建一个存储过程,根据产品cid查询产品信息
注意:参数名不要跟字段同名

delimiter //
create procedure get_all_products01(in category char(4))
begin select * from product where cid=category;
end //
delimiter ;call get_all_products01('c002');

创建一个存储过程,获取产品最高价格,通过输出返回参数

delimiter //
create procedure get_all_products02(out max_price double)
begin select max(price) into max_price from product;
end //
delimiter ;# 初始化变量
set @max_price_value = 0;
# 调用存储过程,传入变量(存储过程会修改该变量的值)
call get_all_products02(@max_price_value);
# 查询变量的值,显示存储过程返回的结果
select @max_price_value;

2. 查看存储过程

show procedure status \G

查看存储过程创建语句

root@test 11: 28>show create procedure get_all_products02\G
*************************** 1. row ***************************Procedure: get_all_products02sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `get_all_products02`(out max_price double)
begin select max(price) into max_price from product;
end
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

3. 删除存储过程

drop procedure get_all_products02


四、触发器

在满足条件时触发对应的执行语句

  • 触发条件:insert,update,delete
  • 触发时间:前,后
  • 触发频率:每一执行
  • 触发对象:表

转账表 -> 日志表

触发器问题:
1.后台执行,有时候忘记了…
2. 资源消耗

create trigger trigger_name trigger_time trigger_event on table_name for each row

1. 创建触发器

记录表的插入操作

root@test 11: 29>create table time (
-> id int primary key auto_increment,
-> t datetime);
Query OK, 0 rows affected (0.02 sec)

root@test 11: 49>delimiter //
create trigger trig1 after insert on product for each row
begin
insert into time (t) values(now());
end //
delimiter ;

插入数据验证触发器

root@test 11: 51>insert into product values(14, 'test', 100, 'c003');
Query OK, 1 row affected (0.01 sec)root@test 11: 54>select * from time;
+----+---------------------+
| id | t                   |
+----+---------------------+
|  1 | 2025-07-26 11:54:25 |
+----+---------------------+
1 row in set (0.01 sec)

打卡表
id,date,name,start,end,status
2025/07/26 ,cici, 9:30, NULL,
staus => 触发器


2. 查看触发器

root@test 12: 00>show triggers \G
*************************** 1. row ***************************Trigger: trig1Event: INSERTTable: productStatement: insert into time (t) values(now())Timing: AFTERCreated: 2025-07-26 11:52:47.74sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONDefiner: root@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

查看创建触发器语句

root@test 12: 01>show create trigger trig1\G
*************************** 1. row ***************************Trigger: trig1sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
SQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER `trig1` AFTER INSERT ON `product` FOR EACH ROW insert into time (t) values(now())character_set_client: utf8mb4collation_connection: utf8mb4_0900_ai_ciDatabase Collation: utf8mb4_0900_ai_ciCreated: 2025-07-26 11:52:47.74
1 row in set (0.00 sec)

3. 删除触发器

drop trigger trig1


总结

工具核心能力触发方式典型用途
视图简化查询、数据隔离被动查询(SELECT)封装复杂查询、限制数据访问
函数计算并返回单个值主动调用(嵌入 SQL)封装计算逻辑、格式化数据
存储过程执行复杂流程、事务处理主动调用(CALL)业务逻辑处理、批量操作
触发器自动响应数据变更事件触发(INSERT等)数据校验、日志记录、跨表同步
http://www.lryc.cn/news/606327.html

相关文章:

  • 【Kiro Code】Chat 聊天功能
  • 某讯视频风控参数逆向分析
  • Docker部署的PostgreSQL慢查询日志配置指南
  • pytorch的自定义 CUDA 扩展怎么学习
  • pytorch程序语句固定开销分析
  • 排序算法-选择排序(选择排序、堆排序)(动图演示)
  • Next实习项目总结串联讲解(一)
  • 基于京东评论的文本挖掘与分析,使用LSTM情感分析算法以及网络语义分析
  • 正则化都是放在模型的哪个位置呢?
  • 案例开发 - 日程管理 - 第四期
  • 【C语言学习】scanf函数
  • 【源力觉醒 创作者计划】文心一言与deepseek集成springboot开发哪个更方便
  • 3.Linux 系统文件类型与文件权限
  • AI与AGI:从狭义智能到通用智能
  • 上证50期权2400是什么意思?
  • 性能测试篇 :Jmeter监控服务器性能
  • virtualbox+UBuntu20.04+内存磁盘扩容
  • 知识随记-----使用现代C++客户端库redis-plus-plus实现redis池缓解高并发
  • 逻辑回归的应用
  • JVM学习日记(十二)Day12
  • 8K、AI、低空智联,H.266能否撑起下一代视频通路?
  • vue 开发总结:从安装到第一个交互页面-与数据库API
  • 逻辑回归详解:从数学原理到实际应用
  • 三坐标测量仪攻克深孔检测!破解新能源汽车阀体阀孔测量难题
  • MySQL 8.0 OCP 1Z0-908 题目解析(39)
  • Verilog与SytemVerilog差别
  • 文法中的间接左递归
  • 行业热点丨仿真历史数据难以使用?如何利用几何深度学习破局,加速汽车工程创新
  • 【BUUCTF系列】[HCTF 2018]WarmUp1
  • 第15届蓝桥杯C++青少组中级组选拔赛(STEMA)2024年3月10日真题