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通过binlog恢复数据
May 27 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
mysql sql常用语句大全
Jun 21 MySQL
mysql sock 文件解析及作用讲解
Jul 15 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
js word表格动态添加代码
2010/06/07 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vuex存储token示例
2019/11/11 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
基于Python实现用户管理系统
2019/02/26 Python
python实现的分层随机抽样案例
2020/02/25 Python
Python实现数字的格式化输出
2020/08/01 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
外企求职信范文分享
2013/12/31 职场文书
行政人事岗位职责
2014/03/17 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers