一、视图

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

使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

create view course2teacher as select * from course inner join teacher on course.teacher_id = teacher.tid;  # 只有表结构,没有表数据,因为它的数据是基于其他表的。不建议使用,因为以后扩展sql语句的时候,视图也需要跟着修改。# 修改视图
alter view teacher_view as select * from course where cid>3;# 删除视图
drop view teacher_view-- 2.触发器  (一般不用,这个在应用程序级别能做,在应用程序级别能干的活还是去自己干好,以后扩展方便)

#准备表
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 //  # 定义sql语句的结束语
CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
BEGINIF NEW.success = 'no' THEN #等值判断只有一个等号INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必须加分号END IF ; #必须加分号
END //
delimiter ;  # 把结束符号还原回来 #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT cmd (USER,priv,cmd,sub_time,success
)
VALUES('egon','0755','ls -l /etc',NOW(),'yes'),('egon','0755','cat /etc/passwd',NOW(),'no'),('egon','0755','useradd xxx',NOW(),'no'),('egon','0755','ps aux',NOW(),'yes');# 删除触发器
drop trigger tri_after_insert_cmd;-- 3 存储过程# (1) 无参存储过程delimiter //create procedure p1()BEGINselect * from db7.teacher;END //delimiter ;# MySQL中调用call p1();# Python中调用cursor.callproc('p1')# (2) 有参存储过程。不但要指定是接收还是返回,还要指定类型delimiter //create procedure p2(in n1 int,in n2 int,out res int)BEGINselect * from db7.teacher where tid > n1 and tid < n2;set res = 1;END //delimiter ;# inout 可进可出 了解就行# MySQL中调用set @x=0call p2(2,4,@x);select @x;  # 查看返回值结果# Python中调用 cursor.callproc('p2',(2,4,0))  # @_p2_0=2,@_p2_1=4,@_p2_2=0cursor.excute('select @_p3_2')cursor.fetchall()## 应用程序和数据库结合使用### 方式一:MySQL:  编写存储过程python:调用存储过程### 方式二:Python:编写纯生SQLMySQL:什么都不用干### 方式三:Python:ORM --> 纯生SQL
MySQL:# 运行效率方式二高,开发效率方式三高(运行效率比方式二慢不了多少),我们主要是用方式三,偶尔用方式二,很少会去用方式一,除非一个人应用程序开发和DBA开发都很厉害。

二、事物

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);#原子操作
start transaction;
update user set balance=900 where name='wsb'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='ysb'; #卖家拿到90元
commit;#出现异常,回滚到初始状态
start transaction;
update user set balance=900 where name='wsb'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
rollback;
commit;

三、函数和流程控制

#1 准备表和记录
CREATE TABLE blog (id INT PRIMARY KEY auto_increment,NAME CHAR (32),sub_time datetime
);INSERT blog (NAME, sub_time)
VALUES('第1篇','2015-03-01 11:31:21'),('第2篇','2015-03-11 16:31:21'),('第3篇','2016-07-01 10:21:31'),('第4篇','2016-07-22 09:23:21'),('第5篇','2016-07-23 10:11:11'),('第6篇','2016-07-25 11:21:31'),('第7篇','2017-03-01 15:33:21'),('第8篇','2017-03-01 17:32:21'),('第9篇','2017-03-01 18:31:21');#2. 提取sub_time字段的值,按照格式后的结果即"年月"来分组select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

四、索引原理

#1. 准备表
create table s1(
id int,
name varchar(20),
gender char(6),
email varchar(50)
);#2. 创建存储过程,实现批量插入记录
delimiter $$ #
create procedure auto_insert1()
BEGINdeclare i int default 1;while (i<3000000) doinsert into s1 values(i,'egon','male',concat('egon',i,'@oldboy'));set i=i+1;end while;
END$$
delimiter ; #3. 查看存储过程
show create procedure auto_insert1\G #4. 调用存储过程
call auto_insert1();#无索引:mysql根本就不知道到底是否存在id等于333333333的记录,只能把数据表从头到尾扫描一遍,此时有多少个磁盘块就需要进行多少IO操作,所以查询速度很慢
mysql> select * from s1 where id=333333333;
Empty set (0.33 sec)# 创立索引前
select count(id) from s1 where id = 1000
row in set (0.80 sec)# 创立索引
create index idx_id on s1(id)
Query OK, 0 rows affected (2.63 sec)
Records: 0  Duplicates: 0  Warnings: 0# 创立索引后
select count(id) from s1 where id = 1000;
row in set (0.00 sec)

转载于:https://www.cnblogs.com/hexiaorui123/p/10440378.html

mysql-视图、事物等相关推荐

  1. mysql 视图 数据相加_MySQL

    查看安装路径 ps -ef|grep mysql 1,配置linux虚拟机,修改IP ????? vim /etc/sysconfig/network-scripts/ifcfg-eth0 2,配置完 ...

  2. 【数据库优化专题】MySQL视图优化(一)

    本期数据库优化专题分享,为大家带来的是DBA+社群MySQL领域原创专家--李海翔所著的MySQL视图优化系列文章.以下是第一部分的内容,未完部分敬请关注后续更新. 专家简介 李海翔 网名:那海蓝蓝 ...

  3. mysql视图登录_mysql视图

    mysql视图机制 什么是视图 视图是一张虚拟的表,为什么是虚拟呢?因为视图与数据库中存在的表不太一样,前面我们创建的4张表都是包含数据的, 如用户信息,订单信息等,而视图则是不包含数据的,下面通过一 ...

  4. mysql test 映射到实体_将MySql视图映射到JPA Entitites,使用哪个唯一...

    我不认为有一种标准方式,但这种方法似乎值得尝试. 想法是为视图动态生成唯一的"id"值(类似于rownum).来自Create a view with column num_row ...

  5. 1、MySQL视图是什么?

    MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中.行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的. 数据库中 ...

  6. mysql 视图操作和存储过程

    1.mysql 视图的操作是在新版本数据库才支持的,视图操作的好处是可以简化数据库的查询,特别是一些经常查询的数据表我们可以先创建一个视图,以后要在查询这个类式 的数据表时候,就可以直接查询该视图.这 ...

  7. MYSQL视图用户管理

    MYSQL视图 文章目录 MYSQL视图 1. 基本使用 2. 视图规则和限制 用户管理 1. 用户 2. 数据库的权限 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列 ...

  8. mysql 视图怎么调用方法_mysql 视图的使用

    mysql视图的作用(详细) 测试表:user有id,name,age,sex字段 测试表:goods有id,name,price字段 测试表:ug有id,userid,goodsid字段 视图的作用 ...

  9. mysql视图实现的_mysql视图是什么?怎么实现?

    mysql视图是什么?怎么实现? 发布时间:2020-05-21 18:00:24 来源:亿速云 阅读:152 作者:鸽子 视图本身是一张虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,获取的 ...

  10. mysql 视图 教程_MySQL视图简介及基本操作教程

    前言 视图是数据库系统中一种非常有用的数据库对象.MySQL 5.0 之后的版本添加了对视图的支持. 认识视图 视图是一个虚拟表,其内容由查询定义.同真实表一样,视图包含一系列带有名称的列和行数据,但 ...

最新文章

  1. R语言dir函数获取目录中文件或者文件夹名称实战
  2. 资产管理大佬讲述:如何用大数据及人工智能挑选基金?
  3. 带你认识清华标杆课教师 | 卓晴:自带BGM的硬核“技术流”教师
  4. navicat如何导入sql文件
  5. Date类+DateFormat
  6. Wordpress 提速之 Gzip 压缩
  7. Android之shape属性详解
  8. 你真的理解反向传播吗?面试必备
  9. 逻辑漏洞-支付风险-大疆某处支付逻辑漏洞可1元买无人机
  10. IDEA SpringBoot多模块项目搭建详细过程(转)
  11. java事件监听机制 概述
  12. Hadoop HDFS原理
  13. CocosCreater 发布apk接穿山甲广告SDK(一)
  14. SVN :找不到这样的主机
  15. ASM PCRP21-100-1-SSI-KAB5M
  16. 如何从零开始设计一款小程序原型?
  17. ibm 2011年服务器型号,IBM x 系列服务器CPU型号
  18. NIST 网络安全相关标准 美国 (简单整理)
  19. 音视频支持和音视频播放
  20. c 语言生成一个随机4位数,PLC如何产生一个随机数(含代码)

热门文章

  1. 51单片机auxr寄存器_MCS-51单片机有几个工作寄存器
  2. android服务下载,android服务之bindService和unService中下载任务中的应用
  3. Linux入门笔记——type、switch、help、man、apropos、whatis、info
  4. Win32ASM学习[9]: 标志寄存器
  5. LeetCode 18. 四数之和 思考分析(双指针解)
  6. C++---肿瘤面积
  7. Spyder打开报错解决办法
  8. tr闭包_嵌套函数及闭包
  9. hihoCoder 1227 2015 北京网络赛 A题
  10. android文本复制自定义剪切板,android 剪切板-文本复制、粘贴