数据库篇-mysql详解( 六 )之视图与数据备份

数据库篇-mysql详解( 六 )之视图与数据备份_第1张图片
data.png

一 : 视图

视图: view, 是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟表, 虚拟表的结构来源不是自己定义, 而是从对应的基表中产生(视图的数据来源).

( 1 ) : 创建视图

基本语法
Create view 视图名字 as select语句; -- select语句可以是普通查询;可以是连接查询; 可以是联合查询; 可以是子查询.

创建单表视图

create view my_v1 as 
select * from my_student;

创建多表视图
视图表中有多表的情况下,字段不能重复

create view my_v3 as 
select * from my_student as s left join my_class c on s.c_id = c.id; -- id重复
ERROR 1060 (42S21): Duplicate column name 'id'

正确创建多表

create view my_v3 as 
select s.*,c.c_name,c.room from my_student as s 
left join my_class c 
on s.c_id = c.id;

( 2 ) : 查看视图

查看表结构

show create view my_v3\G
show create table my_v3\G
*************************** 1. row ***************************
                View: my_v3
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `my_v3` AS select `s`.`id` AS `id`,`s`.`number` AS `number`,`s`.`name` AS `name`,`s`.`sex` AS `sex`,`s`.`height` AS `height`,`s`.`c_id` AS `c_id`,`s`.`age` AS `age`,`c`.`c_name` AS `c_name`,`c`.`room` AS `room` from (`my_student` `s` left join `my_class` `c` on((`s`.`c_id` = `c`.`id`)))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

视图是一张虚拟表: 表, 表的所有查看方式都适用于视图: show tables [like]/desc 视图名字/show create table 视图名;

( 3 ) : 使用视图

使用视图主要是为了查询: 将视图当做表一样查询即可.
视图的执行: 其实本质就是执行封装的select语句.

( 5 ) : 修改视图

视图本身不可修改, 但是视图的来源是可以修改的.
修改视图: 修改视图本身的来源语句(select语句)

desc my_v1
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | 0       |       |
| number | char(10)    | YES  |     | NULL    |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| sex    | char(1)     | YES  |     | NULL    |       |
| height | int(11)     | YES  |     | NULL    |       |
| c_id   | int(11)     | YES  |     | NULL    |       |
| age    | tinyint(4)  | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
alter view my_v1 as
select id,name,age,sex,height,c_id from my_student;

修改后视图结构

+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   |     | 0       |       |
| name   | varchar(20) | YES  |     | NULL    |       |
| age    | tinyint(4)  | YES  |     | NULL    |       |
| sex    | char(1)     | YES  |     | NULL    |       |
| height | int(11)     | YES  |     | NULL    |       |
| c_id   | int(11)     | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
( 6 ) : 删除视图

Drop view 视图名字;

drop view my_v4;

视图的意义

  • 视图可以节省SQL语句: 将一条复杂的查询语句使用视图进行保存: 以后可以直接对视图进行操作
  • 数据安全: 视图操作是主要针对查询的, 如果对视图结构进行处理(删除), 不会影响基表数据(相对安全).
  • 视图往往是在大项目中使用, 而且是多系统使用: 可以对外提供有用的数据, 但是隐藏关键(无用)的数据: 数据安全
  • 视图可以对外提供友好型: 不同的视图提供不同的数据, 对外好像专门设计
  • 视图可以更好(容易)的进行权限控制

二 : 视图数据操作

视图是的确可以进行数据写操作的: 但是有很多限制
将数据直接在视图上进行操作.

( 1 )新增数据

数据新增就是直接对视图进行数据新增.
注意 :多表视图不能新增数据
可以向单表视图插入数据,但是视图中不包含的字段必须在基表中不能为空(或者没有默认值)字段
比如视图中不包含number字段,但是基础表中有该字段,视图没有提供数据,基础表使用默认数据,NULL,该字段不能为空,否则插入失败

select * from my_class;
+----+---------+------+
| id | c_name  | room |
+----+---------+------+
|  3 | PHP0710 | A203 |
|  4 | PHP0910 | C206 |
+----+---------+------+
insert into my_v2 values(2,'PHP0326','D306');

再次查看表

+----+---------+------+
| id | c_name  | room |
+----+---------+------+
|  2 | PHP0326 | D306 |
|  3 | PHP0710 | A203 |
|  4 | PHP0910 | C206 |
+----+---------+------+

( 2 )删除数据

多表视图不能删除

+----+-----------+--------+------+--------+------+------+---------+------+
| id | number    | name   | sex  | height | c_id | age  | c_name  | room |
+----+-----------+--------+------+--------+------+------+---------+------+
|  6 | class0006 | 琪琪   | 女   |    168 |    2 |   19 | PHP0326 | D306 |
|  7 | class0006 | 琪琪   | 女   |    168 |    2 |   24 | PHP0326 | D306 |
|  8 | class0006 | 琪琪   | 女   |    168 |    2 |   16 | PHP0326 | D306 |
|  1 | class0001 | 思思   | 男   |    184 |    3 |   16 | PHP0710 | A203 |
|  4 | class0004 | 美美   | 男   |    172 |    3 |   18 | PHP0710 | A203 |
|  5 | class0005 | 彩彩   | 男   |    166 |    3 |    7 | PHP0710 | A203 |
|  2 | class0002 | 可可   | 男   |    182 |    1 |   10 | NULL    | NULL |
|  3 | class0003 | 娜娜   | 女   |    156 |    1 |   19 | NULL    | NULL |
+----+-----------+--------+------+--------+------+------+---------+------+
The target table my_v3 of the DELETE is not updatable

单表视图可以删除数据

select * from my_v2;
+----+---------+------+
| id | c_name  | room |
+----+---------+------+
|  2 | PHP0326 | D306 |
|  3 | PHP0710 | A203 |
|  4 | PHP0910 | C206 |
+----+---------+------+
select * from my_class;
+----+---------+------+
| id | c_name  | room |
+----+---------+------+
|  2 | PHP0326 | D306 |
|  3 | PHP0710 | A203 |
|  4 | PHP0910 | C206 |
+----+---------+------+

删除视图数据

delete  from my_v2 where id = 4;
+----+---------+------+
| id | c_name  | room |
+----+---------+------+
|  2 | PHP0326 | D306 |
|  3 | PHP0710 | A203 |
+----+---------+------+
( 3 )更新数据

理论上不论单表视图还是多表示视图都可以更新数据.

select * from my_v3;
+----+-----------+--------+------+--------+------+------+---------+------+
| id | number    | name   | sex  | height | c_id | age  | c_name  | room |
+----+-----------+--------+------+--------+------+------+---------+------+
|  6 | class0006 | 琪琪   | 女   |    168 |    2 |   19 | PHP0326 | D306 |
|  7 | class0006 | 琪琪   | 女   |    168 |    2 |   24 | PHP0326 | D306 |
|  8 | class0006 | 琪琪   | 女   |    168 |    2 |   16 | PHP0326 | D306 |
|  1 | class0001 | 思思   | 男   |    184 |    3 |   16 | PHP0710 | A203 |
|  4 | class0004 | 美美   | 男   |    172 |    3 |   18 | PHP0710 | A203 |
|  5 | class0005 | 彩彩   | 男   |    166 |    3 |    7 | PHP0710 | A203 |
|  2 | class0002 | 可可   | 男   |    182 |    1 |   10 | NULL    | NULL |
|  3 | class0003 | 娜娜   | 女   |    156 |    1 |   19 | NULL    | NULL |
+----+-----------+--------+------+--------+------+------+---------+------+

暂时没更新成功,回头检查一下表结构

ERROR 1288 (HY000): The target table my_v3 of the UPDATE is not updatable

更新限制: with check option, 如果对视图在新增的时候,限定了某个字段有限制: 那么在对视图进行数据更新操作时,系统会进行验证: 要保证更新之后,数据依然可以被实体查询出来,否则不让更新.

create view my_v4 as 
    -> select * from my_student where age > 18 with check option;
mysql> update my_v4 set age = 17 where id = 7;
ERROR 1369 (HY000): CHECK OPTION failed 'web13.my_v4'

视图算法

视图算法: 系统对视图以及外部查询视图的Select语句的一种解析方式.

视图算法分为三种
  • Undefined: 未定义(默认的), 这不是一种实际使用算法, 是一种推卸责任的算法: 告诉系统,视图没有定义算法, 系统自己看着办
  • Temptable: 临时表算法: 系统应该先执行视图的select语句,后执行外部查询语句
  • Merge: 合并算法: 系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高: 常态)

视图算法选择: 如果视图的select语句中会包含一个查询子句(五子句), 而且很有可能顺序比外部的查询语句要靠后, 一定要使用算法temptable,其他情况可以不用指定(默认即可).

-- 指定算法为临时表
create algorithm=temptable view my_v6 as 
select * from my_student order by height desc;

二数据备份与还原

备份: 将当前已有的数据或者记录保留
备份: 将当前已有的数据或者记录保留
数据备份还原的方式有很多种:

  • 数据表备份
  • 单表数据备份
  • SQL备份
  • 增量备份
( 1 )数据表备份

不需要通过SQL来备份;直接进入到数据库文件夹赋值对应的表结构以及数据文件,以后还原的时候,直接将备份的内容放进去即可

数据表备份有前提条件 : 根据不同的存储引擎有不同区别

存储引擎: mysql进行数据存储的方式
主要是两种: innodbmyisam(免费)

数据库篇-mysql详解( 六 )之视图与数据备份_第2张图片
数据库引擎

创建一个张 myisam 表

-- 创建myisam表
create table my_myisam(
id int)charset utf8 engine = myisam;
mysql> select * from my_myisam;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
myisam 与 innodb数据存储方式

innodb : 在windows只有表结构只有表结构,数据全部存储到ibdata1文件中
myisam存储引擎 : 直接复制三个文件,然后直接放到对应的数据库下即可使用

数据库篇-mysql详解( 六 )之视图与数据备份_第3张图片
image.png

现在我们把这三文件复制到其他数据库,看看是否能查取成功
数据库篇-mysql详解( 六 )之视图与数据备份_第4张图片

观察结果,看来成功了

Database changed
mysql> show tables;
+---------------+
| Tables_in_gjp |
+---------------+
| gjp_zhangwu   |
| my_myisam     |
+---------------+
2 rows in set (0.00 sec)

mysql> select * from my_myisam;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+

/Users/a10.11.5/Desktop

( 2 )单表的数据备份

每次只能备份一张表;只能备份数据( 表结构不能备份 )
通常的使用 : 将表中的数据进行到处到文件
备份方式 : 从表中选出一部分数据保存到外部的文件中(outfile)

Select */字段列表 into outfile 文件所在路径 from 数据源; -- 前提: 外部文件不存在

select * into outfile '/Users/a10.11.5/Desktop/tz.txt' from gjp_zhangwu;

高级备份: 自己制定字段和行的处理方式
Select */字段列表 into outfile 文件所在路径 fields 字段处理 lines 行处理 from 数据源;
Fields: 字段处理
Enclosed by: 字段使用什么内容包裹, 默认是’’,空字符串
Terminated by: 字段以什么结束, 默认是”\t”, tab键
Escaped by: 特殊符号用什么方式处理,默认是’\’, 使用反斜杠转义
Lines: 行处理
Starting by: 每行以什么开始, 默认是’’,空字符串
Terminated by: 每行以什么结束,默认是”\r\n”,换行符

-- 指定备份处理方式
select * into outfile 'D:/server/temp/class1.txt'
-- 字段处理
fields 
enclosed by '"' -- 数据使用双引号包裹
terminated by '|' -- 使用竖线分隔字段数据
-- 行处理
lines
starting by 'START:'

from my_class;
数据还原

将一个在外部保存的数据重新恢复到表中(如果表结构不存在,那么sorry)
Load data infile 文件所在路径 into table 表名[(字段列表)] fields字段处理 lines 行处理; -- 怎么备份的怎么还原

-- 还原数据
load data infile 'D:/server/temp/class1.txt'
into table my_class
-- 字段处理
fields 
enclosed by '"' -- 数据使用双引号包裹
terminated by '|' -- 使用竖线分隔字段数据
-- 行处理
lines
starting by 'START:';
( 3 )SQL备份

备份的是SQL语句: 系统会对表结构以及数据进行处理,变成对应的SQL语句, 然后进行备份: 还原的时候只要执行SQL指令即可.(主要就是针对表结构)

备份: mysql没有提供备份指令: 需要利用mysql提供的软件: mysqldump.exe
Mysqldump.exe也是一种客户端,需要操作服务器: 必须连接认证
Mysqldump/mysqldump.exe -uxx-pxx 数据库名字 [数据表名字1[ 数据表名字2...]] > 外部文件目录(建议使用.sql)

单表备份

mysql  dump -uroot -proot mydatabase my_student > D:/server/temp/student.sql

数据库整库备份
Mysqldump/mysqldump.exe -hPup 数据库名字 > 外部文件目录

mysqldump -uroot -proot mydatabase > D:/server/temp/mydatabase.sql

SQL还原的方式
方式一 :

方案1: 使用mysql.exe客户端还原
Mysql.exe/mysql -hPup 数据库名字 < 备份文件目录
mysql -uroot -proot mydatabase < D:/server/temp/student.sql

方式二 :
Source 备份文件所在路径;

source D:/server/temp/student.sql;

SQL备份优缺点

  1. 优点: 可以备份结构
  2. 缺点: 会浪费空间(额外的增加SQL指令)

( 4 )增量备份

不是针对数据或者SQL指令进行备份: 是针对mysql服务器的日志文件进行备份

增量备份: 指定时间段开始进行备份., 备份数据不会重复, 而且所有的操作都会备份(大项目都用增量备份)

你可能感兴趣的:(数据库篇-mysql详解( 六 )之视图与数据备份)