MySQL(二) 返回首页

发表于 2022-02-10 | 本文共 823 字

MySQL(二)

多表间的关系

有些情况下使用一张表表示数据,数据不好维护,存在数据冗余、比较乱的现象

使用多张表需要对数据进行约束,不约束添加的数据会不合法

外键约束

外键约束作用
外键的语法
-- 添加外键
-- 1.新建表时增加外键:
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名);
-- 关键字解释:
CONSTRAINT            -- 约束关键字
FOREIGN KEY(外键字段名) -- 某个字段作为外键
REFERENCES            -- 主表名(主键字段名) 表示参照主表中的某个字段
-- 2.已有表增加外键:
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);

-- 删除外键
ALTER TABLE 表名 drop foreign key 外键名称;
外键的级联

在添加了外键之后,如果从表中有引用的数据,不能直接修改或删除主表主键

在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作

-- 外键级联语法
-- 1.新建表时增加外键级联:
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名) ON UPDATE CASCADE ON DELETE CASCADE;
-- 2.已有表增加外键级联:
alter table 表 add foreign key(列[外键]) references 表(列[主键]) [ON UPDATE CASCADE][ON DELETE  CASCADE];

ON UPDATE CASCADE -- 级联更新,主键发生更新时,外键也会更新
ON DELETE CASCADE -- 级联删除,主键发生删除时,外键也会删除
注意事项

多表关系

在现实生活中,实体与实体之间肯定是有关系的,比如:个人与身份证号,部门和员工,老师和学生等

那么我们在设计表的时候,就应该体现出表与表之间的这种关系,分成三种:一对多,多对多,一对一

一对多(1:n)

例如:班级和学生,部门和员工,客户和订单

一的一方:班级 部门 客户

多的一方:学生 员工 订单

一对多建表原则:在从表(1的一方)创建一个字段,字段作为外键指向主表(n的一方)的主键


多对多(m:n)

例如:老师和学生,学生和课程,用户和角色

一个老师可以有多个学生,一个学生也可以有多个老师

一个学生可以选多门课程,一门课程也可以由多个学生选择

一个用户可以有多个角色,一个角色也可以有多个用户

多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键


一对一(1:1)

例如:一个公司可以有一个注册地址,一个注册地址只能对一个公司

两种建表原则:

一对一通常是创建成一张单表


连接查询

交叉查询

交叉查询就是把若干张表(>=2)没有条件的连接在一起,进行展示

-- 语法
-- 交叉查询指定列
select a.列,a.列,b.列,b.列 from a,b;
-- 交叉查询所有列
select a.*,b.* from a,b;
-- 或者
select * from a,b;

内连接查询

使用条件过滤可以去除交叉查询产生的错误的、不想要的记录,通常要查询的多个表之间都存在关联关系,那么就通过 关联关系(主外键关系) 去除笛卡尔积

隐式内连接
-- 隐式(不出现inner)
select [字段,字段,字段][*] from a,b where a.主键=b.外键 [and 其它条件];
显式内连接
-- 显示(出现inner)
select [字段,字段,字段][*] from a [inner] join b on a.主键=b.外键 [where 其它条件];

外连接查询

内连接查询出来的是公共部分,如果要保证某张表的全部数据情况下进行连接查询,那么就要使用外连接查询,外连接分为左外连接和右外连接

左外连接

以join左边的表为主表,展示主表的所有数据,根据连接条件查询join右边表的数据,若满足连接条件则展示右边表的数据,若不满足则以null显示 可以理解为:在内连接的基础上保证左边表的数据全部显示

-- 语法
select [字段][*] from a left [outer] join b on 连接条件;
右外连接

以join右边的表为主表,展示主表的所有数据,根据连接条件查询join左边表的数据,若满足连接条件则展示右边表的数据,若不满足则以null显示 可以理解为:在内连接的基础上保证右边表的数据全部显示

-- 语法
select [字段][*] from a right [outer] join b on 连接条件;

子查询

在遇到很复杂的场景时,内连接和外连接查询可能查询不出来需要的记录,就可以使用子查询

子查询就是嵌套查询,查询的语句可以作为另外一个查询语句的条件,也就是:一条查询语句里面包含了多个 select

子查询结果是一个值

子查询结果是一个值(单行单列),在 WHERE 后面作为 条件

SELECT 查询字段 FROM 表 WHERE 字段 [= > < <>] (子查询);

子查询结果是单列多行

子查询结果是单列多行,结果集类似于一个数组,父查询使用 IN 运算符

SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);

子查询结果是多行多列

子查询结果是多行多列,在 FROM 后面作为

SELECT 查询字段 FROM (子查询) AS 表别名 WHERE 条件;

事务

概述

MYSQL进行事务管理

自动事务
手动开启事务
-- 手动开启事务
-- 开启事务
start transaction;
-- 提交   
commit;  
-- 回滚
rollback;

-- 设置MYSQL中的自动提交的参数
-- 查看MYSQL中事务是否自动提交
show variables like '%commit%';
-- 设置自动提交的参数:0:OFF,1:ON
set autocommit = 0;
回滚点

在某些成功的操作完成之后,后续的操作有可能成功有可能失败,可以在当前成功的位置设置一个回滚点,供后续操作失败返回到该位置,而不是返回所有操作,这个点称之为回滚点

-- 回滚点语法
-- 设置回滚点
savepoint 回滚点名;
-- 回到回滚点
rollback to 回滚点名;

事务特性和隔离级别

事务特性
事务隔离级别

事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响

当发生并发操作时,多个用户同时访问同一个数据,则可能引发并发访问的问题

数据库安全性问题

数据库安全性问题请参考:数据库安全性问题


数据的备份和还原

语法

-- 备份
mysqldump -u用户名 -p密码 数据库 > 文件的路径:\文件名.sql

-- 恢复
mysqldump -u用户名 -p密码 数据库 < 文件的路径:\文件名.sql    -- 需要已新建好数据库
-- 或者
SOURCE 导入文件的路径;  -- 还原的时候需要先登录MySQL,并选中对应的数据库

数据库设计三大范式

好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响

建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)

满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以此类推,一般说来,数据库只需满足第三范式(3NF)就行了

在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库

1NF


2NF


3NF


总结

tu_15



如果你觉得本文对你有帮助,不妨请我喝杯咖啡