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 query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 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 From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
Js sort排序使用方法
2011/10/17 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
创先争优制度
2014/01/21 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
小学生评语集锦
2014/04/18 职场文书
班主任工作总结范文
2015/08/13 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android