视图

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

视图是存在数据库中的,如果我们程序中使用的sql过分依赖数据库的视图,即强耦合,那就意味着扩展不方便。

创建视图:

  1. create view view_name as select * from table1 inner join table2 on table1.id=table2.sid;

使用视图以后就无需每次都重写子查询的sql,但是效率并不高,不如我们写子查询的效率高。

致命问题是视图是存放在数据库的,如果我们 程序中的sql过分依赖数据库中存放的视图 ,就意味着一旦sql需要修改且涉及视图的部分 就必须去数据库中修改,通常是由专门的DBA负责的,要是想要修改,必须付出大量的沟通成本才会帮我们去修改。

我们不应该修改视图中的记录的,而且涉及多个表的情况下根本是无法修改视图中的记录的。

修改视图:

  1. alter view view_name as sql语句

删除视图:

  1. drop view view_name;

触发器

触发器是在满足某种条件,自动触发的功能

应用场景:专门针对我们某一张表数据进行增删改的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另一段sql代码。

创建触发器:

1.插入前

  1. create trigger tri_before_insert_tb1 before insert on tb1 for each row
  2.  
  3. begin
  4.  
  5. ……
  6.  
  7. end

2.插入后

  1. create trigger tri_after_insert_tb1 after insert on tb1 for each row
  2.  
  3. begin
  4.  
  5. ……
  6.  
  7. end

3.例子

#准备表

  1. CREATE TABLE cmd (
  2.  
  3. id INT PRIMARY KEY auto_increment,
  4.  
  5. USER CHAR (32),
  6.  
  7. priv CHAR (10),
  8.  
  9. cmd CHAR (64),
  10.  
  11. sub_time datetime, #提交时间
  12.  
  13. success enum ('yes', 'no') #0代表执行失败
  14.  
  15. );
  16.  
  17. CREATE TABLE errlog (
  18.  
  19. id INT PRIMARY KEY auto_increment,
  20.  
  21. err_cmd CHAR (64),
  22.  
  23. err_time datetime
  24.  
  25. );

#创建触发器

  1. delimiter //
  2. CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
  3. BEGIN
  4. IF NEW.success = 'no' THEN #等值判断只有一个等号
  5. INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必须加分号
  6. END IF ; #必须加分号
  7. END//
  8. delimiter ;
  9. #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
  10. INSERT INTO cmd (
  11. USER,
  12. priv,
  13. cmd,
  14. sub_time,
  15. success
  16. )
  17. VALUES
  18. ('aaaa','','ls -l /etc',NOW(),'yes'),
  19. ('aaaa','','cat /etc/passwd',NOW(),'no'),
  20. ('aaaa','','useradd xxx',NOW(),'no'),
  21. ('aaaa','','ps aux',NOW(),'yes');

注意:NEW表示即将插入的数据行,mysql每插入一条数据就会将其封装为一个对象new。OLD表示即将删除的数据行。

使用触发器

触发器是无法由用户直接使用的,对表的改数据操作是被动引发的。

删除触发器

  1. drop trigger tri_after_insert_cmd;

事务

开启一个事务可以包含一系列sql语句,这些语句要么 同时成功,要么一个都不成功,这称为事务的原子性。事务主要用于交易类。

事务将某些操作的多个SQL作为原子操作,一旦出现某些错误,即可回滚到原来状态(commit了就不能改了),从而保证数据的完整性。

开启事务:

  1. #数据表准备
    create table user(
  2. id int primary key auto_increment,
  3. name char(32),
  4. balance int
  5. );
  6.  
  7. #数据准备
  8. insert into user(name,balance) values
  9. ('aaa',1000),
  10. ('bbb',1000),
  11. ('ccc',1000);

#原子操作

  1. start transaction;
  2. update user set balance=900 where name='wsb'; #买支付100元
  3. update user set balance=1010 where name='egon'; #中介拿走10元
  4. update user set balance=1090 where name='ysb'; #卖家拿到90元
  5. commit;
  1. #出现异常,回滚到初始状态
  1. start transaction;
  2. update user set balance=900 where name='aaa'; #买支付100元
  3. update user set balance=1010 where name='bbb; #中介拿走10元
  4. uppdate user set balance=1090 where name='ccc'; #卖家拿到90元,出现异常没有拿到
  5. rollback;
  6. #rollback只有在commit之前才能回滚到原来状态,commit之后数据在硬盘上改变了,就无法回滚了
  7.  
  8. commit;

存储过程

存储过程是完全有专门的开发人员开发管理,程序开发人员需要跨部门沟通,导致扩展性差。

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

使用存储过程的优点:

  1. 用于替代程序写的SQL语句,实现程序与SQL解耦
  2. 基于网络传输,用存储过程只需要传输封装好的别名,而直接传输数据量大,网络IO慢。

缺点:程序员扩展不方便

三种开发模型:

1.应用程序:只需开发应用程序的逻辑

mysql编写好存储过程,以供应用程序调用

优点:开发效率、执行效率高

缺点:考虑到人为因素、跨部门沟通导致扩展性差

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

优点:比方式一,扩展性高(非技术)

缺点:开发效率、执行效率都不如方式1

编写原生sql太过复杂,需要考虑sql优化问题

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

优点:不用再编写原生sql,比原生开发效率高,同时兼容扩展性高的好处

缺点:执行效率连方式2都比不过3

创建存储过程

  1. delimiter $$
  2. create procedure p1( #创建存储过程p1
  3. in m int, #mysql中参数必须先规定类型和用途(in,out,inout)
  4. in n int,
  5. out res int #res用于接收返回值
  6. )
  7. begin
  8. select tname from teacher where tid > m and tid < n;
  9. set res=0;
  10. end $$
  11. delimiter ;

如何用存储过程

  1. a、直接在mysql中调用
  2.  
  3. set @res=10 #mysql中变量的定义要用@abc的形式
  4.  
  5. call p1(2,4,@res);
  6.  
  7. select @res; #查看结果
  8.  
  9. b、在python程序中调用
  10.  
  11. import pymysql
  12.  
  13. conn=pymysql.connect(
  14.  
  15. host='127.0.0.1',
  16.  
  17. port=3306,
  18.  
  19. user='root',
  20.  
  21. password='',
  22.  
  23. charset='utf8',
  24.  
  25. database='db42'
  26.  
  27. )
  28.  
  29. cursor=conn.cursor(pymysql.cursors.DictCursor)
  30.  
  31. cursor.callproc('p1',(2,4,10)) #@_p1_0=2,@_p1_1=4,@_p1_2=10 #pymysql帮助对传入变量进行以上变形
  32.  
  33. print(cursor.fetchall())
  34.  
  35. cursor.execute('select @_p1_2;') #查看返回值,确认执行结果
  36.  
  37. print(cursor.fetchone())
  38.  
  39. cursor.close()
  40.  
  41. conn.close()

事务的使用 (事务+存储过程)

  1. delimiter //
  2. create PROCEDURE p5(
  3. OUT p_return_code tinyint
  4. )
  5. BEGIN
  6. DECLARE exit handler for sqlexception #如果出现错误,执行
  7. BEGIN
  8. -- ERROR
  9. set p_return_code = 1;
  10. rollback;
  11. END;
  12. DECLARE exit handler for sqlwarning #如果出现警告,执行
  13. BEGIN
  14. -- WARNING
  15. set p_return_code = 2;
  16. rollback;
  17. END;
  18. START TRANSACTION; #事务的应用
  19. update user set balance=900 where id =1;
  20. update user123 set balance=1010 where id = 2;
  21. update user set balance=1090 where id =3;
  22. COMMIT;
  23. -- SUCCESS
  24. set p_return_code = 0; #0代表执行成功
  25. END //
  26.  
  27. delimiter ;

在python中调用存储过程

  1. import pymysql
  2.  
  3. conn=pymysql.connect(
  4. host='127.0.0.1',
  5. port=3306,
  6. user='root',
  7. password='root',
  8. charset='utf8',
  9. database='mydb'
  10.  
  11. )
  12. cursor=conn.cursor(pymysql.cursors.DictCursor)
  13. cursor.callproc('p6',(100,)) #@_p5_0 = 100
  14. cursor.execute('select @_p6_0')
  15. print(cursor.fetchone())
  16. cursor.close()
  17. conn.close()

删除存储过程:

  1. prop procedure proc_name;

函数

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

mysql> select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

2、补充

a、select * from s1 \G   #表字段太多(字段行显示不全)时,用\G将表竖着显示出来: row1 哪些字段: 对应的内容,row2。。。

b、视图、触发器、事务、存储过程、函数、流程控制皆是在库下面建立

流程控制 (if,while,case)

  1. #case
  2. select
  3. case
  4. when name = 'aaa' then
  5. name
  6. when name = 'bbb' then
  7. concat(name,'_BIGSB')
  8. else
  9. concat(name,'_SB')
  10. end
  11. from emp;

mysql视图、触发事务、存储过程的更多相关文章

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

    事务  致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...

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

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  3. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  4. MySQL视图,触发器,事务,存储过程,函数

    create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...

  5. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  6. mysql 视图,事务,存储过程,触发器

    一 视图 视图是一个虚拟表(非真实存在),是跑到内存中的表,真实表是硬盘上的表.使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sq ...

  7. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  8. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  9. Python11/26--mysql之视图/触发器/事务/存储过程

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...

  10. MySQL视图view/存储过程和函数的使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

随机推荐

  1. Hibernate 连接不同数据库的方言

    RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...

  2. josn的格式化

    public String formatJson(Object obj) { com.alibaba.fastjson.JSONObject json=(com.alibaba.fastjson.JS ...

  3. cuda编程-并行规约

    利用shared memory计算,并避免bank conflict:通过每个block内部规约,然后再把所有block的计算结果在CPU端累加 代码: #include <cuda_runti ...

  4. 动态sql and在前 逗号在后

  5. luogu3391

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  6. python--使用pymyslq操作数据库

    1.安装pymysql 在命令行内输入 pip install pymysql : 2.pycharm连接mysql 在进行本文以下内容之前需要注意: 你有一个MySQL数据库,并且已经启动. 你有可 ...

  7. JS操作Cookies

    JS操作Cookies 获取Cookie function getCookie(c_name) { if (document.cookie.length > 0) { c_start = doc ...

  8. Codeforces Round #419 Div. 1

    A:暴力枚举第一列加多少次,显然这样能确定一种方案. #include<iostream> #include<cstdio> #include<cmath> #in ...

  9. Django auth认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  10. Kindle支持文档类型

    Kindle支持文档类型 Kindle个人文档服务目前只能转换并发送以下类型的文档:Microsoft Word (.doc, .docx) RTF文件(.rtf) HTML(.htm, .html) ...