Mysql 学习 05

回顾:

连接查询: 多张表连接到一起, 不管记录数如何,字段数一定会增加
分类: 内连接, 外连接, 自然连接 和 交叉连接.
交叉连接: cross join (笛卡尔积).
内连接: inner join, 左右两张表中有连接条件匹配 (不匹配的忽略),
外连接: outer [left/right] join 主表有的记录一定会存在, 匹配了就保留副表字段数据,没匹配到副表字段置空.
自然连接: natural join , 自动匹配条件 (相同的字段名.). using 关键字.

外键:

外键: foreign key: 外面的键 (键不在自己的表中),: 如果一张表中有一个字段 (非主键)指向另外一张表的主键, 难么将该字段称之为外键.

增加外键:

外键可以在创建表的时候 或者 在创建表之后增加 (但是要考虑数据的约束问题):
一张表可以有多个外键.

方案1: 创建表的时候增加外键: 在所有的表字段之后, 使用 foreign key (外键字段) references 外部表 (主键字段)
这里写图片描述

方案2: 在新增表之后增加外键: 修改表结构
Alter table 表名 add[constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
这里写图片描述

修改外键 & 删除外键:

外键不可修改, 只能先删除后新增.

删除外键语法
Alter table 表名 drop foreign key(字段名) 外键名; – 一张表中可以有多个外键,名字不同
这里写图片描述

外键作用:

外键默认的作用有两点: 一个对 父表, 一个对子表 (外键字段所在的表)

对子表的约束: 子表数据进行写操作(增 和 改)的时候,如果对应的外键字段在父表找不到对应的匹配:
那么操作会失败 (约束子表数据操作).
这里写图片描述

对父表的约束: 父表数据进行写操作 (删 和 改: 都必须涉及到主键本身); 如果对应的主键在子表中已经被数据引用, 那么就不允许操作 (删 和 改失败).

这里写图片描述

扫描二维码关注公众号,回复: 3393118 查看本文章

外键的条件:

1.外键要存在: 首先必须要保证表的存储引擎是 innodb (默认的存储引擎): 如果不是innodb 存储引擎, 那么外键可以创建成功, 但是没有约束效果.
2. 外键字段的字段类型 (列类型)必须与父表的主键类型完全一致.
3.一张表中的外键名字不能重复,
4.增加外键的字段 (数据已经存在), 必须保证数据与父表主键要求对应.
这里写图片描述

外键约束:

所谓的外键约束: 就是指外键的作用
之前所讲的外键的作用: 都是默认的作用; 其实可以通过对外键的需求, 进行定制操作.

外键的约束有三种约束模式: 都是对父表的约束.
1.District: 严格模式: (默认的),表示父表不能删除或者更新一个已经被子表数据引用的记录.
2.Cascade: 级联模式: 父表的操作对应子表关联的数据也跟着操作.
3.Set null: 置空模式: 父表的操作之后, 子表对应的数据 (外键字段) 被置空.

通常的一个合理的做法(约束模式): 删除的时候 子表置空, 更新的时候子表级联操作.
指定模式的语法
Foreign key(外键字段) references 父表(主键字段) on delete set null on update cascade;
这里写图片描述
这里写图片描述
更行操作: 级联更新:
这里写图片描述
删除操作: 置空
这里写图片描述

删除置空的前提条件: 外键字段允许为空. (如果不满足条件, 外键无法创建).

外键虽然很强大, 能够进行各种约束.

联合查询:

联合查询: 将多次查询 (多条select 语句), 在记录上进行拼接 (字段不会增加)
基本语法:
多条select 语句 构成: 每一条 select 语句 获取的字段数必须严格一致 (但是字段类型无关).

Select 语句1
Union [union 选项]
Select 语句2 ……..

Union 选项: 与 select 选项 一样有两个
All: 保留所有 (不管重复)
Distinct: 去重 (整个重复): 默认 distinct.
这里写图片描述

联合查询只要求字段一样, 跟数据类型无关. (保留第一张表的字段)
这里写图片描述

联合查询意义:

联合查询的意义分为两种:
1.查询同一张表, 但是需求不同: 如查询学生信息, 男生身高升序, 女生升高降序.
2.多表查询: 重点内容多张表的结构完全是一样的, 保存的数据(结构)也是一样的.
Order by 的使用:
在联合查询中: order by 不能直接使用, 需要对查询语句使用括号才行.

这里写图片描述

若要 order by 生效: 不许搭配 limit 使用限定的最大数即可.
这里写图片描述

子查询:

子查询: sub query: 查询实在某一个查询结果之上进行的 (一条select 语句内部包含另外一条select语句).

子查询的分类:

子查询有两种分类方式: 按位置分类; 按结果分类

1.按位置分类: 子查询(select 语句) 在外部查询 (select 语句)中出现的位置.
From 子查询: 子查询跟在from 关键字之后
Where子查询:子查询出现在 where 条件中

     Exists 子查询: 子查询出现在 exists 里面.

2.按结果分类: 根据子查询得到的数据进行分类 (理论上讲任何一个查询得到的结果都可以理解为二维表)
标量子查询: 子查询得到的结果是一行一列,
列子查询: 子查询得到的结果是一列 多行.
行子查询: 子查询得到的结果是多列一行 (多行多列)
上面几个出现的位置都是在 where 之后
表子查询: 子查询得到的结果是多行多列
(出现的位置是在 from 之后).

标量子查询:

需求: 知道班级名字为 java0001, 想获取该班的所有学生.
1.确定数据源: 获取所有的学生.
Select * from my_student where c_id =?;
2.获取班级 ID: 可通过班级名字确定
Select id from my_class where c_name = ‘java0001’; – id (即: my_class中的id) 一定只有一个值 (一行一列).

标量子查询实现:
这里写图片描述

列子查询:

需求: 查询所有在读班级的学生 (班级表中存在的班级)
1.确定数据源: 学生
Select * from my_student where c_id in (?);;
2.确定有效班级的id: 所有班级 id;
Select id from my_class;
列子查询:
这里写图片描述

列子查询返回的结果会比较多: 一列多行, 需要使用 in 作为条件匹配: 其实在mysql 中还有几个类似条件: all, some, any.

1>=Any === in; !=any: 不等于其中任意一个即成立, (即: 有任意一个不等于就为成立, 所以查询的是所有结果, null除外)
2>Any === some; – any 跟some 是一样. !=some: 不等于其中的某一个即成立 (即: 有一些不等于 就成立, 所以查询的是所有结果, null除外.)
3>=All === 为全部: !=all: 不等于所有的即成立 (即:只要条件语句中有一个与其相等就不成立, 所以一般查询结果为空).

肯定结果:
这里写图片描述

否定结果:

这里写图片描述

行子查询:

行子查询: 返回的结果可以是多行多列 (一行多列).

需求: 要求查出整个学生中, 年龄最大且 身高是最高的学生.
1.确定数据源:
Select * from my_student where age =? and height = ?;
2.确定最大的年龄 和最高的身高;
Select max(age),max(height) from my_student;

行子查询: 需要构造行元素 行元素由多个字段构成.
这里写图片描述

表子查询:

表子查询: 子查询返回的结果是多行多列的二维表: 子查询返回的结果是当做二维表来使用.

需求: 找出每个班中最高的一个学生.

1.确定数据源: 先将学生按照身高进行降序排序
Select * from my_student order by height desc;
2.从每个班选出第一个学生.
Select * from my_student group by c_id; – 每个班选出第一个学生.

表子查询: from 子查询: 得到的结果作为 from 的数据源.

这里写图片描述

Exists子查询:

Exists: 是否存在的意思: exists 子查询就是用来判断某些条件是否满足 (跨表), exists是接在 where 之后: exists 返回的结果之后 0 和 1 这两种结果.

需求: 查询所有的学生: 前提是 班级存在
1.确定数据源
Select * from my_student where ?;
2.确定条件是否满足?
Exists (select * from my_class); – 是否成立

Exists 子查询:
这里写图片描述

视图:

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

创建视图:

基本语法:
Create view 视图名字 as select语句; – select语句也可以是其他查询方式.

创建一个单表视图: 基表只有一个
创建一个多表视图: 基表至少两个
这里写图片描述

查看视图:

查看视图: 查看视图的结构:
视图是一张虚拟表: 表, 意味着表的所有查看方式都适合于视图: show tables [like]/desc 视图名字 /show create table 视图名;
这里写图片描述

视图比表还是有一个关键字的区别: view: 查看 “表(视图)”的创建语句的时候可以使用view关键字.

这里写图片描述

视图一旦创建: 系统会在视图对应的数据库文件夹下创建一个对应的 结构文件: frm文件.
这里写图片描述

使用视图:

使用视图主要是为了查询: 将视图当做表一样查询即可.
这里写图片描述

视图的执行:其实本质就是执行封装的 select 语句. (有时候 select 语句会长到 两三页,但是当你创建成视图后, 直接查询视图,这样就比每次都写复杂的 select 语句要简单省事儿好多). [select 语句的封装].

修改视图

视图本身不可修改,但是视图的来源是可以修改的.

**修改视图: 修改视图本身的来源语句 (select 语句).
Alter view 视图名字 as 新的select语句;
这里写图片描述

删除视图:

Drop view 视图名字;
这里写图片描述

视图意义:

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

视图数据操作:

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

新增数据:

数据新增就是直接对视图进行数据新增.
1.多表视图不能插入数据.
2.可以向单表视图插入数据: 但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值的字段).

这里写图片描述

3.视图是可以向基表中插入数据的.
这里写图片描述

删除数据:

多表视图不能删除数据:
单表视图数据删除:
这里写图片描述

更新数据:

更新数据:理论上无论单表视图还是多表视图都可以跟新数据.
这里写图片描述

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

这里写图片描述

视图算法:

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

算法指定: 在创建视图的时候
Create algorithm = 指定算法 view 视图名字 as select 语句;
这里写图片描述

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

数据备份与还原:

备份: 将当前已有的数据或者记录保留
还原: 将已保留的数据恢复到对应的表中

为什么要做备份还原?
1.防止数据丢失: 被盗, 误操作,
2.保护数据记录:

数据备份还原的方式有很多种: 数据表备份, 单表数据备份, sql备份, 增量备份.

数据表备份:

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

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

存储引擎: mysql进行数据存储的方式: 主要是 innodbmyisam(免费),
这里写图片描述

对比 myisam 和 innodb: 数据存储方式
Innodb: 只有表结构,数据全部存到 ibdata1文件中.
Myisam:表, 数据 和 索引全部单独分开存储.
这里写图片描述
这种文件备份通常使用于myisam 存储引擎,直接复制三个文件即可,然后直接放到对应的数据库下即可以使用.
这里写图片描述

单表数据备份:

每次只能备份一张表: 只能备份数据,(表结构不能备份)

通常的使用: 将表中的数据进行导出到文件
1.备份: 从表中选出一部分数据保存到外部的文件中 (outfile)
Select */字段 into outfile 文件所在路径 from 数据源; – 前提是外部文件不存在.
这里写图片描述

2.高级备份: 自己指定字段和行的处理方式 .
Select */字段 into outfile 文件所在路径 fields 字段处理 lines 行处理 from 数据源;

Fields: 字段处理:
1>Enclosed by: 字段使用什么内容包裹, 默认是空字符串.
2>Terminated: 字段以什么结束, 默认是 “\t”, tab键.
3>Escaped by: 特殊符号用什么方式处理, 默认是 ‘\’, 使用反斜杠转义.
Lines: 行处理
1>Starting by: 每行以什么开始, 默认是’ ’空字符串.
2>Terminated by: 每行以什么结束, 默认是 “\r\n”,换行符.
这里写图片描述

数据还原: 将一个在外部保存的数据重新恢复到表中 (如果表结构不存在,那么将无效).
Load data infile 文件所在路径 into table 表名[(字段列表)] fields 字段处理 lines 行处理; – 怎么备份的怎么还原; (即: 行处理 和 列处理 要和备份的时候处理方式相同).

这里写图片描述

SQL备份:

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

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

单表备份
这里写图片描述

**整库备份:
Mysqldump/(或者)mysqldump.exe -hPup 数据库名字 > 外部文件目录**
这里写图片描述

SQL 还原数据: 两种方式:
方案1: 使用mysql.exe 客户端还原
mysql.exemysql -hPup(数据库 用户名密码) 数据库名字 < 备份文件目录 (注意末尾也不需要分号).

这里写图片描述

方案2: 使用SQL指令还原:
Source 备份文件所在路径;

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

增量备份:

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

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

猜你喜欢

转载自blog.csdn.net/yangyang_A/article/details/80355228
今日推荐