MySQL系列之五 视图、存储函数、存储过程、触发器


Posted in MySQL onJuly 02, 2021
目录
  • 一、视图
    • 1、视图的创建
    • 2、查看视图定义
    • 3、删除视图
  • 二、存储函数
    • 1、系统函数
    • 2、自定义函数(user-defined function:UDF)
  • 三、存储过程
  • 四、触发器
  • 总结

 

一、视图

视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘

物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图

基表:视图依赖的表

视图中的数据事实上存储于“基表”中,因此,其修改操作也会针对基表实现。其修改操作受基表限制。

注意:修改视图时是修改的原表

 

1、视图的创建

CREATE VIEW view_name AS select_statement

MariaDB [testdb]> CREATE VIEW v_students AS SELECT id,name,ages FROM students;
MariaDB [testdb]> SELECT * FROM v_students;
+----+---------------+------+
| id | name          | ages |
+----+---------------+------+
|  1 | tom           |   26 |
|  2 | jerry         |   19 |
|  3 | maria         |   19 |
|  4 | xiaolongnv    |   18 |
|  5 | dongfangbubai |   28 |
|  6 | ouyangfeng    |   56 |
+----+---------------+------+

 

2、查看视图定义

SHOW CREATE VIEW view_name

MariaDB [testdb]> SHOW CREATE VIEW v_students\G
         View: v_students
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_students` AS select `students`.`id` AS `id`,`students`.`name` AS `name`,`students`.`ages` AS `ages` from `students`
MariaDB [testdb]> SHOW TABLE STATUS LIKE 'v_students'\G
        Name: v_students
        Comment: VIEW  #判断一个表是否是视图

 

3、删除视图

DROP VIEW [IF EXISTS] view_name [, view_name] ...

MariaDB [testdb]> DROP VIEW v_students;

 

二、存储函数

说明: 参数可以有多个,也可以没有参数,必须有且只有一个返回值。

 

1、系统函数

参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html

 

2、自定义函数(user-defined function:UDF)

自定义函数保存在mysql.proc表中

  • 查看UDF列表 SHOW FUNCTIOIN STATUS;
  • 查看UDF定义 SHOW CREATE FUNCTION function_name
  • 删除UDF DROP FUNCTION function_name
  • 调用自定义函数语法 SELECT function_name(parameter_value,...)
  • 为变量赋值 SET parameter_name = value[,parameter_name = value...]
  • 查看变量 SELECT INTO parameter_name
MariaDB [testdb]> DELIMITER //  #修改结束符为//
MariaDB [testdb]> CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED)
    -> RETURNS SMALLINT
    -> BEGIN
    -> DECLARE a, b SMALLINT UNSIGNED DEFAULT 10;
    -> SET  a = x, b = y;
    -> RETURN a+b;
    -> END//
Query OK, 0 rows affected (0.01 sec)
MariaDB [testdb]> DELIMITER ;  #定义完函数后再修改回来
MariaDB [testdb]> SELECT addTwoNumber(8,9);  #调用UDF求和
+-------------------+
| addTwoNumber(8,9) |
+-------------------+
|                17 |
+-------------------+

 

三、存储过程

存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程。提高了运行速度同时降低网络数据传输量

存储过程:存储过程保存在mysql.proc表中

  • 创建存储过程
    • CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) routime_body
    • proc_parameter : [IN|OUT|INOUT] parameter_name type
    • 其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型
  • 查看存储过程列表 SHOW PROCEDURE STATUS
  • 查看存储过程定义 SHOW CREATE PROCEDURE sp_name
  • 调用存储过程: CALL sp_name ([ proc_parameter [,proc_parameter ...]])
    • 说明:当无参时,可以省略"()",当有参数时,不可省略"()”
  • 删除存储过程: DROP PROCEDURE [IF EXISTS] sp_name

ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建

流程控制

存储过程和函数中可以使用流程控制来控制语句的执行

  • IF:用来进行条件判断。根据是否满足条件,执行不同语句
  • CASE:用来进行条件判断,可实现比IF语句更复杂的条件判断
  • LOOP:重复执行特定的语句,实现一个简单的循环
  • LEAVE:用于跳出循环控制
  • ITERATE:跳出本次循环,然后直接进入下一次循环
  • REPEAT:有条件控制的循环语句。当满足特定条件时,就会跳出循环语句
  • WHILE:有条件控制的循环语句

 

四、触发器

​ 触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行。

  • 创建触发器
CREATE 
    [DEFINER = { user | CURRENT_USER }] 
    TRIGGER trigger_name 
    trigger_time trigger_event 
    ON tbl_name FOR EACH ROW 
    trigger_body

trigger_name:触发器的名称

trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发

trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件

tbl_name:该触发器作用在表名

  • 查看触发器 SHOW TRIGGERS;
  • 删除触发器 DROP TRIGGER trigger_name;

示例:创建触发器,在向学生表INSERT数据时,学生数增加,删除学生信息时,学生数减少。

MariaDB [testdb]> CREATE TABLE students_info (id TINYINT(2) NOT NULL AUTO_INCREMENT,name VARCHAR(30) DEFAULT NULL,PRIMARY KEY(id));  #创建一张学生信息表
MariaDB [testdb]> CREATE TABLE students_count (stu_count TINYINT(2) DEFAULT 0);  #创建一张学生数量表
MariaDB [testdb]> INSERT INTO students_count VALUES(0);  #给个初识值0

MariaDB [testdb]> CREATE TRIGGER trigger_students_count_insert
    -> AFTER INSERT
    -> ON students_info FOR EACH ROW
    -> UPDATE students_count SET stu_count=stu_count+1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [testdb]> CREATE TRIGGER trigger_students_count_delete
    -> AFTER DELETE
    -> ON students_info FOR EACH ROW
    -> UPDATE students_count SET stu_count=stu_count-1;
Query OK, 0 rows affected (0.01 sec)
MariaDB [testdb]> INSERT students_info(id,name) VALUES (1,'Tom'),(2,'Maria');
MariaDB [testdb]> SELECT * FROM students_info;
+----+-------+
| id | name  |
+----+-------+
|  1 | Tom   |
|  2 | Maria |
+----+-------+
MariaDB [testdb]> SELECT * FROM students_count;  #插入记录,触发事件,数量增加为2
+-----------+
| stu_count |
+-----------+
|         2 |
+-----------+
MariaDB [testdb]> DELETE FROM students_info WHERE id=1;
MariaDB [testdb]> SELECT * FROM students_info;
+----+-------+
| id | name  |
+----+-------+
|  2 | Maria |
+----+-------+
MariaDB [testdb]> SELECT * FROM students_count;  #删除记录,数量减1
+-----------+
| stu_count |
+-----------+
|         1 |
+-----------+

 

总结

到此这篇关于MySQL视图、存储函数、存储过程、触发器的文章就介绍到这了,更多相关MySQL视图、存储函数、存储过程、触发器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql - 常用函数 每天积极向上
Apr 05 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
MySql 缓存查询原理与缓存监控和索引监控介绍
Jul 02 #MySQL
mysql连接查询中and与where的区别浅析
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 #MySQL
MySQL 8.0 驱动与阿里druid版本兼容问题解决
MySQL query_cache_type 参数与使用详解
Jul 01 #MySQL
mysql 数据插入优化方法之concurrent_insert
Jul 01 #MySQL
MySQL的Query Cache图文详解
You might like
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
python中偏函数partial用法实例分析
2015/07/08 Python
Python实现截屏的函数
2015/07/26 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python对excel文档的操作方法详解
2018/12/10 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python使用configparser库读取配置文件
2020/02/22 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
转预备党员政审材料
2014/02/06 职场文书
人事部岗位职责范本
2014/03/05 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
心理咨询承诺书
2014/05/20 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
维稳承诺书
2015/01/20 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
倡议书范文大全
2015/04/28 职场文书
2015年女职工工作总结
2015/05/15 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python