1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同

视图的作用
1.简化sql语句的编写

2.限制可以查看的数据
可以使用权限来完成 权限某一个库 的某一个表 的某一个字段
例如:一张表存储了所有人的工资 但是每个员工只能看自己的工资信息 那就可以用视图来限制

视图的特点:
对于视图的增删改查 都会同步到原始表
每一次对视图的查询 本质上都是 执行了之前创建视图时 指定的sql语句

对于原始表的修改 也能在视图中查看到 前提是 你修改的数据 包含在创建视图时指定的sql语句中
select *from users where name = toms;

创建视图 语法
create [or replace] view view_name as sql语句;
修改
alter view view_name as sql语句;
删除
drop view view_name;

2.触发器 *** 是一段与某个表有关的mysql程序 当达到某种条件时,触发某个东西的执行

条件:
时间点 before | after
具体事件
update | delete | insert
new old old new

达到条件后:
自动执行一段mysql程序

作用:
做一个博客系统
需要在你执行更新时 自动记录更新时间 以及更新具体内容

python 是什么玩意儿? 第一次编辑
python 是什么玩意儿? 是一门编程语言 第一次编辑
总的来说就是 可以帮你在 一个表被修改时 做一些额外的操作

语法:
create trigger name after delete on tablename for each row
begin
# 具体要执行的操作
end

在触发器中有两个隐藏对象
new(新的数据) 和 old(旧的数据)
案例:
创建一个博客表
id title content commit_time
更新记录表
id content update_time b_id

创建触发器
在 blog表发生了update事件时 要自动将更新后的数据插入 记录表
# 重定义结束符为 // 因为触发器中包含; 而分号是默认的结束符

delimiter //
create trigger t1 after update on blog for each row
begin
insert into update_log values(null,new.content,now(),new.id);
end //
delimiter ;

select *from users //

案例2:
cmd表
存储的是 什么时间执行了 什么指令 结果是什么?
errlog 表 存储的是 所有执行失败的指令信息
当数据插入cmd表时 判断 如果 success 为no 就将这个信息插入errlog表中

delimiter ||
create trigger t3 after insert on cmd for each row
begin
select *from cmd;
if new.success = "no" then
insert into errlog values(null,new.cmd,now());
end if;
end ||
delimiter ;

# 触发器 不会影响原表的操作 只是增加一些额外的操作

注意: a 和 b b 有外键 关联a的主键 并且设置级联 删除 和更新 当删除a中的记录时 不会触发b表触发器

mysql 最想干的事情 就是 把与数据相关的所有逻辑代码全部放mysql中 这样应用程序的操作减少了

3.事务 ** 事务是逻辑上一组sql语句的集合 特点是:一个事务的所有sql语句 要么全部执行成功 要么全部失败

一个转账操作
从a账户 减去100
update account set money = money - 100 where name = "高根";
在给b账户 加上100
update account set money = money + 100 where name = "矮根";

使用案例
# 开启事务
start transaction;

# 一堆sql
update account set money = money - 100 where name = "高根";
update account set money = moneys + 100 where name = "矮根";

# 如果发生一些错误 可以回滚
rollback;
# 如果没有问题就提交 只有执行了提交操作 你的修改才会生效
commit;
# 一旦commit 就无法在回滚了

rollback 是全部撤销(回滚)
savepoint 可以创建保存点(游戏的存档) 可以选择性的回滚一部分

事务最强大的地方在于 当发生了一些不可控因素时(火山爆发,断电,系统崩溃,网络中断) 可以保证数据是完整的 (原子性)

事务的四个特征 原子性 一个事务是一个整体 不可拆分 要么都成功 要么都失败 一致性 一个事务无论成功或失败 相关数据的约束一定是完整的 隔离性 与效率息息相关 两个事务之间相互独立

事务四个级别的锁

read_uncommitted --不做任何隔离,可能脏读(读取到其他事务未提交的数据)

read_committed----可以防止脏读,不能防止不可重复读(并发修改),和幻读(并发添加和删除),

对于同一条记录 同一事务的两次查询结果不一致 称之为不可重复度
start transaction
select *from account where name = "张三"; # 有1000块
select *from account where name = "张三"; # 0
原因是:一个事务在查询数据 另一个在更新数据

幻觉
select count(*) from account; 本来有8个人
一段时间后
select count(*) from account; 本来有9个人

本质原因 : 一个事务在查询 另一个事务在添加/删除数据

# 可重复度
Repeatable_read --可以防止脏读,不可重复读(加锁保证 查询事务和更新事务不能并发),不能防止 幻读
insert/delete 和查询事务 可以并发执行

# 最严格的锁
Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低

永久性 一个事务一旦提交,就是永久性的 无法回滚

查看当前隔离级别

select @@tx_isolation;

设置新的隔离级别

set global transaction isolation level Serializable;

mysql主从复制 解决高并发问题

4.存储过程 * 一个存储过程中包含任意sql语句,以及流程控制,事务等等.... 简答的就说 将一系列较为复杂的逻辑封装到了mysql中 好处: 例如要是注册功能 接收用户名 密码 判断用户名是否存在 需要编写一条sql语句 传给服务器 服务器执行完毕返回结果 客户端在发起请求 把用户名 和密码传给服务器

经历了至少2次网络传输
如果使用存储过程 就可以一次性将用户名和密码传给服务器 等到接收结果即可
降低了网络传输 提高了效率

弊端: 学习成本高,运营成本高,沟通成本高 三高
正常开发中有三种常见方式完成数据库相关操作

1.应用程序开发者 只关注业务逻辑 数据相关的逻辑交给存储过程
优点: 优化了网络传输 耦合度降低
弊端:学习成本高,运营成本高,沟通成本高 三高 存储过程移植性非常差 每种数据语法都不同

2.应用程序开发者 不仅关注业务逻辑 还需要编写原生的sql语句
优点: 一个人负责所有 没有沟通成本
缺点: sql语句编写繁琐 导致开发效率降低

3.应用程序开发者 仅关注业务逻辑 把sql语句相关的交给ORM(对象关系映射 帮你封装了增删改查 自动生成sql语句)
优点: 开发效率提高了
缺点: 执行效率较低

1.创建存储过程
create procedure p1(type 参数名 数据类型)

type: in输入参数 out输出参数 inout既能输出又能输入

需求 编写一个存储过程 查询 account 表 可以指定 工资的区间范围
select *from account where money >= a and money <= b;

delimiter //
create procedure p1(in a double,in b double)
begin
select *from account where money >= a and money <= b;
end//
delimiter ;

存储过程 与函数的区别
函数仅仅是一个单纯工具 与数据无关 所以函数中不能出现sql语句
存储过程 既可以包含mysql的逻辑代码 也能包含sql语句

delimiter //
create procedure p2(in a double,in b double,out res char(20))
begin
select *from account where money >= a and money <= b;
set res = "success";
end//
delimiter ;

# 输出参数 必须是一个变量  用@定义变量

mysql 视图 触发器 事物 存储过程 函数 流程控制的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. mysql视图 触发器 事物 函数 存储过程

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

  7. MySQL_视图/触发器/事务/存储过程/函数

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

  8. MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制

    SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...

  9. mysql 视图 触发器 存储过程 函数事务 索引

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

随机推荐

  1. Innobackupex(xtrabackup)物理备份

    1. Percona XtraBackup介绍 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个完全开源的用于 MySQL 数据库物理热备的备份工具,在备份过程中不 ...

  2. 【译】第七篇 SQL Server安全跨数据库所有权链接

    本篇文章是SQL Server安全系列的第七篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  3. GitHub贡献第一的公司是谁?微软开源软件列表

    参考:http://www.infoq.com/cn/news/2017/03/GitHub-first-Microsoft-open-sour 提起微软公司,不少人第一反应是老牌巨头专注于私有化软件 ...

  4. A - Brackets POJ - 2955 (区间DP模板题)

    题目链接:https://cn.vjudge.net/contest/276243#problem/A 题目大意:给你一个字符串,让你求出字符串的最长匹配子串. 具体思路:三个for循环暴力,对于一个 ...

  5. HttpClient和HttpURLConnection的使用和区别

    https://www.cnblogs.com/liushuibufu/p/4140913.html 功能用法对比 从功能上对比,HttpURLConnection比HttpClient库要丰富很多, ...

  6. Mysql多实例安装笔记

    参考: 系统:KaliLinux (x86_64) 软件下载 1.下载地址: 2.选择5.6版本 安装 1.准备文件和目录 tar -zxvf mysql-5.6.40-linux-glibc2.12 ...

  7. 设置LISTControl控件某一行的背景和文字颜色

    定义宏 用listcontrol的SetItemData设置某一行的属性,通过自定义属性标识实现. 自定义某行内容颜色属性: #define COLOR_DEFAULT 0 //默认颜色 #defin ...

  8. async_mongo_helper

    # -*- coding: utf-8 -*- # @Time : 2019/1/7 2:11 PM # @Author : cxa # @File : motortesdt.py # @Softwa ...

  9. ES--05

    第四十一讲!分词器内部组成 内置分词器 课程大纲 1.什么是分词器 切分词语,normalization(提升recall召回率) 给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单 ...

  10. PHP IDE选择标准

    2017年11月17日09:35:01 这里记录一下PHP IDE的选择标准 1.  是否有错误提示, 对于一些 `缺少分号`, `花括号不配对`, `变量未定义就使用`等待的提示是要有的 2. 代码 ...