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

一,视图1,什么是视图?    视图就是通过查询得到一张虚拟表,然后保存下来,下次用的话直接使用即可2,为什么要用视图    如果要频繁使用一张虚拟表,可以不用重复查询3,怎么用?     在查询前面加 create view 视图名称 as sql语句     create view teacher_view as select tid from teacher where tname=‘李平老师‘;   强调:在硬盘中,视图只有表结构文件,没有数据文件   视图开发尽量不用 因为是在mysql里面 ,视图通常用于插叙,尽量不要修改视图中的数据   2,修改视图:alter view 视图名称 as sql语句   3,删除视图:drop view 视图名称

二,触发器1,触发器     在满足对某张表增删改的情况下,自动触发的功能称之为触发器 注意:没有查询2,为什么用触发器     触发器专门针对我们对某一张表数据增insert,删delete,改update的行为,这类行为一旦执行     就会触发触发器的执行,即自动运行另外一段sql代码

3,创建触发器语法
create trigger tril after
针对插入
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 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;
触发器的两个关键字:new ,old-- new :表示新的记录-- old:表示旧的那条记录-- 什么情况下才往里面插记录--       当命令输入错误的时候就把错误的记录插入到err_log表中
三,事务(重重重)1,什么是事务?     开启一个事务可以包含一些sql语句要么同时成功,这些sql语句要么成功     要么一个都别想成功,称为事务的原子性·

2,事务的作用  务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,    即可回滚到原来的状态,从而保证数据库数据完整性。    事务也就是要么都成功,要么都不成功    事务就是由一堆sql语句组成的3,如何用?
 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‘;
        update user set balance=1010 where name=‘egon‘;
        update user set balance=1090 where name=‘ysb‘;
    except 异常:
        rollback;
    else:
        commit;
如果都成功就执行commit,,,如果不成功就执行rollback。
rollback; #如果任意一条sql出现异常,都应该回归到初始状态
四,存储过程(重重重)
1,存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
存储过程的优点:
    1.程序与数据实现解耦
     2.减少网络传输的数据量
但是看似很完美,还是不推荐你使用
Mysql当中的函数不能单独调用

表竖着显示\G
2, 三种开发模型
    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);
#查看结果
select @res;

#2、在python程序中调用

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

4,在python 中调用存储过程
# import pymysql
#
# conn=pymysql.connect(
#     host=‘127.0.0.1‘,
#     port=3306,
#     user=‘root‘,
#     password=‘123‘,
#     charset=‘utf8‘,
#     database=‘db42‘
# )
#
# cursor=conn.cursor(pymysql.cursors.DictCursor)
#
# cursor.callproc(‘p1‘,(2,4,10)) #@_p1_0=2,@_p1_1=4,@_p1_2=10
#
#
# print(cursor.fetchall())
#
# cursor.execute(‘select @_p1_2;‘)
# print(cursor.fetchone())
#
# cursor.close()
# conn.close()

# import pymysql
#
# conn=pymysql.connect(
#     host=‘127.0.0.1‘,
#     port=3306,
#     user=‘root‘,
#     password=‘123‘,
#     charset=‘utf8‘,
#     database=‘db44‘
# )
#
# cursor=conn.cursor(pymysql.cursors.DictCursor)
#
# cursor.callproc(‘p6‘,(100,)) #@_p5_0 = 100
#
# cursor.execute(‘select @_p6_0‘)
# print(cursor.fetchone())
#
# cursor.close()
# conn.close()
五,函数1、强调:mysql内置的函数只能在sql语句中使用
mysql> select date_format(sub_time,‘%Y-%m‘),count(id) from blog group by date_format(sub_time,‘%Y-%m‘);
六,流程控制
 1.条件语句
   delimiter //
   create procedure proc_if()
   begin
        declare i int default 0;
        if i=1then
            select 1;
        elseif i = 2 then
             select 2;
        else
              select 7;
        end if;
   end //
   delimiter;

    2,循环语句
    delimiter //
    create procedure proc_while()
    being

          declare num int;
          set num = 0;
          where num<10 do
                 SELECT
            num ;
        SET num = num + 1 ;
    END WHILE ;

END //
delimiter ;
  3,repeat循环
  delimiter //
CREATE PROCEDURE proc_repeat ()
BEGIN

    DECLARE i INT ;
    SET i = 0 ;
    repeat
        select i;
        set i = i + 1;
        until i >= 5
    end repeat;

END //
delimiter ;

    4,loop
     BEGIN

    declare i int default 0;
    loop_label: loop

        set i=i+1;
        if i<8 then
            iterate loop_label;
        end if;
        if i>=10 then
            leave loop_label;
        end if;
        select i;
    end loop loop_label;

END

select
case
when name = ‘egon‘ then
    name
when name = ‘alex‘ then
    concat(name,‘_BIGSB‘)
else
    concat(name,‘_SB‘)
end

from emp;



原文地址:https://www.cnblogs.com/maojiang/p/9037571.html

时间: 2024-07-31 16:23:05

视图,触发器,事务,存储过程,函数,流程控制,的相关文章

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysql的默认结束符(;) 触发器死循环 六个触发器的执行时机 新增前.新增后.删除前.删除后.更新前.更新后 NEW对象指代的就是当前记录(对象) 事务 ***** 什么是事务 事务的四大特性 ACID A:原子性 atomicity C:一致性 consistency I:隔离性 isolation D:持

Mysql之视图 触发器 事务 存储过程 函数

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> se

MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化

视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调: (1)在硬盘中,视图只有表结构文件,没有表结构数据 (2)视图通常是用于查询,尽量不要修改视图中的数据 dro

SQL表连接视图触发器事务存储过程

trancate 删除    公共表表达式  修改视图 表联合:union列数目没变化,可以将结果集合并,没有改变结果的结构.多个select.行数增加而已. 表连接 改变列的数目,3列和9列的表合并成12列的表称为连接 交叉连接:cross两个表的笛卡尔积.生成辅助表,用老数据优化,需要1234纯数字连续据表 creat table num15 ( num int ) insert into num15 内连接: 外连接:

视图 触发器 存储过程 函数 流程过程 索引 慢查询

视图 触发器 存储过程 函数 流程过程 索引 慢查询 视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调

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

阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部都做了,也就是说它想要完成一件事,以后想开发的人,例如想写python程序的人,你就专门的写你自己的python程序,以后凡是关于数据的增删改查,全部都在MySQL里面完成,也就是说它想实现一个数据处理与应用程序的一个完全的解耦和状态,比如说,如果我是个应用程序员,我想要查询数据,我不需要自己写sql语句,只需要调用mysql封装好的一些功能,直

Python-视图 触发器 事务 存储过程

1.视图2.触发器*** 在某个时间发生了某个事件时 会自动触发一段sql语句3.事务***** 是逻辑上的一组sql语句 他们要么都成功 要么都失败 今后只要执行sql就会有事务 使用事务 start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库 commit;--提交事务,让这个事物中的sql立即执行数据的操作, rollback;--回滚事务,取消这个事物,这个事物不会对数据库中的数据产生任何影响 四个特性 原子性:事务是一组不可分割的

视图 触发器 事务 函数 存储过程

1.视图 视图是一个虚拟表(非真实存在).使用视图我们可以把查询过程中的临时表摘出来,用视图去实现. 视图有明显的效率问题,而且使用视图会过分依赖视图,强耦合,这样意味着扩展sql极为不便,因此不推荐使用 创建视图,使用视图 DROP VIEW teacher_view 删除视图 DROP VIEW teacher_view 2.使用触发器可以定制用户对某张表进行增删改操作前后的行为,注意:没有查询 delimiter // create trigger t1 BEFORE INSERT on

SQL Service 数据库 基本操作 视图 触发器 游标 存储过程

use NewTest1 ---声明视图--- create view NewViewte as select StudentInfo.name as 姓名,StudentInfo.sex as 性别,course.name as 课程 from StudentInfo join Course on StudentInfo.Cid= Course.id ---调用视图 select * from NewViewte --- 声明触发器--- create trigger NewTri on Cl

Mysql(10)_存储过程与流程控制

一  存储过程与if语句 -- ---------------------------- -- Procedure structure for `proc_adder` -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_adder`; DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT