本人22考研党,已上岸,发一些复试准备整理的资料作为对考研准备的一个收尾。由于近几年基本都是线上复试,线上的话会更加注重概念的考察,本人在复试准备期间搜集了面试题,整理了很多资料。本文主要概括了数据库在复试面试中可能会考察的一些问题,仅供大家参考,如果对大家有帮助,希望大家点赞哦~
本文目前仅针对的是考研复试环节,不涵盖数据库全部的知识,祝大家复试顺利。由于作者本人水平有限,若本文有任何不对欢迎大家留言指正!上岸不易,希望大家都能去到想去的地方,加油。
超键:在关系中能唯一标识元组的属性或属性集。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
候选键:是最小超键,即没有冗余元素的超键。
主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。可从候选键中选择一个作为主键
外键:在一个表中存在的另一个表的主键称此表的外键。
主属性:候选键中的所有属性
非主属性
(一)DB、DBMS、DBS、DBA
DB(数据库):长期存储在计算机内、有组织的、统一管理的相关数据的集合。
DBMS(数据库管理系统):数据库管理系统是位于用户与OS之间的一层数据管理软件,它为用户或应用程序提供了访问DB的方法。
DBS(数据库系统):数据库系统DBS是实现有组织动态地存储大量关联数据,方便多用户访问的计算机硬件、软件和数据资源组成的系统,即采用数据库技术的计算机系统。
DBA(数据库管理员)
(二)数据库的表 —— 相当于一个类
实体 数据库中的一行,也称为一条记录,一个元组
属性 数据库中的一列,一个字段
文件系统 共享性差,冗余度大,独立性差
数据库管理系统 共享性高,可以使多个用户同时访问数据库,减少了数据冗余度,具有较高的物理独立性和逻辑独立性,整体结构化,用数据模型描述
三级模式包括外模式、模式、内模式;
模式描述了数据库中全体数据的逻辑结构和特征;
外模式描述了用户可见的局部数据的逻辑结构和特征;
内模式描述了数据库的物理结构和存储方式。
外模式/模式映像保证了数据的逻辑独立性(应用程序和数据库的物理存储是相互独立的);
内模式/模式映像的优点保证了数据的物理独立性(应用程序和数据库的逻辑结构是相互独立的)。
概念模型:现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是设计人员和用户进行交流的语言。用ER图描述概念模型。
逻辑模型:表达计算机实现观点的DB全局逻辑结构的模型。逻辑模型主要有层次、网状、关系和对象模型4种。
关系模型:关系模型建立在严格的数学概念基础上;关系模型的概念单一,无论实体还是实体间的联系,都用关系表示,对数据的检索和更新也是关系;关系模型的存取路径对用户透明,有更高的数据独立性和安全性,同时也简化了程序员的工作和数据库开发
约束是执行数据校验的规则,用于保证数据完整性的规则
实体完整性:关系模式中的主码不能为空值;
参照完整是:关系模式中的外码只能是空值或者另一关系模式的主码;
用户定义完整性:针对某一属性的约束。
MySQL主要分为Server层和存储引擎层:
Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块binglog日志模块。
存储引擎:主要负责数据的存储和读取。server层通过api与存储引擎进行通信。
**综合统一。**集DCL,DML,DDL于一体;
**高度非过程化。**使用SQL进行数据操作时,是需要提出“做什么”,而不需要指明怎么做;
**面向集合的操作方式。**操作的对象、查找结果都可以是元组的集合;
同一种语法结构提供多种使用方式。既可以作为独立的语言进行交互,又可以作为嵌入式语言嵌入到更高级的语言程序中;
DDL(数据库定义语言):create、alter、drop等,定义DB三级结构的语言
DML(数据库操纵语言):对数据库数据操作的语言,insert、update、delete等
DCL(数据库控制语言):包含grant、 revoke等
数据字典是系统内部的一组系统表,他记录了数据库所有的定义信息,包括关系模式定义,视图定义,索引定义完整性约束定义等,是在需求分析阶段建立的。
它包括数据项,数据结构,数据流,数据存储和处理过程。
外连接是指两个表在进行操作时,不仅返回符合连接和查询条件的元组,还返回不符合条件的一些元组;
左外连接(left join on): 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接(full outer join on 并集): 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
生成笛卡尔积-它不使用任何匹配或者选取条件,直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配。
索引相当于目录,用于提高数据表的访问速度的一种数据结构。
作用:数据存储在磁盘上,查询数据时,如果没有索引,会加载所有的数据到内存然后依次检索,有了索引不需要加载所有的数据
优点:
减少磁盘I/O次数,降低数据库IO成本;提高查询速度,当用分组和排序子句进行查询时,可以显著减少分组和排序的时间,降低CPU的消耗;加快表之间的连接。
缺点:
索引存在磁盘上,占用一定的物理空间;当对表中的数据进行增删改时,需要对索引进行动态的维护,降低了数据维护的速度。且随着数据量的增加,耗费的时间也会增加。
索引分类:
聚簇索引 一般推荐用自增主键,保证空间利用率,减少页分裂
非聚簇索引(二级索引) 用二级索引查需要回表操作(根据二级索引查到主键,再根据主键去主键索引查)
聚簇索引和非聚簇索引的区别:
聚簇索引叶子结点存储数据记录,非聚簇索引叶子结点存储数据位置,不会影响数据表的物理存储顺序;一个表只能有一个聚簇,但可以多个非聚簇;使用聚簇查询效率高,但增删改操作效率比非聚簇低。
覆盖索引:索引字段覆盖了查询语句涉及的字段,直接通过索引文件就可以返回查询所需的数据,不必通过回表操作。
回表:通过索引找到主键,再根据主键id去主键索引查。
索引下推:在根据索引查询过程中就根据查询条件过滤掉一些记录,减少最后的回表操作。
索引设计原则
需要的时候:
经常用于查询的字段
经常用于连接的字段
经常需要排序的字段
不需要的时候:
基数小的表没必要
区分度不高的字段不适合,比如性别
更新频繁的不适合
为何用B+树?
B+树只在叶子结点储存数据,非叶子结点存索引,而一个结点就是磁盘一个内存页,内存页大小固定,相比B树这些可以存更多的索引结点, 出度更大,树高矮,查询次数少,磁盘IO少。
视图是虚拟的表,本身并不存储数据,本质可以看作是存储起来的select语句
对视图中的数据进行增删改,数据表中的数据会相应地发生变化
视图本身的删除并不影响基表中的数据
视图可以简化查询,实现数据的安全
预编译的SQL语句,允许模块化的设计,创建一次可以多次调用
原理:存储过程预先存储在SQL服务器上,需要执行时,客户端给服务器发送调用存储过程的命令,服务端就可以把预先存储好的一系列语句全部执行
优点:简化操作,提高SQL语句的重用性,可以建立非常复杂的查询,且比执行单纯的SQL语句要快
通过事件触发执行的特殊存储过程,相当于事件监听器,例如对一个表的数据操作会触发另一个表的数据操作。是保证数据库完整性的一种方法。任何用户对表进行增删改操作都会有数据库服务器自动激活相应的触发器,对数据库进行相应的检查和操作。
1NF 要求数据库每一列都是不可再分的原子值
2NF 消除了非主属性对主属性的部分函数依赖,所有非主键字段必须完全依赖于主键字段,不能只依赖主键的一部分。
3NF 消除了非主属性对主属性的传递函数依赖,每一列数据必须和主键直接相关,不能间接相关,也就是说,所有非主键字段不能依赖于其他非主键字段
BCNF 基本排除了所有属性对码的部分函数依赖和传递函数依赖
是指关系中一个或一组属性的值可以决定其它属性的值
如果属性集合X中每个属性的值构成的集合唯一地决定了属性集合Y中每个属性的值构成的集合,则属性集合Y函数依赖于属性集合X,计为:X→Y
例:身份证号→姓名或者一个学生实体中有学号,性别,姓名。给了学号就唯一确定了其他属性。
非平凡函数依赖: 如果X→Y,但是Y不属于X集合,则X→Y是非平凡函数依赖。
完全函数依赖:在一个属性集合U中,如果X→Y,并且对于X的真子集X’都不能确定Y,只有X才能确定Y,那么成Y对X完全函数依赖。否则称之为部分函数依赖。
包含三个推理规则:自反律,增广律和传递律
在关系模式中,F所逻辑蕴含的函数依赖的全体称之为F的闭包F+
有效性指的是:由数据依赖F出发根据Armstrong公理推导除了的每一个函数依赖都一定在F+中。
完备性指的是:F闭包中的每一个函数依赖,必定可以有F出发根据Armstrong公理推导出来。
**概念:**用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言,通常用E-R图描述
三要素:
实体:现实世界的个体,可以独立存在,矩形表示
属性:实体的特性,不可再分,椭圆形表示
关系:实体之间的联系,菱形表示
转换关系:
一个实体通常转换成-一个 数据表;
一个多对多的关系,通常也转换成一个数据表;
一个1对1,或者1对多的关系,往往通过表的外键来表达,而不是设计一个新的数据表;
属性转换成表的字段。
合并冲突:
属性冲突。不同的实体对同一属性的定义不同;
命名冲突。同名异义、异名同义;
结构冲突。同一实体在不同的局部E-R图中有不同的抽象。
需求分析(功能分析)
概念结构设计(ER图)
逻辑结构设计(ER图到表)
物理结构设计(存储结构)
数据库实施(测试、试运行)
数据库运行和维护
数据库进行操作的基本单位
原子性:事务是一个不可分割的单位,要么全做,要么全不做;
一致性:事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态;
隔离性:一个事务的执行不能被其他事务所干扰;
永久性:一旦事务被提交,它对数据库的改变就是永久的。
安全性是指防止数据库被恶意破坏和非法存取
实现数据库安全性控制的常用方法和技术有:
(1)用户标识和鉴别:该方法由系统提供一定的方式让用户标识自己咱勺名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供系统的使用权。
(2)存取控制:通过用户权限定义和合法权检查确保只有合法权限的用户访问数据库,所有未被授权的人员无法存取数据。
存取控制两种方法:
自主存取控制(DAC):用户对不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限
强制存取控制(MAC):每一个数据库对象被标以一定的密级,每一个用户也被授予一定级别的许可证,只有具有合法许可证的用户才可以进行存取。
(3)视图机制:为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。
(4)审计:建立审计日志,把用户对数据库的所有操作自动记录下来放人审计日志中,DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。
(5)数据加密:对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获知数据的内容。
数据库的完整性是指为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。
数据库的安全性是保护数据库防止恶意的破坏和非法的存取。
总结来说,数据库安全性措施的防范对象是非法用户和非法操作,数据库的完整性措施的防范对象是不合语义的数据
数据冗余最容易出现的就是:当同一条数据存储在两个或多个单独的位置时,特别容易产生数据冗余。备份数据也会产生数据冗余,错误的数据也会发生数据冗余。
怎么避免:对数据进行规范化管理,采取更为严格的数据库范式,比如BCNF范式或者第四范式。逐步消除数据依赖中不合理的地方,设计更为高效的数据库。还可以组织数据库的序列,对数据进行分类存储。
数据转储:DBA定期将数据库复制到其他介质上进行保存,这些备份的数据叫做后备副本;
登记日志文件,日志文件是用来记录事物对数据库进行更新操作的文件。
利用后备副本和日志文件,可以将数据库恢复到某个一致性状态。
登记日志文件时为什么必须先写日志文件,后写数据库?
如果先写了数据库修改,而在运行记录中没有登记这个修改,则以后就无法恢复这个修改了。
如果先写日志,但没有修改数据库,在恢复时并不会影响数据库的正确性。
事务故障、系统故障、介质故障;
事务故障是指事务在运行至终点前被中止;事务故障恢复是由系统自动完成,利用日志文件撤销此事务已对数据库进行的修改;
系统故障是指造成系统停止运转的任何事件,使得系统要重新启动;系统故障的恢复是在重新启动后系统自动完成,为了防止系统故障造成的数据不一致性,必须撤销故障时未完成的事物,重做已完成的事物;
介质故障是指磁盘上的物理数据和日志文件被破坏;介质故障的恢复方法就是重装数据库,重做已经完成的事物。
bin log记录对MySQL数据库执行修改的所有操作,不会记录select和show语句,主要用于恢复数据库和同步数据库。
redo log用来记录innodb存储引擎的事务日志,不管事务是否提交都会记录下来,用于数据恢复。当数据库发生故障,innoDB存储引擎会使用redo log恢复到发生故障前的时刻,以此来保证数据的完整性。
进行数据修改时还会记录undo log,undo log用于数据的撤回操作,它保留了记录修改前的内容。通过undo log可以实现事务回滚,并且可以根据undo log回溯到某个特定的版本的数据。
丢失修改:A、B两个事物同时对一个数据进行操作,A的修改破坏了B的修改,导致B的修改丢失;
不可重复读:两次读到数据不一致。A读取了数据后,B对数据进行了修改,导致A无法再现前一次的读取结果;
脏读:读到了未提交的数据。A对数据进行了修改之后,B读入该数据,然后A又因为某一原因撤销了该修改,导致数据恢复原值,此时B读取的数据就成了脏数据。
锁是防止其他事务访问指定资源,实现并发控制的一种手段。
排他锁(X写锁):当数据被加上排他锁,其他事务不能对该数据进行读和写;
共享锁(S读锁):当数据被加上共享锁,允许其他事务对该数据进行读,不允许写。
悲观锁:假定会发生并发冲突,在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制。
乐观锁:假设不会发生并发冲突,只在提交操作时检查数据是否被修改过。给表增加version字段,在修改提交之前检查version与原来取到的version值是否相等,若相等,表示数据没有被修改,可以更新,否则,数据为脏数据,不能更新。实现方式:乐观锁一般使用版本号机制或CAS算法实现。
一级封锁协议:事务在修改数据之前加写锁,直到事务结束才释放。该协议可以防止丢失修改;
二级封锁协议:在一级封锁协议的基础上,加上了事务在读取数据之前对其加读锁,读完后即可释放读锁。该协议避免了读脏数据;
三级封锁协议:在一级封锁协议的基础上,加上了事务在读取数据之前必须加上读锁,直到事务结束才释放。该协议解决了不可重复读问题。
数据库基本操作
#查看数据库
show databases
#创建数据库
create database db DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
#使用数据库
use db;
用户
#创建用户
create user ‘用户名’@‘IP地址’ identified by ‘密码’;
#删除用户
drop user ‘用户名’@‘IP地址’;
#修改用户
rename user ‘用户名’@‘IP地址’; to ‘新用户名’@‘IP地址’;;
#修改密码
set password for ‘用户名’@‘IP地址’ = Password(‘新密码’)
创建用户时:
用户名:创建的用户名称
IP地址:指定用户可以从哪个服务器登陆,本地用户localhost,任意远程机用“%”
密码:该用户登陆的密码
权限
#查看权限:
show grants for ‘用户’@‘IP地址’
#授权:
grant 权限 on 数据库.表 to ‘用户’@‘IP地址’
#取消授权:
revoke 权限 on 数据库.表 from ‘用户’@‘IP地址’
权限:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL,例如:
GRANT SELECT, INSERT ON student.user TO ‘javayz’@’%’;
通过下面的命令让指定用户可以给其他用户授权
GRANT privileges ON databasename.tablename TO ‘username’@‘host’ WITH GRANT OPTION;
对表的操作
#查询所有的表
show tables;
#创建表
CREATE TABLE user
(
id
int(11) NOT NULL auto_increment, # not null表示不能为空,auto_increment表示自增
name
varchar(255) DEFAULT ‘javayz’, # default 表示默认值
PRIMARY KEY (id
) # 把id列设置成主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#查看表信息
DESC 表名
#清空表
truncate table 表名
#删除表
drop table 表名
#添加列
alter table 表名 add 列名 类型
#删除列
alter table 表名 drop column 列名
#修改列类型
alter table 表名 modify column 列名 类型;
#修改列名、列类型
alter table 表名 change 原列名 新列名 类型;
#添加主键
alter table 表名 add primary key(列名);
#删除主键
alter table 表名 drop primary key;
#添加外键
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
#删除外键
alter table 表名 drop foreign key 外键名称
#修改默认值
ALTER TABLE user ALTER name SET DEFAULT ‘javayz2’;
#删除默认值
ALTER TABLE user ALTER name DROP DEFAULT;
对数据的操作
基础增删改查:
#增
insert into 表 (列名,列名…) values (值,值,…)
#删
delete from 表 where 条件
#改
update 表 set 字段=‘值’ where 条件
#查
select 值 from 表 where 条件
其他条件:
#通配符like %匹配多个字符,匹配单个字符
select * from 表 where name like '%java’
#limit 限制输出行数
select * from 表 limit 3 #前3行
select * from 表 limit 3,5; #从第3行开始的5行
#order by 排序
select * from 表 order by 列 asc #asc正序,desc逆序
#group by分组(group by 必须在where之后,order by之前)
select name from 表 group by name