视图、触发器、事务、存储过程、函数与流程控制

一.视图

1.1什么是视图?

视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可   (真实存在的两种表合成了一张虚拟表)

1.2为什么要用视图?

如果要频繁使用一张虚拟表,可以不用重复查询

1.3如何用视图

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


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

#注意 硬盘里面放的是真实表 内存里面放的是虚拟表

drop view teacher2course;#删除视图

结论:视图是综合得到的结果所以不要轻易改,只用来查询

二.触发器

2.1什么是触发器

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

2.2为何要用触发器

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

2.3创建触发器语法

# 针对插入
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;

三.事务

3.1什么是事务

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

3.2事务的作用

3.3如何用

# 针对插入
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;
原子性:一个事务内所有的sql操作是一个整体。都执行成功才算整个事务成功。如果某个失败,则必须要会退到事务执行之前的状态,执行成功的sql需要被撤销。

四.存储过程

4.1什么是存储过程

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

4.2三种开发模型

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

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

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

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


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

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

4.3事务的使用

pass

五.函数与流程控制

pass

 

posted @ 2019-01-14 17:24  王苗鲁  阅读(131)  评论(0)    收藏  举报