分享

史上最全的技术岗面试笔记——数据库篇(上)

 汉无为 2020-04-19

数据库三范式是什么? 

💗

第一范式:表中每个字段都不能再分。

第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。

第三范式:满足第二范式并且表中的非主键字段必须不传递依赖于主键字段,每一列数据和主键直接相关。

什么是数据库事务? 
💗

事务具有四大特性:一致性、原子性、隔离性、持久性。

原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。

一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。

数据库事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账就是事务的典型场景。

数据库事务的三个常用命令:Begin Transaction、Commit Transaction、RollBackTransaction。

什么是视图?
💗

视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表。

l 视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。

l 通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。

l 在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。

l 创建视图时,只能使用单条select查询语句。

什么是索引? 
💗

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

l 索引分为:聚集索引、非聚集索引、唯一索引等。

l 一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引。

l 索引可以包含多列。

l 合理的创建索引能够提升查询语句的执行效率,但降低了新增、删除操作的速度,同时也会消耗一定的数据库物理空间。

是一种快速查询表中内容的机制,类似于字典。运用在表中某个些字段上,但存储时,独立于表外。

索引一旦建立,Oracle管理系统会对其进行自动维护,而且由Oracle管理系统决定何时使用索引。

用户不用再查询语句中指定使用哪个索引。

在定义primary key或unique约束后系统自动在想印的列上创建索引。

用户也能按自己的需求,对指定单个字段或多个字段,添加索引。

什么时候要创建索引
● (1)表经常进行 SELECT 操作 
● (2)表很大(记录超多),记录内容分布范围很广 
● (3)列名经常在 WHERE 子句或连接条件中出现

什么时候不要创建索引
● (1)表经常进行 INSERT/UPDATE/DELETE 操作 
● (2)表很小(记录超少) 
● (3)列名不经常作为连接条件或出现在 WHERE 子句中

索引优缺点:
● 索引加快数据库的检索速度
● 索引降低了插入、删除、修改等维护任务的速度(虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引) 
● 唯一索引可以确保每一行数据的唯一性,通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
● 索引需要占物理和数据空间

索引分类:
● 唯一索引:唯一索引不允许两行具有相同的索引值
● 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空 
● 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
● 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个

什么是存储过程? 
💗

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程 比单纯SQL语句执行要快。

存储过程的优点:
能够将代码封装起来;
保存在数据库之中;
让编程语言进行调用 存储过程是一个预编译的代码块,执行效率比较高;
一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率。

存储过程的缺点:
每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用)
业务逻辑放在数据库上,难以迭代

预编译又称为预处理,是做些代码文本的替换工作。

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编 译等就是为编译做的预备工作的阶段主要处理#开始的预编译指令。

什么是触发器?
💗

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

7.写出一条Sql语句:取出表A中第31到第40记录 (MS-SQLServer) 
解1:select top 10 * from A where id not in (select top 30 id from A)
解2:select top 10 * from A where id > (select max(id) from (select top 30 id from A)as A)
解3:select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROMA) as A where rowid between 31 and 40
8.写出一条Sql语句:取出表A中第31到第40记录 (Mysql) select * from A limit 30, 10
9.写出一条Sql语句:取出表A中第31到第40记录 (Oracle) select *
from (select A.*, 
row_number() over (order by id asc) rank 
FROM A)
where rank >=31 AND rank<=40;

在关系型数据库中如何描述多对多的关系? 
💗

在关系型数据库中描述多对多的关系,需要建立第三张数据表。比如学生选课,需要在学生信息表和课程信息表的基础上,再建立选课信息表,该表中存放学生Id和课程Id。

什么是数据库约束,常见的约束有哪几种? 
💗

数据库约束用于保证数据库表数据的完整性(正确性和一致性)。可以通过定义约束\索引\触发器来保证数据的完整性。

总体来讲,约束可以分为: 
主键约束:primary key;
外键约束:foreign key;
唯一约束:unique;
检查约束:check;
空值约束:not null;用于控制字段的值范围。
默认值约束:default

列举几种常用的聚合函数? 
💗

Sum:求和\ Avg:求平均数\ Max:求最大值\ Min:求最小值\ Count:求记录数

什么是内联接、左外联接、右外联接? 
💗

l 内联接(Inner Join):匹配2张表中相关联的记录。

l 左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。

l 右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,左表中未匹配到的字段用NULL表示。

在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。

如何在删除主表记录时,一并删除从表相关联的记录?
💗

如果两张表存在主外键关系,那么在删除主键表的记录时,如果从表有相关联的记录,那么将导致删除失败。

在定义外键约束时,可以同时指定3种删除策略:一是将从表记录一并删除(级联删除);二是将从表记录外键字段设置为NULL;三是将从表记录外键字段设置为默认 值。

级联是用来设计一对多关系的。例如一个表存放老师的信息:表A(姓名,性别,年龄),姓名为主键。还有一张表存放老师所教的班级信息:表B(姓名,班级)。他们 通过姓名来级联。级联的操作有级联更新,级联删除。

在启用一个级联更新选项后,就可在存在相匹配的外键值的前提下更改一个主键值。系统会相应地更新所有匹配的外键值。如果在表A中将姓名为张三的记录改为李四,那么表B中的姓名为张三的所有记录也会随着改为李四。级联删除与更新相类似。如果在表A中将姓名为张三的记录删除,那么表B中的姓名为张三的所有记录也将删除。级联删除示例:
alter table 从表名
add constraint 外键名
foreign key(字段名) references 主表名(字段名)
on delete cascade

超键,候选键,主键,外键分别是什么?
💗

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。候选键(候选码):是最小超键,即没有冗余元素的超键。

主键(主码):数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组 合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。外键:在一个表中存在的另一个表的主键称此表的外键。

候选码和主码:
例子:邮寄地址(城市名,街道名,邮政编码,单位名,收件人)
● 它有两个候选键:{城市名,街道名} 和 {街道名,邮政编码}
● 如果我选取{城市名,街道名}作为唯一标识实体的属性,那么{城市名,街道名}就是主码(主键)

varchar和char的区别?
💗

Char是一种固定长度的类型,varchar是一种可变长度的类型

如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。

char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找。

B+树索引?
💗


b+数的查找过程如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。

真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

b+树性质
1.通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。

这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。

当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先 比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。

比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

B+树的表示要比B树要“胖”,原因在于B+树中的非叶子节点会冗余一份在叶子节点中,并且叶子节点之间用指针相连。

最后,也欢迎大家关注这位同学的Github:https://github.com/TG-yang。

END

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多