视图 触发器 事务 存储过程 内置函数 流程控制 索引

一笑奈何 提交于 2019-11-28 07:59:10

视图
    一个查询语句的结果是一张虚拟表,将这种虚拟表保存下来,它就变成了一个视图
    当频繁需要用到多张表的连表结果,你就可以事先生成好视图,之后直接调用即可,避免了反复写连表操作的sql语句。

create view teacher_course as select * from teacher INNER JOIN course
on teacher.tid = course.teacher_id;

 1.视图只有表结构,视图中的数据还是来源于原来的表
    2.不要改动视图表中的数据
    3.一般情况下不会频繁的使用视图来写业务逻辑

触发器
    到达某个条件自动触发, 当你在对数据进行增 删 改的情况下会自动触发触发器的运行

触发器分为六种情况

固定语法结构:
    create trigger 触发器的名字 after/before insert /update/delete on 表名 for each row
    begin
      sqly语句
    end
    create trigger tri_brfore/after_insert /update/delete_t1 after/before insert/update/delete on t1 for each row
    begin
      sql语句
    end

增前

可以修改mysql默认的结束符(;)
  delimiter $$    #只对当前窗口有效
  create trigger tri_before-insert_user before insert on user for each row
  begin
    select * from user
  end $$
  delimiter;

增后/删前/删后/改前/改后

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
);

补充:NEW对象指代的就是当前记录
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 ;
delimiter $$  # 只对当前窗口有效
create trigger tri_after_insert_user after insert on user for each row
begin
    insert into user(name,password) values('老子翻车了','123');  # user和上面user不能相同,不能执行同一张表
end $$
delimiter ;
drop trigger tri_before_insert_user;

事务
    事务包含一大堆sql语句,这些sql要么同时成功,要么一个也别想成功
    事务四大特性:ACID
        A:原子性/ C:一致性/  I:隔离性/ D:持久性
  原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
  如何开启事务:start transaction
  事务回滚 rollback
  永久性更改 commit

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);

存储过程
    就类似于python中的自定义函数,内部封装了操作数据库的sql语句,后续想要实现相应的操作 只需要调用存储过程即可

语法结果
        delimiter $$
        create procedure p1()
        begin
            select * from user;
        end $$
        delimiter ;

    带参数的
        delimiter $$
        create procedure p1(
            in m int,  # 不能被返回出去
            in n int,
            out res int,  # 可以被返回
            inout xxx int,  # 既可以进又可以出
        )
        begin
            select * from user;
        end $$
        delimiter ;
delimiter $$
create procedure p1(
    in m int,  # in表示这个参数必须只能是传入不能被返回出去
    in n int,
    out res int  # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
)
begin
    select tname from teacher where tid > m and tid < n;
    set res=0;  # 就类似于是一个标志位 用来标识存储器是否执行成功
end $$
delimiter ;
set @res = 10   # 设置一个变量与值的绑定关系
调用存储过程 将变量@res传入,之后通过select @res查看存储过程执行完成后的返回结果存储过程在哪个库下面定义 就只能在哪个库下面使
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 ;

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!