• 视图——触发器——事务——存储过程


    1、什么是视图
    视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可

    2、为什么要用视图
    如果要频繁使用一张虚拟表,可以不用重复查询

    3、如何用视图

    create view teacher2course as
    select * from teacher inner join course
    on teacher.tid = course.teacher_id;


    强调
    1、在硬盘中,视图只有表结构文件,没有表数据文件
    2、视图通常是用于插叙,尽量不要修改视图中的数据


    drop view teacher2course;
    ————————————————————————————————————————————————————————————————————————————————
    01 触发器
    在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器

    02 为何要用触发器?
    触发器专门针对我们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行
    就会触发触发器的执行,即自动运行另外一段sql代码

    03 创建触发器语法
    # 针对插入
    create trigger tri_after_insert_t1 after insert on 表名 for each row
    begin
    sql代码。。。
    end

    create trigger tri_after_insert_t2 before insert on 表名 for each row
    begin
    sql代码。。。
    end


    # 针对删除
    create trigger tri_after_delete_t1 after delete on 表名 for each row
    begin
    sql代码。。。
    end

    create trigger tri_after_delete_t2 before delete on 表名 for each row
    begin
    sql代码。。。
    end


    # 针对修改
    create trigger tri_after_update_t1 after update on 表名 for each row
    begin
    sql代码。。。
    end

    create trigger tri_after_update_t2 before update on 表名 for each row
    begin
    sql代码。。。
    end

    04 案例
    CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime, #提交时间
    success enum ('yes', 'no') #0代表执行失败
    );

    CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
    );

    delimiter $$
    create trigger tri_after_insert_cmd after insert on cmd for each row
    begin
    if NEW.success = 'no' then
    insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
    end $$
    delimiter ;


    drop trigger tri_after_insert_cmd;

    ————————————————————————————————————————————————————————————
    01 什么是事务
    开启一个事务可以包含一些sql语句,这些sql语句要么同时成功
    要么一个都别想成功,称之为事务的原子性

    02 事务的作用


    03 如何用
    create table user(
    id int primary key auto_increment,
    name char(32),
    balance int
    );

    insert into user(name,balance)
    values
    ('wsb',1000),
    ('egon',1000),
    ('ysb',1000);

    try:
    update user set balance=900 where name='wsb'; #买支付100元
    update user set balance=1010 where name='egon'; #中介拿走10元
    update user set balance=1090 where name='ysb'; #卖家拿到90元
    except 异常:
    rollback;
    else:
    commit;
    ————————————————————————————————————————————————————————
    01 存储过程
    存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql


    02 三种开发模型
    1、
    应用程序:只需要开发应用程序的逻辑
    mysql:编写好存储过程,以供应用程序调用

    优点:开发效率,执行效率都高
    缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差

    2、
    应用程序:除了开发应用程序的逻辑,还需要编写原生sql
    mysql:

    优点:比方式1,扩展性高(非技术性的)
    缺点:
    1、开发效率,执行效率都不如方式1
    2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题


    3、
    应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
    mysql:

    优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
    缺点:执行效率连方式2都比不过

    03 创建存储过程

    delimiter $$
    create procedure p1(
    in m int, #接收值
    in n int, #接收值
    out res int #返回值
    )
    begin
    select tname from teacher where tid > m and tid < n;
    set res=0; #用于返回
    end $$
    delimiter ;

    # 如何用存储过程
    #1、直接在mysql中调用
    set @res=10
    call p1(2,4,10); 错误使用

    call p1(2,4,@res) 正确使用

    #查看结果
    select @res;

    #2、在python程序中调用
    PS: 哪里定义 哪里用

    #3、事务的使用
    delimiter //
    create PROCEDURE p5(
    OUT p_return_code tinyint
    )
    BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
    -- ERROR
    set p_return_code = 1;
    rollback;
    END;

    DECLARE exit handler for sqlwarning
    BEGIN
    -- WARNING
    set p_return_code = 2;
    rollback;
    END;

    START TRANSACTION;
    update user set balance=900 where id =1;
    update user123 set balance=1010 where id = 2;
    update user set balance=1090 where id =3;
    COMMIT;

    -- SUCCESS
    set p_return_code = 0; #0代表执行成功

    END //
    delimiter ;



    delimiter //
    create PROCEDURE p6(
    OUT p_return_code tinyint
    )
    BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
    -- ERROR
    set p_return_code = 1;
    rollback;
    END;

    DECLARE exit handler for sqlwarning
    BEGIN
    -- WARNING
    set p_return_code = 2;
    rollback;
    END;

    START TRANSACTION;
    update user set balance=900 where id =1;
    update user set balance=1010 where id = 2;
    update user set balance=1090 where id =3;
    COMMIT;

    -- SUCCESS
    set p_return_code = 0; #0代表执行成功

    END //
    delimiter ;
    ——————————————————————————————————————————————————————
    1、强调:mysql内置的函数只能在sql语句中使用

    mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
  • 相关阅读:
    web页面前图标
    leetcode收获
    Shell统计函数耗时(实现数字运算)
    Shell判断数值是否存在于列表
    设置Ubuntu虚拟机硬件时间与系统同步
    Python捕获键盘中断^C方法(Ctrl-C)
    Shell创建zip文件不包含完整路径方法
    jquery判断复选框checkbox是否被选中
    php Base64编码/解码
    php二维数组排序
  • 原文地址:https://www.cnblogs.com/TF511/p/10022109.html
Copyright © 2020-2023  润新知