视图

什么是视图 ?

  一个查询语句的结果是一张虚拟表,将这种虚拟表保存下来,它就变成了一个视图。

为什么要用视图?

  当频繁需要用到多张表的连表结果,你就可以事先生成好视图,之后直接调用即可,避免了反复写连表操作的sql语句。

如何使用视图?

  1. create view teacher_course as select * from teacher INNER JOIN course
  2. on teacher.tid = course.teacher_id;

1、视图只有表结构,视图中的数据还是来源于原来的表

2、不要改动视图表中的数据

3、一般情况下不会频繁的使用视图来写业务逻辑

  1. #需要强调的点
  2. """
  3. 1.在硬盘中,视图只有表结构文件,没有表数据文件
  4. 2.视图通常是用于查询,尽量不要修改视图中的数据
  5. """
  6.  
  7. #需要思考的点:开发过程中会不会去使用视图?
  8. """
  9. 不会,视图是MySQL的功能,如果你的项目里大量的使用到了视图,那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改,意味着你需要先在mysql这边将视图先修改一下,然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能
  10.  
  11. """
  1. #总结
  2. #创建语法:create view 视图名称 as SQL语句

  3. ##多张表连接的视图尽量不要修改和删除
  4. #修改语法:alter view 视图名称 as SQL语句
  5.  
  6. #删除语法:drop view 视图名称

触发器

什么是触发器?

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

注意点(触发器无法由用户直接调用,一定是在对表的【增/删/改】操作时触发的)

为什么要用触发器?

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

怎么用触发器?

  触发器分为六种情况:增前、增后、删前、删后、改前、改后。

固定语法

  1. create trigger 触发器的名字 after/before insert/update/delete on 表名 for each row
  2. begin
  3. sql语句
  4. end
  5.  
  6. #触发器的名字
  7. tri_(before/after)_(insert/update/delete)_表名
  8. #触发器的名字之后先写前后(before/after)
  9. #写完之后再写是什么操作(insert/update/delete)

MySQL结束符的修改

  1. #Mysql的结束符(;)是可以修改的
  2. delimiter $$ 只对当前窗口有效
    #使用完之后最好修改回来
    delimiter ;

案例

  1. #写一个触发器,在给CMD表插入数据之后触发,然后判断插入的success是yes还是no,如果是no,就往errlog里插一条数据
  2. CREATE TABLE cmd (
  3. id INT PRIMARY KEY auto_increment,
  4. USER CHAR (32),
  5. priv CHAR (10),
  6. cmd CHAR (64),
  7. sub_time datetime, #提交时间
  8. success enum ('yes', 'no') #0代表执行失败
  9. );
  10.  
  11. CREATE TABLE errlog (
  12. id INT PRIMARY KEY auto_increment,
  13. err_cmd CHAR (64),
  14. err_time datetime
  15.  
  16. #写触发器
  17. #补充:NEW对象指代的就是当前记录
  18. delimiter $$
  19. create trigger tri_after_insert_cmd after insert on cmd for each row
  20. begin
  21. if NEW.success = 'no' then
  22. insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
  23. end if;
  24. end $$
  25. delimiter ;
  1. #触发器的删除
  2. drop trigger tri_before_insert_user;

事物

事务包含一大堆sql语句,这些sql要么同时成功,要么一个也别想成功

事务的四大特性:ACID

A:原子性(atomicity),一个事务是一个不可分割的工作单位,事务中包括的诸多操作,要么都做,要么都不做。

C:一致性(consistency),事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

I:隔离性(isolation),一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事务之间不能互相干扰。

D :持久性(durability),持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中的改变就应该是永久性的,接下来的其他操作或故障不应该对其有任何影响。

事务的使用

  1. #如何开启事务
  2. start transaction(也可以用begin
  3. #事务回滚
  4. rollback
  5. #永久性更改
  6. commit
  7.  
  8. ##可以用set 来改变MySQL的自动提交模式
  9. set autocommit=0(禁止自动提交)
  10. set autocommit=1(开启自动提交)
  11.  
  12. ##一旦使用commit再使用回滚也不能回到之前的状态了

存储过程

就类似于python中的自定义函数,内部封装了操作数据库的sql语句,后续想要实现相应的操作,只需要调用存储过程即可。

  1. # 语法结果
  2. delimiter $$
  3. create procedure p1()
  4. begin
  5. select * from user;
  6. end $$
  7. delimiter ;
  8.  
  9. #带参数的
  10. delimiter $$
  11. create procedure p1(
  12. in m int, # 不能被返回出去
  13. in n int,
  14. out res int, # 可以被返回
  15. inout xxx int, # 既可以进又可以出
  16. )
  17. begin
  18. select * from user;
  19. end $$
  20. delimiter ;
  21.  
  22. #调用
    call p1()
  1. #实例
  2. delimiter $$
  3. create procedure p1(
  4. in m int, # in表示这个参数必须只能是传入不能被返回出去
  5. in n int,
  6. out res int # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
  7. )
  8. begin
  9. select tname from teacher where tid > m and tid < n;
  10. set res=0; # 就类似于是一个标志位 用来标识存储器是否执行成功
  11. end $$
  12. delimiter ;
  13.  
  14. call p1() # 调用存储过程并传参
  15. ##传参,将标志位直接传进去会报错
  16. set @res = 10 # 设置一个变量与值的绑定关系
  17.  
  18. 之后通过
  19. select @res
  20. 查看存储过程执行完成后的返回结果

注意:存储过程在那个库下面定义就只能在那个库下面使用。

通过pymysql调用存储过程

  1. import pymysql
  2.  
  3. conn = pymysql.connect(
  4. host = '127.0.0.1',
  5. port = 3306,
  6. user = 'root',
  7. password = '',
  8. database = 'day38',
  9. charset = 'utf8',
  10. autocommit = True
  11. )
  12. cursor = conn.cursor(pymysql.cursors.DictCursor)
  13. # call p1() mysql中调用
  14. # callproc() pymysql中调用
  15. cursor.callproc('p1',(1,5,10))
  16. # 内部自动用变量名存储了对应的值
  17. print(cursor.fetchall())
  18. """
  19. @_p1_0=1
  20. @_p1_1=5
  21. @_p1_2=10
  22. #这是在你传值之后mysql内部自动用这种变量名帮你存取这三个值
  23. @_存储过程名_索引值(传值括号内的索引)
  24. """
  25. cursor.execute('select @_p1_0')
  26. print(cursor.fetchall())
  27. cursor.execute('select @_p1_1')
  28. print(cursor.fetchall())
  29. cursor.execute('select @_p1_2')
  30. print(cursor.fetchall())
  1. #删除存储过程
  2. drop procedure proc_name;

函数

自定义函数

  1. #!!!注意!!!
  2. #函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
  3. #若要想在begin...end...中写sql,请用存储过程
  4.  
  5. """
  6. delimiter //
  7. create function f1(
  8. i1 int,
  9. i2 int)
  10. returns int
  11. BEGIN
  12. declare num int;
  13. set num = i1 + i2;
  14. return(num);
  15. END //
  16. delimiter ;
  17. """
  18. delimiter //
  19. create function f5(
  20. i int
  21. )
  22. returns int
  23. begin
  24. declare res int default 0;
  25. if i = 10 then
  26. set res=100;
  27. elseif i = 20 then
  28. set res=200;
  29. elseif i = 30 then
  30. set res=300;
  31. else
  32. set res=400;
  33. end if;
  34. return res;
  35. end //
  36. delimiter ;
  37. """

流程控制

条件语句if

  1. delimiter //
  2. CREATE PROCEDURE proc_if ()
  3. BEGIN
  4.  
  5. declare i int default 0;
  6. if i = 1 THEN
  7. SELECT 1;
  8. ELSEIF i = 2 THEN
  9. SELECT 2;
  10. ELSE
  11. SELECT 7;
  12. END IF;
  13.  
  14. END //
  15. delimiter ;

循环语句while

  1. delimiter //
  2. CREATE PROCEDURE proc_while ()
  3. BEGIN
  4.  
  5. DECLARE num INT ;
  6. SET num = 0 ;
  7. WHILE num < 10 DO
  8. SELECT
  9. num ;
  10. SET num = num + 1 ;
  11. END WHILE ;
  12.  
  13. END //
  14. delimiter ;

索引

知识回顾:数据都是存在硬盘上的,查询数据不可避免的需要进行IO操作

索引在MySQL中也叫作"键",是存储引擎用于快速找到记录的一种数据结构。

  • primary key
  • unique key
  • index key

因为foregin key不是用来加速查询用的,所以不在我们的研究范围内,上面三种key中,前两种除了有加速查询的效果之外还有额外的约束条件(primary key:非空且唯一;unique key:唯一),而index key没有任何约束功能只会帮你加速查询。

索引本质就是一种数据结构,类似书的目录,意味着我们在查数据的时候应该先找目录再找数据,而不是用翻页的方式查询数据。

本质:都是通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的时间变成顺序的时间,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

索引的影响

  • 在表中有大量数据的前提下,创建索引速度会很慢
  • 在索引创建完毕后,对表的查询性能会大幅度提高,但是写的性能会降低

B+树

只有叶子节点存放真实数据,根和树枝节点存的仅仅是虚拟数据,查询次数由树的层级决定,层级越低次数越少。

我们知道一个磁盘的大小是一定的,也就是存放的数据量也是一定的,我们在每一个数据项内存放的数据越多那么分的层就越少,查询的速度也快,那么在一张表里,用什么字段建立的索引能够降低树的层级高度>>>主键id字段。

聚集索引(primary key)

聚集索引指的就是表的主键,innodb引擎规定一张表中必须要有主键。

我们回顾一下存储引擎建表,myisam在建表的时候有三个文件,而innodb在建表是有两个文件,frm文件只存放表结构,不能存放索引,也就是说innodb的索引跟数据都放在idb表数据文件中。

特点:叶子节点放一条条完整的记录

辅助索引(unique,index)

辅助索引:查询数据的时候不可能都是用id作为筛选条件,也可能会用name,password等字段信息,那么这个时候就无法利用聚集索引的加速查询效果。就需要给其它字段建立索引,这些索引就交辅助索引。

特点:叶子结点存放的是辅助索引对应的那条记录的主键的值

  1. select name from user where name='jason';
  2.  
  3. #上述语句叫覆盖索引:只在辅助索引的叶子节点中就已经找到了所有我们想要的数据
  4.  
  5. select age from user where name='jason';
  6.  
  7. #上述语句叫非覆盖索引,虽然查询的时候命中了索引字段name,但是要查的是age字段,所以#还需要利用主键才去查找

mysql视图、事务、触发器、索引的更多相关文章

  1. Mysql 视图&事务&触发器

    参考资料 一.视图 视图的含义: 视图是一个虚拟表,是从数据库中一个或者多个表中导出来的表. 1.创建视图 #语法:CREATE VIEW 视图名称 AS SQL语句 create view teac ...

  2. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

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

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

  4. mysql:视图、触发器、事务、存储、函数、流程控制

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...

  5. Mysql视图、触发器、事务、储存过程、函数

    一.视图 什么是视图 视图是有一张表或多张表的查询结果构成的一张虚拟表 为什么使用视图 当我们在使用多表查询时 我们的sql语句可能会非常的复杂,如果每次都编写一遍sql'的话无疑是一件麻烦的事情,这 ...

  6. SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  7. python开发mysql:视图、触发器、事务、存储过程、函数

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

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

    视图.触发器.事务.存储过程.函数   阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据 ...

  9. MySQL(视图、触发器、函数)

    day61 参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html 视图 视图:给某个查询语句设置别名,日后方便使用               ...

  10. MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

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

随机推荐

  1. if_while

    import random secret=random.randint(1,10) tmp=input("请输入一个数") guess=int(tmp) while guess!= ...

  2. 【hdu6613】Squrirrel 树形DP

    题意:给一个带权树,求把一条边的权值变成0,再选一个点做根,最大深度最小是多少. \(\sum n \le 10^6\) key:树形DP 题里有边权小于等于200,然而并没有什么用. 首先做出 \( ...

  3. js操作元素导致元素错位和大小改变

    使用js循环的方式批量控制元素的大小时结果往往不尽如人意. 我总结了一条规律 在一个循环体内不可以同时存在一下两种操作,否则容易导致元素错位或大小改变: 1.对元素的offsetWidth.offse ...

  4. 关于CSS中的字体尺寸设置 em rem

    常用单位 在CSS中可以用很多不同的方式来设定字体的尺寸.一般来说,这些单位被分成两大类:绝对单位(absolute)和相对单位(relative). 绝对单位在大多数情况下是相对于某些实际量度而言的 ...

  5. typescript-学习使用ts-2

    解构赋值 数组解构 let input = [1, 2]; let [first, second] = input; console.log(first); // outputs 1 console. ...

  6. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  7. Spring和MyBatis的集成

    Spring和MyBatis的整合   1. Spring和各个框架的整合 Spring目前是JavaWeb开发中最终的框架,提供一站式服务,可以其他各个框架整合集成 Spring整合方案 1.1.  ...

  8. LeetCode——542. 01 矩阵

    给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 0 0 ...

  9. cookbook of python for data analysis

    打算写讲义,目录已经想好. Content basic of python jupyter 开发环境 python 基本语法 利用python脚本完成工作 numpy for matrix compu ...

  10. @Retention注解 @Documented 注解 @Inherited 注解

    http://www.mamicode.com/info-detail-2153654.html