zoukankan      html  css  js  c++  java
  • 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的虚拟表,訪问被删除的行。

  • 相关阅读:
    KD Tree
    Kmeans聚类算法
    考托业啊考托业,英语是硬伤啊!!!
    c++中xx.h和xx.cpp之间的联系
    vs2010常用快捷键
    径向基函数(RBF)
    Obj文件分析与读取
    Delaunay三角剖分中的LOP(Local Optimization Procedure)算法
    c++中冒号(:)的用法
    SVN在update时报com' is missing or not locked 的解决办法汇总
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5213227.html
Copyright © 2011-2022 走看看