zoukankan      html  css  js  c++  java
  • mysql:视图,触发器

    一视图

    视图是一个虚拟表(非真实存在),其本质是【根据SQL 语句获取动态的数据集,并未其命名】,用户使用时只需使用名称即可获取结果集,可以将该结果集当做表来使用。

    使用视图我们可以吧查询过程的临时表摘出来, 用视图去实现, 这样以后再想操作该临时表的数据时就无需重写复杂的sql了, 直接去视图中查找即可, 但视图有明显的效率问题, 并且视图是存放咋数据库中的, 如果我们程序中使用的SQL过分一开数据库中的视图, 即强耦合 ,那就意味着sql 极为不便, 因此并不推荐使用

    1.1:创建视图

    语法:create view 视图 as sql 语句

    例如:create view teacher_view  as select tid from teacher where tname=‘李平老师’;
    
    于是查询李平老师教授的课程名sql 可以改写为
    
    select cname from course where teacher_id =(select tid from teacher_view);


    +--------+
    | cname  |
    +--------+
    | 物理   |
    | 美术   |
    +--------+
    2 rows in set (0.00 sec)
    
    #!!!注意注意注意:
    #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高
    
    #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便

    1.2:使用视图

    修改视图,原始表也跟着改
    select * from Course
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    4 rows in set (0.00 sec)
    
    
    
    mysql> create view course_view as select * from course; #创建表course的视图
    Query OK, 0 rows affected (0.52 sec)
    
    select * from course_view;
    
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    4 rows in set (0.00 sec)
     
    
    
    update course_view set cname='xxx';
    Query OK, 4 rows affected (0.04 sec)
    Rows matched: 4  Changed: 4  Warnings: 0
    
    insert into course_view values(5,'yyy',2)
    Query OK, 1 row affected (0.03 sec)
    
    select * from course;
    +-----+-------+------------+
    | cid | cname | teacher_id |
    +-----+-------+------------+
    |   1 | xxx   |          1 |
    |   2 | xxx   |          2 |
    |   3 | xxx   |          3 |
    |   4 | xxx   |          2 |
    |   5 | yyy   |          2 |
    +-----+-------+------------+
    5 rows in set (0.00 sec)

    1.3:修改视图

    语法: alter view  视图名称 as sql语句
    alter view teacher_view as select * from course where cid>3;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select * from teacher_view;
    +-----+-------+------------+
    | cid | cname | teacher_id |
    +-----+-------+------------+
    |   4 | xxx   |          2 |
    |   5 | yyy   |          2 |
    +-----+-------+------------+
    2 rows in set (0.00 sec)

    1.4: 删除视图

    语法:drop view 视图名
    DROP VIEW teacher_view

    总结:

     1:可以不用重复查询, 提升效率

    2: 在硬盘中视图只有表结构文件 没有表数据文件

    3:视图通常 用于查询吗尽量不要修改视图中的数据

    二、触发器

    定义:在满足对魔杖表数据的增、删、改的情况下, 自动触发的功能称之为触发器

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

    2.1: 创建触发器语法

    针对插入

    create trigger  tri_after_insert_t1 after inser on 表名 for each row 
    begin
        sql代码
    
    end
    
    create trigger tri_before_insert_t2 before insert on 表名  for each row
    
    begin 
        sql 代码
    end

    针对删除

    creat   trigger tri_after_insert_t2 after delete on 表名 for each row
    
    begin 
        sql 代码
    end
    
    
    creat   trigger tri_before_insert_t2 before delete on 表名 for each row
    
    begin 
        sql 代码
    end

    针对修改

    create triggertri_after_update_t1  after update on 表名 for each row 
    begin 
        sql代码
    end
    
    
    
    creat   trigger tri_before_insert_t2 before insert on 表名 for each row
    
    begin 
        sql 代码
    end

    2.2:案例

    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');
    
    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,errp_time)values(NEW.cmd.NEW.sub_time);
        end if;
    end $$
    delimiter;
  • 相关阅读:
    [转]maven for eclipse在线安装 eclipsesr2
    js循环绑定事件解决方案
    设置 Eclipse/ 快速提示快捷键
    [转]POI 读取 Excel 转 HTML 支持 03xls 和 07xlsx 版本 包含样式
    解决子元素和父元素同时触发onclick
    【Tomcat】本地域名访问配置
    [ELK]快速搭建简单的日志分析平台
    Git 使用心得
    无光驱U盘启动WinPE安装操作系统的方法
    WMI调用发生 InitializationFailure 错误的解决过程
  • 原文地址:https://www.cnblogs.com/lx3822/p/9037863.html
Copyright © 2011-2022 走看看