视图

# 视图也是一张表,但在data文件里只有表结构,没有表数据

# 不建议使用,扩展性差,程序需改变时,依赖的视图也要改变

# 视图牵涉到多张表时,视图中的记录不能修改。

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

alter view

select * from course2teacher

触发器

使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

create trigger tri_before_insert_tb1 before insert on tb1 for each row

上图中,delimiter //将原本 ;号的结束符改为//,语句写完后,又换成 ;结束符。

NEW 表示即将插入的数据行,OLD表示即将删除的数据行。

使用触发器:无法由用户直接调用,而是由于对表的增删改操作被动引发。

删除触发器:drop triggeer tri_after_insert_cmd。

触发器的逻辑尽量在应用程序里写,否则还要找数据库人员修改触发器。

函数

内置函数,写在select后面,有char_length(),date_format()等

自定义函数,

create function f1(

  t1 int,

  t2 int)

return int

BEGIN

  declare num int;

  set num = t1+t2;

  return num;

END //

delimiter  ;

存储过程

# 无参存储过程

delimiter //

create procedure p1()

BEGIN

  select * from db1.teacher;

END //

delimiter  ;

show create procedure p1;  # 查看存储过程

# 在MySQL中调用

call p1();

# 在Python中调用

cursor.call_proc('p1')

# 有参存储过程

delimiter //

create procedure p2(

in n1 int,

in n2 int,

out res int ,     # 用于标识执行结果

inout n3 int)

BEGIN

  select * from db1.teacher where tid > n1 and tid < n2;

  set res = 1;  # res是out伪造的返回值,如果要取select语句返回的表格,需从@_p2_0和@_P2_1中取

          # 为什么有结果集又有out伪造的返回值?

END //

delimiter ;

# 在MySQL中调用

set @x=0    # 给session级别的变量设值

call p2(2,4,@x);

select @x;

# 在Python中调用

cursor.call_proc('p2',(2,4,0))  #@_p2_0 = 2,@_P2_1=4,

拿返回值需再进行一次查询

cursor.execute('select @_p2_0,@_P2_1,@_p2_2')

cursor.fetchone()

有了存储过程后,真正实现了应用程序和数据库的集成开发。

应用程序和数据库结合的三种方式:

方式一:只需通过网络发存储过程名

  Python调用存储过程

  MySQL编写存储过程

方式二:

  Python编写原生SQL语句

方式三:

  Python用ORM框架生成SQL语句

事务

事务常被用于存储过程中

事务用于将某些操作的多个sql作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

delimiter //

create procedure p4(

  out status int

)

BIGIN

  DECLARE exit handler for sqlexception

  BEGIN

    -- ERROR

    set p_return_code = 1;

    rollback;

  END

  start transaction;

    update user set balance = 900 where name='wdb'; # 购买支付100元

    user set balance = 1010 where name='egon' # 商家增加10元

  commit;

  --SUCCESS

  set p_return_code = 2;

END //

delimiter  ;

通过游标实现循环的存储过程

delimiter //

create procedure p6()

begin

  declare row_id int;

  declare row_num varchar(50);

  declare done int default false;

  

  declare my_cursor cursor for select id,num from A;

  declare continue handler for not found set done = true;

  open my_cursor;

    xxoo: LOOP

      fetch my_cursor into row_id,row_num;

      if done then

        leave xxoo;

      end if;

      set temp = row_id + row_num

      insert into B(num) values(temp);

    end loop xxoo;

  close my_cursor;

end //

delimiter  ;

动态执行sql,(防sql注入)

delimiter //

create procedure p7(

  in tpl varchar(255),

  in arg int

)

begin

  1、预检测sql语句合法性

  2、sql = 格式化 tpl + arg

  3、执行sql语句

  set @xo = arg;

  prepare xxx from 'select * from student where sid >?';

  execute xxx using @xo;

  deallocate prepare prod;

end //

delimiter ;

sql之视图、触发器、函数、存储过程、事务的更多相关文章

  1. python 全栈开发,Day64(视图,触发器,函数,存储过程,事务)

    昨日内容回顾 pymysql:属于python的一个模块 pip3 install pymysql conn = pymysql.connect(...,charset = 'uft8') 创建游标 ...

  2. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  3. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  4. MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件

      截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...

  5. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  6. Python9-MySQL-MySQL存储过程-视图-触发器-函数-day45

    视图:某个查询语句设置别名,日后方便使用 CREATE VIEW v1 as SELECT * FROM student WHERE sid >10 -创建: create view 视图名称 ...

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

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

  8. mysql 视图/触发器/函数

    一.视图 作用:简写代码,与临时表的作用差不多 .创建 create view 视图名 as SQL语句 .修改 alter view 视图名 as 新SQL语句 .删除 drop view 视图名 ...

  9. 数往知来SQL SERVER 视图 触发器 <九>

    SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...

  10. Database学习 - mysql 视图/触发器/函数

随机推荐

  1. ARM体系结构与编程-5

    GET通经常使用于包括定义常量的源文件. 比如:GET 2440addr.inc 用AREA定义一个段.ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 比如: AREA init ...

  2. 基于bootstrap的纯静态网站目录

    一.博客页面 二.登陆页面 三.信息采集 四.管理后台 五.网站汇总(基于上边四个功能) 因为样式统一采用bootstrap的样式,所以不做介绍 样式导入可以将bootstrap下载至本地(有自动补齐 ...

  3. 说说设计模式~单件模式(Singleton)

    单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { ...

  4. “checkbox”和“select”对象在javascript和jquery的操作差异做了整理

    checkbox checkbox在javascript和jquery中选中和取消的方法 Javascript: document.getElementById("myCheck" ...

  5. EasyRTMP实现的rtmp推流的基本协议流程

    EasyRTMP介绍 EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer).智能丢帧.自动重连.rtmp协议等等多种技术,能够非 ...

  6. Struts2访问Servlet API的三种方式

    有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式. * ...

  7. NET 并发编程

    场景并发调用API 1.简单封装httpclient public class CommonHelper { private static readonly HttpClient _httpClien ...

  8. [数据挖掘课程笔记]关联规则挖掘 - Apriori算法

    两种度量: 支持度(support)  support(A→B) = count(AUB)/N (N是数据库中记录的条数) 自信度(confidence)confidence(A→B) = count ...

  9. STM32 ~ 如何从ST网站找到对应的固件库

    ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...

  10. 有关 java 不定参数

    不定参数实际为数组参数的一种写法而已,本质上与数组参数完全相同 //1.数组参数函数 public static int sum(int[] values) { } //2.不定参数函数 不定参数只能 ...