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 22 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
MySQL约束超详解
Sep 04 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
MySQL存储过程及语法详解
Aug 05 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
Phpbean路由转发的php代码
2008/01/10 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
php检测url是否存在的方法
2015/04/14 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
Python中字符串的处理技巧分享
2016/09/17 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
人力资源管理专业自荐书范文
2014/02/10 职场文书
小学安全教育材料
2014/02/17 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
个人党性锻炼总结
2015/03/05 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
Java基础——Map集合
2022/04/01 Java/Android