数据库系统概论
第一章 初识数据库
数据库系统概述
四个概念
数据
数据:数据库中存储的基本对象
数据库
数据库:长期存储在计算机内、有组织的、可共享的大量数据的集合
数据库管理系统
数据库管理系统:位于用户应用与操作系统之间的一层数据管理软件
- 数据定义功能
- 数据组织、存储和管理
- 数据操纵功能
- 数据库的事务管理和运行管理
- 等等等等
数据库系统
数据库系统:指在计算机系统中引入数据库后的系统构成
数据库系统的特点
- 数据结构化
- 数据的共享性高、冗余度低
- 数据独立性高
数据模型
定义
数据模型是对现实世界数据特征的抽象
两类数据模型
- 概念模型(信息模型):按用户观点对数据和信息建模,用于数据库设计
- 逻辑模型和物理模型
- 逻辑模型:包括网状、层次、关系、面向对象数据模型,按计算机的观点对数据建模,用于DBMS实现
- 物理模型:描述数据在系统内(磁盘上)的表示方法和存取方法
概念模型
- 实体:
- 属性:
- 码:唯一标识实体的属性叫码
- 实体型:
- 实体集:
- 联系:
概念模型的一种表示方法----E-R图
数据模型的组成要素
数据结构–描述系统的静态特性
- 描述数据库的组成对象–对象的类型、內容、性质
- 描述对象之间的联系
数据操作–描述系统的动态特性
对数据库中各种对象的实例允许执行的操作的集合
- 数据操作的类型
- 数据操作语言
完整性约束
- 一组完整性规则的集合
- 数据模型对完整性约束条件的定义
常用的数据模型
- 层次模型
- 网状模型
- 关系模型
- 面向对象数据模型
- 对象关系数据模型
- 半结构化数据模型-如XML
- 非结构化数据模型
层次模型
层次模型用树形结构来表示各类实体以及实体间的联系

网状模型
网状数据理系统采用网状结构来表示各类实体以及实体间的联系

关系模型
一张二维表

数据库系统的结构
数据库系统模式的概念
- 模式:是对数据库逻辑结构和特征的描述,是型的描述,不涉及具体值
- 实例:数据库某一时刻的状态—模式的一个具体值
数据库系统的三级模式结构
- 模式(所有用户的公共数据视图):是对数据库中全体数据的逻辑结构和特征的描述、是对型的描述,不涉及具具体值、模式是相对稳定的
- 外模式也称为子模式或用户模式:是用户能够看见和使用的局部数据的逻辑结构和特征的描述,是用户的数据视图,是与某一应用有关的数据的逻辑表示
- 内模式:内模式也称为存储模式,它是数据库在物理存储器上具体实现的描述,是数据在数据库内部的表示方法,也是数据物理结构和存储方式的描述。一个数据库只有一种内模式。

数据库的二级映像功能与数据独立性
- 外模式/模式映像:用以保证数据的逻辑独立性
- 模式/内模式:用以保证数据的物理独立性
数据库系统的组成
略
第二章 关系数据库
关系模型
- 关系数据结构:就是一张二维表,列为属性,行为关系实例
- 笛卡尔积
- 元组
- 属性
- 码
- 全码
关系代数
定义
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
- 运算对象是关系
- 运算结构是关系
- 关系代数的运算符有两类
- 集合运算符:
- 并
- 差
- 交
- 笛卡尔积
- 关系运算符:
- 选择:又称为限制,相当于SQL语句的where子句
- 投影:从R中选择出若干属性列组成新的关系
- 连接:从两个关系的笛卡尔积中选取满足一定条件的元组
- 除(不会)
关系演算
略
第三章 SQL
基本概念
基本表
存储文件
视图(类似于函数):
- 从一个或几个基本表导出的表
- 数据库只存放视图的定义而不存放视图对应的数据
- 视图是一个虚拟表,其内容由查询定义。
数据定义
总览
| 操作对象 | 操作方式 | ||
|---|---|---|---|
| 创建 | 删除 | 修改 | |
| 模式 | create schema | drop schema | |
| 表 | create table | drop table | alter table |
| 视图 | create view | drop view | |
| 索引 | create index | drop index | alter index |
定义模式
定义模式相当于定义了一个命名空间
在这个空间可以定义该模式包含的数据库对象,例如基本表、视图、索引
相关语句
- 创建模式:create schema <模式名> authorization <用户名> [<表定义子句> <视图定义子句> <授权定义子句>]
- 删除模式:drop schema <模式名> <cascade | restrict>
- cascade(级联):删除模式时候把该模式的所有对象全部删除
- restrict(限制):仅当该模式中没有任何下属对象才删除模式
定义基本表
创建语句格式
create table < tablename >
(< colname > < typename > [<列完整性约束条件>],
< colname > < typename > [<列完整性约束条件>],
< colname > < typename > [<列完整性约束条件>],
[, < 表级完整性约束条件 >]
);
修改语句格式
alter table < tablename >
[add [column] < 新列名 > < 数据类型 > [ 完整性约束 ]]
[add < 表级完整性约束 >]
[drop [ column ] < 列名 > [cascade | restrict]]
[drop constraint < 完整性约束名 > [restrict | cascade]]
[alter column < 列名 > < 数据类型 >]
删除语句
drop table < tablename > [restrict | cascade]
数据类型
数据类型 描述 CHARACTER(n) 字符/字符串。固定长度 n。 VARCHAR(n) 或 CHARACTER VARYING(n) 字符/字符串。可变长度。最大长度 n。 BINARY(n) 二进制串。固定长度 n。 BOOLEAN 存储 TRUE 或 FALSE 值 VARBINARY(n) 或 BINARY VARYING(n) 二进制串。可变长度。最大长度 n。 INTEGER§ 整数值(没有小数点)。精度 p。 SMALLINT 整数值(没有小数点)。精度 5。 INTEGER 整数值(没有小数点)。精度 10。 BIGINT 整数值(没有小数点)。精度 19。 DECIMAL(p,s) 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。 NUMERIC(p,s) 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) FLOAT§ 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 REAL 近似数值,尾数精度 7。 FLOAT 近似数值,尾数精度 16。 DOUBLE PRECISION 近似数值,尾数精度 16。 DATE 存储年、月、日的值。 TIME 存储小时、分、秒的值。 TIMESTAMP 存储年、月、日、小时、分、秒的值。 INTERVAL 由一些整数字段组成,代表一段时间,取决于区间的类型。 ARRAY 元素的固定长度的有序集合 MULTISET 元素的可变长度的无序集合 XML 存储 XML 数据
定义索引
建立索引的目的:加快查询速度
常见索引:
- B+数的索引:具有动态平衡的优点
- 散列(hash)索引:具有查找速度快的特点
建立索引
create [ unique ] [ cluster ] index < 索引名 >
on < 表名 > (<列名>[< 次序 >]),<列名>[< 次序 >])…);
- 索引:可以建立在一列或多列上
- 次序:指定索引值的排列顺序,asc升序,dec降序
- unique:此索引的每一个索引值值对应唯一的数据记录
- cluster:表示要建立的索引是聚簇索引
数据查询
单表查询
语句格式
SELECT [ all | distinct ]select_list
[FROM table_source]
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC]]
all和distinct:all选取所有行、distinct消除重复行
select:指定要显示的属性列
from:指定查询对象(基本表或视图)
where:指定查询条件
运算符 描述 = 等于 <> 不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 != > 大于 < 小于 >= 大于等于 <= 小于等于 BETWEEN 在某个范围内 LIKE 搜索某种模式 IN 指定针对某个列的多个可能值 group by:对查询结果按指定列的值分组
having:只有满足指定条件的组才会输出
order by:对查询结果排序
聚集函数:
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
连接查询

等值与非等职连接查询
例子:
select student.*, SC.*
from student, SC
where stduent.sno = Sc.sno
自身连接
自身连接,一个表与其自己进行连接,是一种特殊的连接,需要给表起别名以示区别,使用属性时必须使用别名前缀
例子:
1 SELECT FIRST.CNumber, SECOND.PCNumber 2 FROM Course FIRST, Course SECOND 3 WHERE FIRST.PCNumber=SECOND.CNumber;外连接
左外连接
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;右外连接
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
嵌套查询
- 带有in谓词的子查询
- 带有比较运算符的子查询
- 带有any或all谓词的子查询(全称量词)
- 带有exists谓词的子查询(存在量词)
集合查询
- 并操作:union
- 交操作:intersect
- 差操作:expect
**注意:**参加集合操作的各查询结果的列数必须相同,对应的项的数据类型也必须相同
数据更新
插入数据
插入元组
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO *table_name* VALUES (*value1*,*value2*,*value3*,...);第二种形式需要指定列名及被插入的值:
INSERT INTO *table_name* (*column1*,*column2*,*column3*,...) VALUES (*value1*,*value2*,*value3*,...);插入子查询姐结果(多个元组)
insert into Dept_age(Sdept, Avg_age) select Sdept, AVG(Sage) from Student group by Sdept;修改数据
修改某一个元组
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;修改多个元组
update Student SET Sage = Sage + 1;带子查询的修改语句
update SC set Grade = 0 where Sno in (select Sno from Student Where Sdept='CS')删除数据
删除一个元组
delete from Student where Sno = '20182132008'删除多个元组
delete from SC;带自查询的删除语句
delete from SC where Sno in (select Sno from Student where Sdept='CS')空值
- 空值判断:is null 或 is not null
- 空值比较
- 空值与另一个值(包括空值)的算术运算:结果为空值
- 空值与另一个值(包括空值)的比较运算:结果为unknown
视图
- 特点:
- 虚表,是从一个或几个基本表导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基本中的数据发生变化,从视图中查询出的数据也随之改变
定义视图
语句格式
CREATE VIEW view_name AS 子查询 [with check option];**注意:**对视图进行update、insert和delete操作时要保证更新、插入、删除的行满足视图定义中的谓词条件
*例子:
CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName FROM Products WHERE Discontinued=No
删除视图
drop view <视图名> [cascade];
查询视图
select columns
from viename
where expression;
更新视图
与更新基本类似
更改
update 视图名 set 更改的列 where 限制条件插入:同上
删除:同上
**注意:**一些视图是不可以更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新,例如:
update S_G set Gavg = 90 where Sno = '123'
视图的作用
- 简化用户操作
- 使得用户能以多种角度看同一种数据
- 利用视图可以更清晰的表达查询
第四章 数据库安全性
数据库安全性控制
身份鉴别
系统提供的最外层安全保护措施
身份鉴别的方法
- 静态口令鉴别
- 动态口令鉴别
- 智能卡鉴别:一种不可复制的硬件,内置芯片,具有加密功能
- 生物特征鉴别:利用生物特征进行认证的技术,例如指纹、虹膜
存取控制
机制组成
- 定义用户权限(并登记到数据字典中)
- 合法权限检查
方法:
自主存取控制方法
用户对不同数据对象有不同的权限
不同用户对同一数据对象也有不同的权限
用户可以将其拥有的权限转授给其他用户
通过SQL的GRANT和REVOKE语句实现
强制存取控制MAC:适用于那些对数据有严格而固定密级分类的部门
视图
- 定义:把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
审计
以上的用户身份鉴别、自主存取控制、强制存取控制、视图都属于预防性措施,而审计属于监控措施
- 定义
- 启用一个专用的审计日志,将用户对数据库的所有操作记录在上面
- 审计员利用审计日志
数据加密
防止数据库在存储和传输中失密的有效手段
- 加密方法
- 存储加密
- 传输加密
第五章数据库完整性
定义
- 数据库的完整性包括正确性和相容性
- 正确性:是指数据符合现实世界语义,反映了当前实际状况
- 相容性:是指数据库同一对象在不同关系表中的数据是否符合逻辑
维护完整性需要
- 提供定义完整性约束条件的机制
- 提供完整性检查机制
- 违约处理
实体完整性
实体完整性
关系模型的实体完整性:create table中用primary key定义
单属性构成的码有两种说明方法:定义为列级约束条件和表级约束条件
CREATE TABLE table_name ({<column_definition> -------列级约束定义 |column_name AS computed_column_expression -------计算列定义 |<teble_constraint> ------表级约束定义 }[,….n] )对多个属性构成的码只有一种说明方法:定义为表级约束条件
实体完整性检查和违约处理
插入或对主码列进行更新操作时,会检查
- 主码是否唯一
- 主码各个属性是否为空
两种方法:1、扫描全表 2、为主码建立索引
参照完整性
参照完整性定义
若属性(组)F是基本关系R的外码它与基本关系S的主码K对应,则对于R中每个元组在F上的值必须为:空值或等于S中某个元组的主码值
SQL定义
- 在create table中用foreign key定义哪些列为外码
- 用references短语指明这些外码参照哪些表的主码
CREATE TABLE Student (Sno char(9) not null, Cno char(4) not null, Grade SMALLINT, PRIMARY KEY(Sno,Cno), //主键,在表级定义实体完整性 foreign key (Sno)REFERENCES Student(Sno), //在表级定义参照完整性 foreign key (Cno)REFERENCES Student(Cno), //在表级定义参照完整性 );参照完整性检查和违约处理
检查
- 一个参照完整性将两个表中的相应元组联系起来
- 对被参照表或参照表进行增删查改时可能会破坏参照完整性,必须进行检查
违约处理
- 拒绝执行
- 级联操作:当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中所有造成不一致的元组
- 设置为空值:当删除或修改被参照表的一个元组造成了与参照表的不一致,则将参照表中所有造成不一致的元组对应的属性设置为空值
CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno,Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE /*级联删除SC表中相应的元组*/ ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION /*当删除Course 表中的元组造成了与SC表不一致时拒绝删除*/ ON UPDATE CASCADE /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/ );用户定义的完整性
- 属性上的约束条件:只涉及单个属性
- create table时定义的约束条件
- 非空:not null
- 唯一:unique
- 检查是否满足一个条件表达式:check
- 检查:插入或修改属性时检查
- 违约处理:拒绝执行
- 元组上的约束条件:可以设置不同属性之间的相互约束条件
- 检查:插入或修改属性时检查
- 违约处理:拒绝执行
完整性约束命名子句
定义:constraint < 完整性约束条件名 > < 完整性约束条件 >,< 完整性约束条件 >包括not null、unique、primary key短语、foreign key短语、check短语等等
CREATE TABLE TEACHER ( Eno NUMERIC(4) PRIMARY KEY /*在列级定义主码*/ Ename CHAR(10), Job CHAR(8), Sal NUMERIC(7,2), Deduct NUMERIC(7,2), Deptno NUMERIC(2), CONSTRAINT TEACHERFKey FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno), CONSTRAINT C1 CHECK (Sal + Deduct >= 3000) );修改表中的完整性限制
ALTER TABLE Student DROP CONSTRAINT C4;断言:SQL中,可以使用create assertion语句,通过声明性断言来指定更具一般性的约束,可以定义涉及多个表的或聚集操作的比较复杂的完整性约束,断言创建以后,任何对于断言中所涉及的关系的操作都会触发系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
create assertion<断言名> <check 子句>;//定义断言 drop assertion<断言名>;//删除断言触发器:
- 是用户定义在关系表上的一类由事件驱动的特殊过程
- 任何用户对表的增删查改操作均由服务器自动激活相应的触发器
- 触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力
定义触发器:create trigger 语法格式
create trigger <触发器名> {before | after} <触发事件> on <表名> referencing new|old row as <变量> for each {row|statement} [when <触发条件>] <触发动作体>激活触发器:是由触发事件激活
删除触发器:drop trigger <触发名> on <表名>;
数据库的常见面试题
1.事务四大特性(ACID)✔
• 原子性:要么执行,要么不执行,也就是不可再分,已经最小了。
• 隔离性:系统通常会并发执行事务,但是事务与事务之间并不知晓
• 一致性:事务前后,数据总额一致。(类似与银行取钱)事务执行过程中会出现不一致状态
• 持久性:一旦事务提交,对数据的改变就是永久的
2.数据库隔离级别✔
隔离级别 含义 脏读 不可重复读 幻读
读未提交 允许读未提交的数据 ✔ ✔ ✔
读已提交 只允许读已提交的数据 X ✔ ✔
可重复读 允许重复读已提交的数据 X X ✔
可串行化 保证可串行化调度 X X X
• 脏读:事务B读取事务A还没有提交的数据
• 不可重复读:两次事务读的数据不一致
• 幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看来,明明修改了数据,咋不一样
3.MYSQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景✔
引擎 特性
MYISAM 不支持事务,不支持外键,支持表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描即count*
INNODB 支持事务,支持外键,支持行锁,支持外键、查表总行数时,全表扫描即count*
MyISAM和InnoDB两者的应用场景
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。(概括为:查)
InnoDB用于事务处理应用程序,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。(概括为:增改)
4.索引有B+索引和hash索引 ✔
索引 区别
Hash hash索引,等值查询效率高,不能排序,不能进行范围查询
B+ 数据有序,范围查询,模糊查询 例如like关键字 like ‘xxx‘
1、大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,建议数据库使用B+树索引。
2、在离散型高,数据基数大,且等值查询时候,Hash索引有优势。
5.聚集索引和非聚集索引✔
索引 区别
聚集索引 数据按索引顺序存储,中子结点存储真实的物理数据(就好像字典拼音查字,拼音a开头的排在最前-z开头的排在最后)
非聚集索引 存储指向真正数据行的指针(相当于字典部首查字:具有相同部首的字其所在页数不一定相邻)
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续
聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快
6.索引的优缺点,什么时候使用索引,什么时候不能使用索引✔
• 优点:索引最大的好处是提高查询速度,
• 缺点:更新数据时效率低,因为要同时更新索引而且索引占用一定的空间
• 能用索引的场景:对数据进行频繁查询进建立索引
• 不能用索引的场景:如果要频繁更改数据不建议使用索引。
7.InnoDB索引和MyISAM索引的区别
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主
8.索引的底层实现(B+树,为何不采用红黑树,B树)重点✔
树 区别
红黑树 增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
B树也就是B-树 B树,查询性能不稳定,查询结果高度不一致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。(非叶子结点也存数据,所以查询有时快有时慢,高度比B+树高)
B+树 B+树相比较于另外两种树,显得更矮更宽,查询层次更浅(只有叶子节点才存数据)
9.B+树的实现
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素
10.为什么使用B+Tree(不懂)
索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。
根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,
将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入
局部性原理与磁盘预读
12.索引最左前缀问题✔
如果对三个字段建立联合索引,如果第二个字段没有使用索引,第三个字段也使用不到索引了
13.索引分类,索引失效条件(不懂)
索引类型 概念
普通索引 最基本的索引,没有任何限制
唯一索引 与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引 它是一种特殊的唯一索引,不允许有空值。
全文索引 针对较大的数据,生成全文索引很耗时好空间。
组合索引 为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则
失效条件
条件是or,如果还想让or条件生效,给or每个字段加个索引
like查询,以%开发
内部函数
对索引列进行计算
is null不会用,is not null 会用
16.varchar和char的使用场景✔
类型 使用场景
varchar 字符长度经常变的
char 用字符长度固定的
17.数据库连接池的作用✔
连接池的作用是为了提高性能,避免重复多次的打开数据库连接而造成性能的下降和系统资源的浪费;连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建和销毁的过程。这样以提高系统的性能。
使用连接池的优势:1、资源复用 2、更快的响应速度 3、统一的连接管理
20.数据库三范式(看最后)✔
级别 概念
1NF 属性不可分
2NF 非主键属性,完全依赖于主键属性
3NF 非主键属性无传递依赖
21.关系型数据库和非关系型数据库区别✔
关系型数据库
优点
• 容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
• 使用方便:通用的SQL语言使得操作关系型数据库非常方便;
• 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
• 支持SQL,可用于复杂的查询。
• 支持事务
缺点
• 为了维护一致性所付出的巨大代价就是其读写性能比较差;
• 固定的表结构;
• 不支持高并发读写需求;
• 不支持海量数据的高效率读写
非关系型数据库
• 使用键值对存储数据;
• 分布式;
优点
• 无需经过sql层的解析,读写性能很高
• 基于键值对,数据没有耦合性,容易扩展
• 存储数据的格式:nosql的存储格式是key,value形式
缺点
• 不提供sql支持
22.数据库中join的inner join, outer join, cross join✔
1.以A,B两张表为例
A left join B
选出A的所有记录,B表中没有的以null 代替(产生的表长与A相同)
right join 同理
2.inner join
A,B的所有记录都选出,inner join 产生的是A和B交集
3.cross join (笛卡尔积)
A中的每一条记录和B中的每一条记录生成一条记录
例如A中有4条,B中有4条,cross join 就有16条记录
4、full join. FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。
23.有哪些锁,select时怎么加排它锁✔
锁 概念
乐观锁 自己实现,通过版本号
共享锁 多个事务,只能读不能写,加 lock in share mode
排它锁、悲观锁 一个事务,只能写,for update
行锁 作用于数据行select 。。。where id=1 for update
表锁 作于用表
24.死锁怎么解决✔
找到进程号,kill 进程
25.最左匹配原则✔
最左匹配原则是针对索引的
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,
这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,
查询条件where name=‘xxx’ and age=xx 这时的话,就利用到索引了,再来思考下where age=xx and name=’xxx‘ 这个sql会利用索引吗,
按照正常的原则来讲是不会利用到的,但是优化器会进行优化,把位置交换下。这个sql也能利用到索引了
26.四大范式✔
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
(在现在的主流关系型数据库,不可能出现)
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。(在1NF基础消除了部份函数依赖)
不遵守第二范式的缺点:(1)数据冗余、(2)更新、插入、删除异常
例子:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分)
(学号) → (姓名, 年龄)
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。(在2NF基础上消除了传递函数依赖)
例子:因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y
鲍依斯-科得范式(BCNF)在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符BCNF范式。(在3NF基础上消除关键字决定关键字)
例子:
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID) (管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式

