一、视图 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的虚拟表,訪问被删除的行。

Mysql----浅入浅出之视图、存储过程、触发器的更多相关文章

  1. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  2. 『浅入浅出』MySQL 和 InnoDB

    作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...

  3. 『浅入深出』MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...

  4. Spring MVC浅入浅出——不吹牛逼不装逼

    Spring MVC浅入浅出——不吹牛逼不装逼 前言 上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就 ...

  5. 包学会之浅入浅出Vue.js:开学篇(转)

    包学会之浅入浅出Vue.js:开学篇 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. ...

  6. 浅入深出Vue:第一个页面

    今天正式开始入门篇,也就是实战了~ 首先我们是要做一个博客网站,UI 框架采用江湖传闻中的 ElementUI,今天我们就来利用它确定我们博客网站的基本布局吧. 准备工作 新建一个vue项目(可以参考 ...

  7. Spring浅入浅出——不吹牛逼不装逼

    Spring浅入浅出——不吹牛逼不装逼 前言: 今天决定要开始总结框架了,虽然以前总结过两篇,但是思维是变化的,而且也没有什么规定说总结过的东西就不能再总结了,是吧.这次总结我命名为浅入浅出,主要在于 ...

  8. Spring注解浅入浅出——不吹牛逼不装逼

    Spring注解浅入浅出——不吹牛逼不装逼 前情提要 上文书咱们说了<Spring浅入浅出>,对Spring的核心思想看过上篇的朋友应该已经掌握了,此篇用上篇铺垫,引入注解,继续深入学习. ...

  9. Spring的数据库编程浅入浅出——不吹牛逼不装逼

    Spring的数据库编程浅入浅出——不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...

  10. 浅入浅出EmguCv(三)EmguCv打开指定视频

    打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图 ...

随机推荐

  1. NFC的安全性

    NFC近距离无线技术具有快捷.易用.安全等特性,其中安全是支付行业最关心的特性. 众所周知传统磁条银行卡的账号信息,是记录在磁条中,当进行刷卡交易时,POS机将交易金额,银行卡中的账号信息以及用户输入 ...

  2. 【深夜急报,Win10下的Linux子系统之Bash】

    [在Windows下进行的编程人员,你真的需要学习下Linux] 手册:<Linux 命令手册(特洛伊版2.0)> 链接: https://pan.baidu.com/s/1skrVSvV ...

  3. Erlang语言介绍

    Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...

  4. boost的并发库

    thread: http://www.boost.org/doc/libs/1_61_0/libs/thread/ asio: http://www.boost.org/doc/libs/1_61_0 ...

  5. linux之SQL语句简明教程---GROUP BY

    我们现在回到函数上.记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (Store_Name) 的营业额 (Sales),那怎么办呢?在这个情况下 ...

  6. linux之SQL语句简明教程---ORDER BY

    到目前为止,我们已学到如何藉由 SELECT 及WHERE 这两个指令将资料由表格中抓出.不过我们尚未提到这些资料要如何排列.这其实是一个很重要的问题.事实上,我们经常需要能够将抓出的资料做一个有系统 ...

  7. CSS 定位 (Positioning)学习

    最近被css的定位要搞疯了...下面我总结一下最近学习东西. 先介绍几个概念: 块框:div.h1 或 p 元素常常被称为块级元素.这意味着这些元素显示为一块内容,即“块框”. 行内框:与之相反,sp ...

  8. js中使用队列发送ajax请求

    最近,项目中需要按照先后顺序发送ajax请求,并且在一次请求结束后才能发起下一次,不然就会导致逻辑错误. 解决办法是定义一个数组,保存ajax请求数据. 以下使用extjs4定义一个类 Ext.def ...

  9. UIPageViewController-浅析

    一.UIPageViewController概念   控件为我们提供了一种像翻书效果的一种控件.我们可以通过使用UIPageViewController控件,来完成类似图书一样的翻页控制方式.   二 ...

  10. idea git merge代码

    1.点击idea 右下角的红框区域 2.出现如下截图,第一个红框是本地dev merge,也就是说可以从从本地的dev仓库merge,第二个红框表明可以从远程的git dev merge 第三个红框表 ...