当前位置: 首页 > news >正文

Mysql----浅入浅出之视图、存储过程、触发器

一、视图 VIEW

视图是虚拟的表,本身不存储不论什么数据。仅仅有执行时,才包括动态检索出来的数据。

eg:SELECT sid, name, sex, s_num FROM  student, school WHERE sid = 2 AND student.sid = scholl.sid ;

这个简单的查询涉及到两个表。

所以不论什么须要这个数据的人都必须熟悉两个表以及之间的关系。

想检索其它学生信息。就必须改动WHERE子句。假设能够把整个查询包装成一个虚拟表studentinfo,那么就能够这样得到数据:

eg:SELECT sid, name, sex, s_num FROM studentinfo WHERE sid = 2;

使用视图能够重用sql语句。对于使用的人能够不必知道细节。对原始数据也有保护作用。

视图也有一些限制,比方不能索引。不能有关联的触发器。

名字必须唯一。

创建视图:

eg:CREATE VIEW studentinfo AS SELECT sid name, sex, s_num FROM student, school WHERE student.sid = school.sid;

视图也能够更新,可是仅仅在特定的情况下。

假设视图有这些定义,则不能更新:分组、联结、子查询、并、聚集函数DISTINCT、计算列。

二、存储过程

当须要处理的业务逻辑非常复杂的时候,能够一条条的写sql语句。并且须要考虑到全部的须要处理的细节、数据完整性。能够创建存储过程来取代。

它就像一个批处理。包括预先定义好的一条或多条sql语句的集合。但它的作用可不仅限于此。

创建:

eg:CREAT PROCEDURE prostudent() 

BEGIN

SELECT Max(score) AS scoremax FROM student;

END;

删除:

eg:DROP PROCEDURE prostudent;

使用參数:

eg:CREATE PROCEDURE prostudent(OUT scorehigh DECIMAL(8, 2), OUT scorelow DECIMAL(8, 2))

BEGIN

SELECT Max(score) INTO scorehigh FROM student;

SELECT Min(score) INTO scorelow FROM student;

END;

运行:

eg:CALL prostudent(@scorelow, @scorehigh);

SELECT @scorehigh, @scorelow;

运行了名为prostudent的存储过程,并返回了最高成绩和最低成绩。

此外,存储过程还能够写凝视、定义暂时变量、IN传入參数、流程控制语句。

SHOW CREATE PROCEDURE ****; 能够查看创建存储过程的语句。

SHOW PROCEDURE STATUS;能够查看这个存储过程是何时、由谁创建的。

三、游标

SELECT语句返回的是一个结果集。可能是满足条件的多个航。

那我们想对这个结果集的每一行进行一些处理时,或者在第一行、最后一行、前一行等特殊要求时,怎么办呢?这里就用到里游标。mysql中的游标仅仅能用于存储过程,这是与其它数据库的不同。

使用游标须要先定义DECLARE *** CURSOR FOR、然后打开OPEN ***、使用、关闭CLOSE ***。游标的生命周期仅仅在存储过程中,也就是假设你不关闭它,当存储过程END时。会自己主动关闭。

游标打开后。能够用FETCH取出一行,并在内部指向下一行的位置,当再次FETCH的时候,将取出下一行。

举个样例:如今要将全部sid大于3的学生的成绩加和。

eg: DELIMITER //

CREATE PROCEDURE sumofscore(OUT sum INT)

BEGIN

DECLARE done BOOLEEAN DEFAULT 0;

DELCARE tmp INT;

DECLARE s INT DEFAULT 0;

DECLARE yb CURSOR FOR SELECT score FROM student WHERE sid > 3;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN yb;

REPEAT

FETCH yb INTO tmp;

SET s = s + tmp;

UNTIL done END REPEAT;

CLOSE yb;

SELECT s INTO sum;

END

//

DELIMITER ;

DELIMITER 重定义mysql的结束符。02000是数据未找到的错误码,利用它来推断是否遍历全然部数据。

四、触发器

在某些需求下,想要某些语句在特定事件发生时,自己主动运行,那么就用到了触发器。

mysql触发器仅仅能响应delete、insert和update语句。

创建触发器:

eg:CRESTE TRIGGER newstudent AFTER INSERT ON student FOR EACH ROW SELECT new.sid INTO @s;

触发器名字是newstudent,INSERT指定响应事件是插入操作。

AFTER/BEFORE指定是在事件运行前还是事件运行后触发。

FOR EACH ROW指定对插入的每一行都进行操作。所以每插入一行,就把这行的sid传给变量s。每一个表每一个事件仅仅同意有一个触发器,所以每一个表最多有6个触发器。一个触发器也仅仅能响应一个事件。

删除触发器:

eg:DROP TRIGGER newstudent;

使用触发器:

在INSERTZHONG ,可引用一个名为NEW的虚拟表,訪问被插入的行。

在BEFROE INSERT中,也能够引用NEW,甚至能够更新数据,以改变插入数据的内容。

DELETE触发器中。能够引用名为OLD的虚拟表,訪问被删除的行。

转载于:https://www.cnblogs.com/mfrbuaa/p/5213227.html

相关文章:

  • 当前端也拥有 Server 的能力
  • GridView中使用 jQuery DatePicker (UpdatePanel)
  • 39.Android版本小知识
  • 适合初学者的理解Sphinx运行方式
  • java--- Map详解
  • springMVC-mvc:annotation-driven
  • MyCat源码分析系列之——BufferPool与缓存机制
  • web项目中各种路径的获取
  • hdu 1081 dp问题:最大子矩阵和
  • ssh 命令
  • 0302思考并回答一些问题
  • html怎么添加背景图片
  • python的种类
  • 中国人民大学2016年硕士研究生复试基本要求
  • 韩顺平循序渐进学java 第08讲 this.类变量.类方法
  • 网络传输文件的问题
  • 【mysql】环境安装、服务启动、密码设置
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • angular2 简述
  • css系列之关于字体的事
  • E-HPC支持多队列管理和自动伸缩
  • es6(二):字符串的扩展
  • leetcode-27. Remove Element
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • vue的全局变量和全局拦截请求器
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 类orAPI - 收藏集 - 掘金
  • 离散点最小(凸)包围边界查找
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 七牛云假注销小指南
  • 使用putty远程连接linux
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动端 h5开发相关内容总结(三)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​一些不规范的GTID使用场景
  • ###项目技术发展史
  • #QT(串口助手-界面)
  • (pojstep1.3.1)1017(构造法模拟)
  • (办公)springboot配置aop处理请求.
  • (汇总)os模块以及shutil模块对文件的操作
  • (十八)SpringBoot之发送QQ邮件
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)WLAN定义和基本架构转
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)项目管理杂谈-我所期望的新人
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • . Flume面试题
  • .netcore 获取appsettings
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET连接数据库方式
  • .net下的富文本编辑器FCKeditor的配置方法