栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【数据库学习】范式,依赖多表查询,事务,DCL

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据库学习】范式,依赖多表查询,事务,DCL

1 数据库设计规范 1.1范式

第一范式

1NF: 是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的(不可分割)

第二范式

2NF: 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

第三范式

3NF: 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

1.2 依赖
  1. 函数依赖: 如果可以通过 属性(组)A, 可以确定唯一的属性B的值, 叫做属性B函数依赖于A

    ​ 学号 + 课程 -> 分数

  2. 部分函数依赖: 如果通过属性组A中的一部分属性, 就可以确定唯一的属性B的值, 叫做属性B部分函数依赖于A

    ​ 学号 + 课程 -> 学生姓名

  3. 完全函数依赖: 通过属性组A中的所有属性一起 确定唯一的属性B的值, 叫做B完全函数依赖于A

    ​ 学号 + 课程 -> 分数

  4. 传递依赖: 通过属性(组)A 能确定唯一的属性(组)B的值, 通过B能确定唯一的C的值, C传递依赖于A

    ​ 学号 -> 系名 -> 系主任

主属性: 表中存在一个属性(组), 能确定表中其他所有的属性的值
将这个属性(组)称为主属性, 也叫主码。

2 多表查询 2.1 表连接 2.1.1 笛卡尔积

格式: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 外连接

​ 注:连接的两张表一定有一张表的数据是全的 -> 称为驱动表

  1. ​ 左外连接: table1 left [outer] join table2 on 连接条件外键

    ​ table1 left join table2 on 连接条件外键

  2. ​ 右外连接: table1 right [outer] join table2 on 连接条件外键

    ​ table1 right join table2 on 连接条件外键

  3. ​ 全外连接: 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.表(多列多行)

  1. 单个值

    -- 查询哪些员工的薪资大于公司平均薪资
    -- 查公司的平均薪资
    select avg(sal) from emp;
    select ename, sal from emp 
     where sal > (select avg(sal) from emp);
    
  2. 多个值

    -- 平均薪资大于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);
    
  3. 表、

    -- 查询每个部门中的最高薪资员工是谁
    -- 查询每个部门的最高薪资
    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;
    
  4. 其他用法

    -- 将子查询放入select 子句中 可以取代表连接
    -- 查询每个员工所在的部门名字
    select ename, 
    	(select dname from dept d where d.deptno=e.deptno)
    from emp e;
    
3 事务 3.1 概念

事务: 业务层面上的不可切割的整体
特性: 原子性, 一致性, 持久性, 隔离性

完成一个事务: 1.开启事务
2.关闭事务(提交[数据修改生效了], 回滚[撤销了数据的修改])

事务并发: 不同的事务, 操作相同的数据

隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)是是是
读提交(read-committed)否是是
可重读(repeatable-read)否否是
可串行化(serializable)否否否
3.2 问题

可能产生的问题:

  1. 脏读: 一个事物读到了另一个事务没有提交的数据
    – A: 给B转账 B: 查询
    – 开启事务 开启事务
    – 修改数据(100万) 查询余额
    – 回滚 查询余额
    – 解决了脏读问题, B只能读到A提交后的数据

2.不可重复读: 针对 update 两次读取的数据不一致
A: 修改数据 B: 查询
开启事务 开启事务
update 改年龄14 查询: 原来的年龄24
提交事务 查询: 查询到年龄14
3.幻读: 针对 delete 和 insert
A: 删除学员 B: 添加学员
开启事务 开启事务
delete 张三 insert 张三
查询 提交事务 - 生效了
张三还在: 幻读

3.3 解决问题

方法: 修改事务的隔离级别

  1. 查询全局事务隔离级别

    select @@transaction_isolation;
    
  2. 设置事务隔离级别,需要退出MySQL再重新登录才能看到隔离级别的变化

    set global transaction isolation level 级别字符串;
    
3.4 事务操作
-- 补充事务操作
-- 开启事务
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的情况下操作,新密码要加单引号

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032362.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号