0.学习准备
- 学习资料
参考书籍《深入浅出MySQL数据库开发、优化与管理维护》
参考视频《传智播客MySQL》 - 构建新表:
CREATE TABLE m_stu1 LIKE te_stu3; -- 蠕虫复制 INSERT INTO m_stu1 SELECT * FROM te_stu3; CREATE TABLE m_class1 LIKE te_class1; INSERT INTO m_class1 SELECT * FROM te_class1; ALTER TABLE m_class1 CHANGE classid id INT auto_increment NOT NULL;
1.视图基本操作
1)视图的创建:
- 视图简介:
view:是一种有结构(仅有表结构)没结果(结构中不存在数据)的虚拟表。
虚拟表的结果来源不是自己定义,而是从对应的基表中产生(视图的数据来源) - 创建视图基本语法:
as不能省略,相当于给后面的select语句结果起了个别名。Create View 视图名字 as select语句;
select语句可以是:普通,连接,联合或子查询。 - 创建单表视图:基表来源只有一个表
CREATE VIEW v1 AS SELECT * FROM m_stu1; CREATE VIEW v2 AS SELECT * FROM m_class1;
- 创建多表视图:基表来源不止一个表
但是创建失败,提示错误CREATE VIEW v3 AS SELECT * FROM m_stu1 AS s LEFT JOIN m_class1 AS c ON s.classid=c.id;
[Err] 1060 - Duplicate column name 'id'
,说明id重复,修改创建代码如下:CREATE VIEW v3 AS SELECT s.*,c.cla_name FROM m_stu1 AS s LEFT JOIN m_class1 AS c ON s.classid=c.id;
基表有多张时字段不能重复。
2)视图的查看:
- 查看视图的结果。
- 视图是张虚拟表,表的所有查看方式都适用于视图:
show tables [like]
/desc 视图名
/show create table 视图名
- 视图与表几乎相同,和表有一个关键字的区别:view
查看视图的创建语句时也可以使用:show create view 视图名;
- 视图一旦创建,系统会在视图对应的数据库文件夹下创建一个对应的结果文件:frm文件。
- 视图不会影响基表的存在,也不会影响基表的数据。
3)使用视图:
- 使用视图主要是为了查询,将视图当做表查询即可。
视图可以查询数据,但是视图本身并没有数据。 - 简单的查询:
- 视图的执行本质就是执行了封装的select语句。
相当于Java中的封装方法,代码的复用。
4)修改视图:
- 视图本身不可修改,但是视图本身的来源是可以修改的。
修改视图就是修改视图本身的来源语句(select语句)。 - 修改语法:
如:Alter view 视图名字 as 新的select语句;
ALTER VIEW v1 AS SELECT id,name,age,sex FROM m_stu1;
5)删除视图:
- 语法:
drop view 视图名字;
- 视图的删除只能用view,不能用
drop table
。
视图理论上可以随意删(最好别删)。但是表不能随意删。
6)视图的意义:
- 视图可以节省SQL语句,将一条复杂的SQL语句使用视图进行保存,以后可以直接对视图进行操作。
- 数据安全,视图操作是主要针对查询的,对视图结果进行进行处理(删除),不会影响基表数据(相对安全)。
- 视图往往在大项目中使用,而是在多系统中使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据:数据安全。
- 视图可以对外提供友好性:不同的视图提供不同的数据,对外好像专门设计的。
- 视图可以更好(更容易)进行权限控制。
2.视图的数据操作
视图是可以对数据进行操作的,但是有很多限制。
将数据直接在视图上进行操作。
1)新增数据:
- 数据新增就是直接对视图进行进行数据新增:
- 多表视图不能数据新增。
- 可以向单表中插入数据,但是视图中包含的字段必须包含基表中所有不能为空(或有默认值)的字段。
- 测试:
往多表插入:
往单表视图插入数据(不包含不能为空的code字段):INSERT INTO v3 VALUES(11,'0000000011','学生11',20,175,'男',3,'班级三');
INSERT INTO v1 VALUES(11,'学生11',20,'男');
说明视图是可以向基表插入数据的。 - 修改v1的视图结构并插入:
ALTER VIEW v1 AS SELECT * FROM m_stu1; INSERT INTO v1 VALUES(11,'0000000011','学生11',20,175,'男',3);
2)删除数据:
- 多表视图不能删除数据(连接)。
单表视图可以删除数据。 - 测试:
多表视图删除数据:
单表视图删除数据:DELETE FROM v3 WHERE id=11;
DELETE FROM v1 WHERE id=11;
- 视图可以操作数据,但是一般情况下不允许操作。
3)更新数据:
- 理论上不论单表视图或者多表视图都可以更新数据库。
但是我的Mysql版本不能修改多表视图(可能某个版本之后不能修改了)
单表更新:
会发现原表的数据也一起修改了。UPDATE v1 SET Height=178 WHERE id=5;
- 更新限制:
with check option
,如果在新增的时候限定了某个字段有限制,那么在对视图进行数据更新操作时数据会进行验证:
保证更新之后该字段的数据依然可以被视图查询出来,否则不让更新。 - 限制测试:
创建限制视图:CREATE VIEW v4 AS SELECT * FROM m_stu1 WHERE age>25 WITH CHECK OPTION;
WITH CHECK OPTION
限制视图更新时不能将已经得到的数据(age>25)的改为年龄小于25。UPDATE V4 SET age=24 WHERE id=6;
可以修改数据为视图可以查到的。
也可以修改视图中没有的数据让视图可以查看的:UPDATE V4 SET age=26 WHERE id=6;
只能操作看到的数据。-- 可以操作,但是无效果 UPDATE V4 SET age=26 WHERE id=5;
4)视图算法:
- 需求:
查询每个班身高最高的学生。(使用视图解决)
原来的方法:
错误的修改方法:SELECT * FROM (SELECT * FROM m_stu1 ORDER BY Height DESC) as stu GROUP BY classid;
这条方法的执行结果与CREATE VIEW v5 AS SELECT * FROM m_stu1 ORDER BY Height DESC; SELECT * FROM v5 GROUP BY classid;
效果是一样的:SELECT * FROM m_stu1 GROUP BY classid ORDER BY Height DESC;
这时候就需要视图算法了。 - 视图算法
系统对视图以及外部查询视图的select语句的一种解析方式。 - 视图算法分类:
分为三种:- Unserfined:未定义,默认的,不是一种实际使用的算法,告诉系统没有定义算法,让系统自己选择下列的算法:
Temptable
:临时表算法,表示系统应该先执行视图的select语句,后执行外部的查询语句。Merge
:上面使用的算法,合并算法,系统先将视图对应的selec语句与外部查询视图的select语句合并,然后再执行。(效率高,但有时不准确),系统经常选择merge。
- 算法指定,在创建视图时使用
algorithm
指定:
运行结果:CREATE ALGORITHM=TEMPTABLE VIEW v6 AS SELECT * FROM m_stu1 ORDER BY Height DESC; SELECT * FROM v6 GROUP BY classid;
- 视图的算法选择:
如果select语句包含查询子句(五子句:where等),且顺序比外部的子句靠后,则一定得选择Temptable。
其他情况下选择默认或Merge。
3.数据备份
备份简介及存储引擎
1)备份还原简介:
- 备份:将当前已有的数据或者记录保留
还原:将已保留的数据恢复到对应的表中 - 为什么要备份还原(必要性):
- 防止数据丢失,被盗,误操作等;
- 保护数据记录。
- 数据备份还原的操作:
数据表备份,单表数据备份,SQL备份,增量备份。
2)存储引擎概述:
- 详情见MySQL学习笔记(三)
一般只有Myisam和InnoDB是免费的。 - 对比Myisam和InnoDB的数据存储方式:
- InnoDB:只有表结构,数据全部存储到ibdata1文件中。(.ibd)
- Myisam:表,数据,索引全都单独存储
文件备份与单表备份
1)数据表(文件)备份:
- 不需要通过SQL来备份:
直接进入到数据库文件夹,复制对应的表结构以及数据文件。以后还原的时候直接将备份的内容放进去即可。 - 数据表(文件)备份只要复制对应的结构与数据文件即可。
直接复制文件到其他数据库下即可。
(老版本的InnoDB不能这样备份,因为.ibd文件不是分离的)
2)单表数据备份:
- 每次只能备份一张表,只能备份数据(表结构不能备份)。
- 通常的使用:将表中的数据进行到导出到文件(一般是使用)。
- 备份:从表中选出一部分数据保存到外部的文件中(outfile):
语法:
前提:外部文件不存在。select */字段列表 into outfile 文件路径 from 数据表;
测设备份(备份学生表到D:\mysql\dump目录):
打开目录下的SELECT * INTO OUTFILE 'D:/mysql/dump/m_stu1.txt' FROM m_stu1;
m_stu1.txt
,查看结果如下:
不要用记事本打开,否则编码改变数据会丢失。
注意要备份哪个数据库的表就要进入到哪个数据库环境下操作(user database
)。
3)单表数据高级备份:
- 可以自己指定一些字段和行的处理方式:
select */字段列表 into outfile 文件路径 fields 字段处理 lines 行处理 from 数据表;
- 参数说明:
- fields 字段处理:
Enclosed by
:字段使用什么内容包裹,默认是控字符串Terminated by
:字段以什么结束,默认’\r’,tab键Escaped by
:特殊符号用什么方式处理,默认是使用反斜杠转义 - lines 行处理:
starting by
:每行以什么开始,默认是空字符串Terminated by
:每行以什么结束,默认’/r /n’换行符
- fields 字段处理:
- 测试,指定备份方式:
查看备份结果:-- 高级单表备份: SELECT * INTO OUTFILE 'D:/mysql/dump/m_stu2.txt' -- 字段处理方式 FIELDS ENCLOSED BY '"' -- 使用双引号包裹 TERMINATED BY '|' -- 使用竖线分隔数据 -- 行处理 LINES STARTING BY 'start:' FROM m_stu1;
4)单表数据还原:
- 还原:
讲一个在外部保存的数据重新恢复到表中
单表还原前提:
表结构一定要存在。 - 语法:
Load data infile 文件所在的路径 into table 表名(字段列表) fileds 字段处理 lines 行处理;
- 测试:
测试结果:-- 模拟误删 DELETE FROM m_stu1; -- 单表备份还原 LOAD DATA INFILE 'D:/mysql/dump/m_stu2.txt' INTO TABLE m_stu1 -- 字段处理方式 FIELDS ENCLOSED BY '"' -- 使用双引号包裹 TERMINATED BY '|' -- 使用竖线分隔数据 -- 行处理 LINES STARTING BY 'start:';
4.数据备份(SQL备份与增量备份)
SQL备份
1)简介:
最常用的备份方式,备份的是SQL语句,系统会对表结构以及数据进行处理,变成对应的SQL语句再进行备份。
还原只需要执行SQL语句即可(主要是针对表结构)。
- SQL备份:MySQL没有提供备份指令,需要利用mysql提供的软件:mysqldump.exe(在mysql的bin目录下可以找到)
2)mysqldump.exe使用:
- mysqldump.exe也是一种客户端,想要操作服务器,必须要认证。
mysqldump[.exe] -hPup 数据库名字 [数据表名字1..][数据表名字2..] > 外部文件目录(.sql结尾)
- 备份我的m_stu1到
D:/mysql/dump/m_stu3.sql
:
备份成功:mysqldump -uroot -p test02 m_stu1 > D:/mysql/dump/m_stu3.sql
但是会提示你这样是不安全的,但是只能这样操作(以我目前的认知)。
还原的时候会先把原表删除后再创建添加。 - 备份test02数据库:
时间会比较长,就不测试了。注意需要使用exit或quit退出mysql环境先。mysqldump -uroot -p test02 > D:/mysql/dump/test02.sql
3)还原两种方式:
- 两种方式(单表与多表无区别):
- 1.使用
mysql.exe
客户端还原:
指定的数据库可以是别的数据库。mysql[.exe] -hPup 数据库名字 < 备份文件目录
- 2.使用SQL指令还原
Source
:Source 备份文件所在目录
- 1.使用
- 测试客户端方式还原:
测试结果:mysql -uroot -p test02 < D:/mysql/dump/m_stu3.sql
也需要退出mysql环境才可以操作。 - 测试SQL指令还原方式(需在数据库环境下):
DROP TABLE m_stu1; source D:/mysql/dump/m_stu3.sql;
4)SQL备份优缺点:
优点:
- 可以备份表结构和数据,操作方便
缺点:
- 会浪费空间,备份会额外增加很多sql指令
- 备份时间较长(一定要整表备份)
增量备份
- 简介:
比较麻烦,视频中未详细介绍。
不是针对数据或者SQL指令进行备份,而是针对mysql服务器的日志文件进行备份。 - 特点:
可以指定时间段进行备份,备份数据不会重复,而且所有的操作都会备份。
大项目一般都用增量备份。(还原数据精确) - 更多备份操作以后看书再写。
5.事务(手动控制)
1)事务介绍:
- 适用情景:
有一张银行账户表,A向B转账,A账户钱先减少,B用户钱后增加,但是A操作完之后断电了。A的钱减少了,但是B的钱没用增加。
解决方案:
A减少钱,但是不立即修改数据表,B收到钱之后,同时修改数据表。
而负责这样做的一种机制—-事务安全 - 简介:
事务(transaction):一系列要发生的连续的操作。
事务安全:一种保护连续操作同时满足(实现)的一种机制。 - 事务安全的意义:
保证数据操作的完整性。 - 数据库准备:
创建表并插入数据:
模拟张三给李四转1000元(数据减少):-- 创建表 CREATE TABLE m_account( id INT PRIMARY KEY auto_increment, number CHAR(16) NOT NULL UNIQUE COMMENT '账户', name VARCHAR(20) NOT NULL, money DECIMAL(10,2) DEFAULT 0.0 COMMENT '账户余额' )charset utf8; -- 插入数据 INSERT INTO m_account VALUES(null,'0000000000000001','张三',1000),(null,'0000000000000002','李四',2000);
此时张三钱减少了,李四未收到钱,若这时退出了就会出现和刚开始的情况。-- 模拟扣钱 UPDATE m_account SET money=money-1000 WHERE id =1;
- 事务操作的分类(两种):
自动事务(默认的),手动事务
2)手动事务:
- 开启事务:告诉系统以下所有的操作(写)不要直接写入到数据表,先存放到事务日志,data目录下的ib_log.file就是日志文件。
开启事务的命令:
测试代码:Start transaction
在一个窗口运行,并打开另一个窗口查看数据:-- 开启事务 START TRANSACTION; -- 模拟李四借钱给张三,李四钱减少 UPDATE m_account SET money=money-1000 WHERE id =2; -- 张三得到钱 UPDATE m_account SET money=money+1000 WHERE id =1;
表并没有修改。(使用同一个窗口会看见修改但是实际并未修改) - 关闭事务:选择性的将日子文件中的结果保存到数据表(同步)或者说直接清空事务。
- 提交事务:同步数据表(操作成功)
COMMIT;
- 回滚事务:直接清空日志表
rollback;
- 提交事务:同步数据表(操作成功)
- 测试:
提交事务后再通过其他窗口查看:
已经修改了。此时再rollback已经没有意义了。 - 事务要么提交,要么全部擦除。
- 免费的存储引擎只有InnoDB支持事务。
6.事务(原理及回滚点)
1)事务原理:
- 事务开启后,所有的操作都会临时保存到事务日志,事务日志只有在得到commit指令才会同步到数据表,其他任何情况都会被清空(rollback,断开连接,断电)
- 原理图:
2)回滚点:
- 在某一个成功的操作完成之后,后续的操作有可能成功也可能失败,不管成功还是失败,前面的操作都已经成功,可以在当前成功的位置设置一个点,可以供后续失败操作返回到该位置,而不是返回所有操作。这个点称为回滚点。
在事务步骤很多的情况下经常用。 - 语法
测试结果:-- 开启事务 START TRANSACTION; -- 张三发工资 UPDATE m_account SET money=money+10000 WHERE id =1; -- 设置回滚点 SAVEPOINT sp1; -- 银行扣税 UPDATE m_account SET money=money-10000*0.05 WHERE id =1; -- 回到回滚点 ROLLBACK TO sp1; -- 继续操作 UPDATE m_account SET money=money-10000*0.05 WHERE id =1; -- 查询结果 SELECT * FROM m_account;
7.事务(自动事务及事务特性)
1)自动事务:
- 在mysql中默认的都是自动事务处理,用户操作完会立即同步到数据表中。
- 自动事务的控制:
autocommit
变量
关闭事务:show vairiables like 'autocommit'
测试结果:set autocommit=off/0;
自动关闭后需要手动来选择处理:commit/rollback
- 通常都会使用自动事务。
开启事务:set autocommit=on/1;
2)事务的特性:
- 事务有四大特性:ACID
A:Atomatic,原子性,事务的整个操作是一个整体,不可分割,要么全部成功,要么全部失败。
C:Consistency,一致性,事务操作前后,表中的数据没有变化。
I:Isolation,隔离性,事务操作是相互隔离不受影响的。
D:Durability,持久性,数据一旦提交,不可改变,永久改变数据表数据。 - 锁机制:
InnoDB,默认是行锁,但是如果在事务过程中,没有用到索引,那么系统会自动全表检索,自动省纪委表锁。
行锁:只有当前行被锁住,别的用户不能操作。
标锁:整张表被锁住,别的用户都不能碰。 - 何时使用事务:和钱有关的操作会用手动事务。
其余时候都是自动事务。
3)事务的操作时数据的操作:
删除数据表等针对结构的操作不可逆。
最后更新: 2018年03月26日 16:13
原始链接: https://zjxkenshine.github.io/2018/03/24/MySQL数据库学习笔记(六)/