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查询学习之基础查询操作
May 08 MySQL
MySQL 如何分析查询性能
May 12 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL数据库 任意ip连接方法
May 20 MySQL
mysql 排序失效
May 20 MySQL
MySQL分布式恢复进阶
Jul 23 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
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
Python实现多行注释的另类方法
2014/08/22 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
Flask框架信号用法实例分析
2018/07/24 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python样条插值的实现代码
2018/12/17 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
八项规定整改方案
2014/02/21 职场文书
2014企业年终工作总结
2014/12/23 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书