MySql 数据库

一些概念性的东西也记录下, 面试时候也会问,技术记录主要以学习,面试为主

概念性

① 数据库的三范式

  • 第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;(只要是关系型数据库都满足1NF)

  • 第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;解决:消除复合主键就可避免出现部分依赖,可增加单列关键字。

  • 第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现

② 事务的四大特性

  • 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态

  • 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;

  • 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

  • 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。

③ 事务隔离级别

  • 未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

  • 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。

  • 可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。(默认)

  • 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read)

④ 事务的并发问题

  • 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  • 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

1、 增删改查

这个先不说了,以后有机会在另开一篇

2、视图

就是为了简化查询,是一个虚拟表的概念,不会真正的存储数据

2.1、权限控制

不能开放对基础数据的访问权限, 那么可以通过视图, 开放其中的几列

2.2、简化复杂的查询

复杂的查询语句可以通过生成一个视图来操作,每次操作视图, 优化器对视图进行了优化,比每次都使用复杂查询语句要快

2.3、视图能不能更新,删除,添加数据(默认)

更新数据: 可以, 但是如果视图是通过表关联创建的, 在更新的时候,只能一次更新一个表中的字段, 不可以一个更新语句更新多个表中的字段。

删除数据:如果建立单表视图, 可以删除数据。 如果多表查询结果建立的视图, 不可用删除数据。

添加数据:同更新,只能一次插入的数据在一个表中,并且必须主键是自增主键,否则也会出错

3、存储过程

一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点:

①将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用

②批量处理:SQL+循环,减少流量,也就是“跑批”

③统一接口,确保数据的安全

3.1 创建

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
​
proc_parameter:
    [ IN | OUT | INOUT ] param_name type
​
characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
​
routine_body:
  Valid SQL routine statement
​
[begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

实例:

CREATE PROCEDURE del_data(in pname VARCHAR(255))
BEGIN
        delete from test where name = pname;
END
-- 调用方式
CALL del_data(123);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值