第一范式
1NF: 是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的(不可分割)
第二范式
2NF: 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第三范式
3NF: 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
1.2 依赖-
函数依赖: 如果可以通过 属性(组)A, 可以确定唯一的属性B的值, 叫做属性B函数依赖于A
学号 + 课程 -> 分数
-
部分函数依赖: 如果通过属性组A中的一部分属性, 就可以确定唯一的属性B的值, 叫做属性B部分函数依赖于A
学号 + 课程 -> 学生姓名
-
完全函数依赖: 通过属性组A中的所有属性一起 确定唯一的属性B的值, 叫做B完全函数依赖于A
学号 + 课程 -> 分数
-
传递依赖: 通过属性(组)A 能确定唯一的属性(组)B的值, 通过B能确定唯一的C的值, C传递依赖于A
学号 -> 系名 -> 系主任
主属性: 表中存在一个属性(组), 能确定表中其他所有的属性的值
将这个属性(组)称为主属性, 也叫主码。
格式:from table1,table2 where 外键
效果和内连接完全相同
-- 查出每个员工的姓名和他们所在的部门城市 select ename,loc from emp e, dept d where e.deptno = d.deptno;2.1.2 内连接
格式:table1 [inner] join table2 on 连接条件外键
table1 join table2 on 连接条件外键(inner可省略)
-- 使用内连接完成上面案例 select ename, loc from emp e join dept d on e.deptno = d.deptno;2.1.3 外连接
注:连接的两张表一定有一张表的数据是全的 -> 称为驱动表
-
左外连接: table1 left [outer] join table2 on 连接条件外键
table1 left join table2 on 连接条件外键
-
右外连接: table1 right [outer] join table2 on 连接条件外键
table1 right join table2 on 连接条件外键
-
全外连接: oracle 方言 -> full join
如何选择左外连接和右外连接: 就看驱动表在左还是右
-- 使用外连接完成上面案例 select ename, loc from emp e left join dept d on e.deptno = d.deptno; select ename, loc from emp e right join dept d on e.deptno = d.deptno;
自连接: 自己和自己连接(同一张表)
-- 查询员工姓名 和 他的直属上司的姓名 select e.ename , m.ename manager from emp e left join emp m on e.mgr = m.empno;
例(多表连接):
-- 三张表 n-n关系连接 -- 查询用户姓名和他们的角色名 select name, roleName from user u left join user_role ur on ur.user_id = u.id left join role r on ur.role_id = r.id;2.2 子查询
可以使用其他的查询结果
结果: 1.单个的值 (单行单列)
2.集合(单行多列, 单列多行)
3.表(多列多行)
-
单个值
-- 查询哪些员工的薪资大于公司平均薪资 -- 查公司的平均薪资 select avg(sal) from emp; select ename, sal from emp where sal > (select avg(sal) from emp);
-
多个值
-- 平均薪资大于1000的部门里面的员工有哪些 -- 查询部门平均薪资大于1000的部门号 select deptno from emp group by deptno having avg(sal) > 2000; select ename from emp where deptno in (select deptno from emp group by deptno having avg(sal) > 1000);
-
表、
-- 查询每个部门中的最高薪资员工是谁 -- 查询每个部门的最高薪资 select max(sal), deptno from emp group by deptno; select ename, sal, e.deptno from emp e join ( select max(sal) max_sal, deptno from emp group by deptno) e_sal on e.deptno = e_sal.deptno where e.sal = max_sal; -
其他用法
-- 将子查询放入select 子句中 可以取代表连接 -- 查询每个员工所在的部门名字 select ename, (select dname from dept d where d.deptno=e.deptno) from emp e;
事务: 业务层面上的不可切割的整体
特性: 原子性, 一致性, 持久性, 隔离性
完成一个事务: 1.开启事务
2.关闭事务(提交[数据修改生效了], 回滚[撤销了数据的修改])
事务并发: 不同的事务, 操作相同的数据
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(read-uncommitted) | 是 | 是 | 是 |
| 读提交(read-committed) | 否 | 是 | 是 |
| 可重读(repeatable-read) | 否 | 否 | 是 |
| 可串行化(serializable) | 否 | 否 | 否 |
可能产生的问题:
- 脏读: 一个事物读到了另一个事务没有提交的数据
– A: 给B转账 B: 查询
– 开启事务 开启事务
– 修改数据(100万) 查询余额
– 回滚 查询余额
– 解决了脏读问题, B只能读到A提交后的数据
2.不可重复读: 针对 update 两次读取的数据不一致
A: 修改数据 B: 查询
开启事务 开启事务
update 改年龄14 查询: 原来的年龄24
提交事务 查询: 查询到年龄14
3.幻读: 针对 delete 和 insert
A: 删除学员 B: 添加学员
开启事务 开启事务
delete 张三 insert 张三
查询 提交事务 - 生效了
张三还在: 幻读
方法: 修改事务的隔离级别
-
查询全局事务隔离级别
select @@transaction_isolation;
-
设置事务隔离级别,需要退出MySQL再重新登录才能看到隔离级别的变化
set global transaction isolation level 级别字符串;
-- 补充事务操作 -- 开启事务 start transaction; -- 修改 updateupdate account set balance = 500 where id = 1; -- 记录当前的事务点 savepoint a; update account set balance = 500 where id = 2; update account set balance = 500 where id = 3; savepoint b; delete from account; -- 提交事务 commit; -- 回滚事务 rollback; -- 回滚到之前的事务点 rollback to a; select * from account;4 DCL(Data Control Language) 4.1创建用户
CREATE USER '⽤户名'@'主机名' IDENTIFIED BY '密码';4.2 给用户授权
GRANT 权限 1, 权限 2... ON 数据库名.表名 TO '⽤户名'@'主机名';4.3 撤销授权
REVOKE 权限 1, 权限 2... ON 数据库.表名 FROM '⽤户名'@'主机名';4.4 查看权限
SHOW GRANTS FOR '⽤户名'@'主机名';4.5 删除用户
DROP USER '⽤户名'@'主机名';4.6 修改管理员密码
mysqladmin -uroot -p password 新密码;4.7 修改普通用户密码
alter user '⽤户名'@'主机名' identified by '新密码';
注意:需要在登录MySQL的情况下操作,新密码要加单引号



