数据库学习笔记

ACID特性

1.原子性

原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

2.一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

3.隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

事务之间的相互影响分为几种,分别为:脏读,不可重复读,幻读,丢失更新

(1)脏读

脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的

(2)不可重复读

不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

(3)幻读(虚读)

幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

(4)丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

4.持久性

持久性,意味着在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

数据库索引

MySQL索引使用的数据结构是B+tree,Oracle及Sysbase的索引使用的是B-Tree

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构

  • 索引加快数据库的检索速度
  • 索引降低了插入、删除、修改等维护任务的速度
  • 唯一索引可以确保每一行数据的唯一性
  • 索引需要占物理和数据空间

事物

事物是并发控制的基本单位

所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

drop、delete与truncate

  • 速度,一般来说: drop> truncate >delete
  • delete和truncate只删除表的数据不删除表的结构
  • 不再需要一张表的时候,用drop
  • 删除部分数据行时候,用delete,并且带上where子句
  • 保留表而删除所有数据的时候用truncate

超键、候选键、主键、外键

主键(PRIMARY KEY):主键必须包含唯一的值,主键列不能包含null值,每个表都应该有一个主键,每个表都只能有一个主键

在创建表的时候创建主键约束:

CREATETABLE Persons(
    Id_P int NOT NULL,  //声明为主键的列不能有NULL值
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    PRIMARY KEY (Id_P)
)
//如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
ALTER TABLE Persons ADD PRIMARY KEY (Id_P)

//撤销 PRIMARY KEY 约束,请使用下面的 SQL
ALTER TABLE Persons DROP PRIMARY KEY

外键:在一个表中存在的另一个表的主键称此表的外键

理解超键、候选键、主键.


视图

视图既可以由数据库中1个或多个基本表导出,也可以由已存在的视图导出

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查三种操作,视图通常是一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

创建视图:

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

使用场景:

  • 当为了安全考虑时,只想要暴露表中的部分字段,这是就可以建一个视图
  • 查询的数据来源于不同的表,希望以统一的方式查询,这时可以通过建一个视图把多个表的查询结果联合起来,查询者就只需要直接从视图中获取数据即可

数据库引擎

什么是存储引擎?

简而言之,存储引擎就是指表的类型,数据库的存储引擎决定了表在计算机中的存储方式。

InnoDB引擎:

优势:提供了良好的事务管理、崩溃修复能力和并发控制,支持外键(FOREIGN KEY)和自增列(AUTO_INCREMENT)

缺点:读写效率差,占用的数据空间相对较大

应用场景:对事物完整性的要求较高,要求实现并发控制,需要频繁的更新、删除操作

MyISAM存储引擎:

这种引擎的表存储为三种类型:frm,MYD,MYI,分别存储表的结构,表中数据和表的索引。

优点:占用空间小,插入数据快

缺点:不支持事物的完整性和并发性

应用场景:插入和读出操作频繁

MEMORY存储引擎:

默认使用哈希索引,所有数据都在内存中,使用内存中的内容创建表

优点:数据处理速度快,

缺点:安全性不高,数据易丢失,生命周期短,

适用于创建小型表

ARCHIVE存储引擎

拥有很好的压缩机制,仅支持最基本的插入和查询两种功能

CSV存储引擎

把数据以逗号分隔的格式存储在文本文件中。

BLACKHOLE存储引擎

接受但不存储数据,并且检索总是返回一个空集

FEDERATED存储引擎

把数据存在远程数据库中


关键字

DISTINCT 用于返回唯一不同的值

MySQL中BETWEEN的边界问题:两边都包含,相当于>=和<=

LIKE关键字可以匹配字符串是否相等,“%”可以代表任意长度的字符串,“_”只能表示单个字符。在实际使用时,需要匹配的字符串需要加引号,既可以是单引号,也可以是双引号

连接查询:将两个或两个以上的表按照某个条件连接起来,从中选取需要的数据。
分为内连接和外连接,外连接又有左连接和右连接。

  • INNER JOIN: 如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

数据库的四种隔离级别

在数据库操作中,为了保证并发读取数据的正确性,提出了事物隔离级别概念

  • 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
  • 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
  • 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻读
  • 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

数据库范式

为什么需要范式?范式有什么作用?

范式可以减少数据冗余、消除异常、让数据组织更加和谐。

数据冗余是指一个字段在多个表中重复出现

什么是范式?

范式是为了消除重复数据,减少冗余数据,让数据库中的数据更好的一种组织,让磁盘空间得到有效利用的一种标准化组织

什么是第一范式?

第一范式就是每一个属性都不可再分。不符合第一范式则不能称为关系数据库。

什么是第二范式?

表中的属性必须完全依赖于全部主键,而不是部分主键.所以只有一个主键的表如果符合第一范式,那一定是第二范式。

第三范式:3NF是为了消除数据库中关键字之间的依赖关系

还有BC范式和第四范式。

参考资料1