数据库面试常温问题

1. 数据库分类

1.1 关系型数据库模型

- 什么是关系型数据库?

  1. 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
  2. 关系模型由关系 数据结构、关系操作集合、关系完整性约束 三部分组成。
  3. 简单说,关系型数据库是由多张能互相联接的二维行列表格组成的数据库。

- 关系型数据库的重点?

  1. 主要指Mysql和Oracle数据库,互联网运维最常用的是MySQL ;
  2. 通过SQL结构化查询语句存储数据 ;
  3. 保持 数据一致性方面 很强,ACID理论;

1.2 非关系型数据库模型

- 什么事非关系型数据库?

非关系型数据库也被成为NoSQL数据库,本意是“Not Olnly SQL” ;

- 非关系型数据库的特点?

特点:高性能、高并发、对数据一致性要求不高
1、NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充
2、NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
3、NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)

2. 完整性约束

2.1 实体完整性约束

要求每个表都有唯一的标识符,并且每个表中的主键都不为空并且不重复。

2.2 参照完整性

参照完整性要求关系中不允许引用不存在的实体。

2.3 用户自定义完整性

用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。比如设置这一列为null,not null,default,check等。包括:非空约束、唯一约束、检查约束、主键约束 、外键约束等。

3. 事务

3. 1 事务的定义

用户定义的一个数据库操作序列,这些操作要么不做要么全部昨晚,是不可分割的工作单位。

3.2 事务的ACID特性:

  1. 原子性Atomicity:事务是数据库的基本逻辑工作单位,事务中的操作要么不做,要么就要做完。
  2. 一致性Consistency:事务的执行结果必须是使数据库从一个一致性状态变成另一个一致性状态。
    即当事务执行不成功的时候,该事务已经执行的操作需要回滚;并且如果事务是并发多个,系统也必须如同串行事务一样操作。
  3. 隔离性Isolation:一个事务的执行不能受到其他事务的干扰,感受不到其他并发事务的存在。
  4. 持久性Durability:
    一旦一个事务已经提交,它对数据库的改变就是持久性的。

4. 锁机制

  • 按操作划分,可分为DML锁、DDL锁
  • 按锁的粒度划分,可分为表级锁、行级锁、页级锁(mysql)
  • 按锁级别划分,可分为共享锁、排他锁
  • 按加锁方式划分,可分为自动锁、显示锁
  • 按使用方式划分,可分为乐观锁、悲观锁

4.1 共享锁和排他锁

  • 共享锁:又称读锁,是读取操作创建的锁。当事务对数据加共享锁时,其他事务可以并发读取数据,即可以继续加共享锁,但是不能进行修改操作即 不能加排他锁,直到已经释放所有共享锁。
  • 排他锁:又称写锁,是写操作创建的锁。当事务对数据 加上排他锁后,其他事务不能对数据进行任何操作,即不能再加任何类型的锁。

数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)

4.2 悲观锁

指数据对外界修改持保守态度, 悲观锁的流程:

  • 在对某一条数据修改之前,先尝试为该数据加排他锁;
  • 如果加锁失败,说明数据正在被进行修改,当前操作要等待或者抛出异常;
  • 如果加锁成功,可以进行修改,修改完成后释放锁;修改期间如果有其他事务要加锁,都要等待本事务解锁或者直接抛出异常;

优点:采取先加锁后访问的保守策略,为数据处理的安全性提供了保证;
缺点:效率方面,处理加锁会产生额外开销,同时增加产生死锁的几率;另外对于只读事务,没有必要加锁,降低并发性;

4.3 乐观锁

乐观锁是假设所有并发的事务在处理过程中,不加锁的情况下不影响到别人,各自独立地处理数据。但是在提交数据更新前,每个事务都会检查在自己读取该数据后,有没有其他事务对该数据进行过修改。如果有其他事务对数据进行过修改,正在提交的事务要进行回滚。
乐观锁和悲观锁相比,是在事务对数据进行提交更新的时候,才会去检查是否有冲突,如果发现冲突,返回给用户,由用户决定如何操作。

5. 隔离级别

https://blog.csdn.net/jsd2honey/article/details/77511883
https://www.cnblogs.com/wajika/p/6680200.html
https://www.jianshu.com/p/b0d0c0b04fb7

5.1 读未提交Read Uncommitted脏读(修改级别隔离)

  • 只要事务A对数据进行了修改,无论是否提交,其他事务都可以读取到事务A修改后的结果;
  • 潜在问题:脏读问题。就是指当一个事务A正在修改数据,但是还没有提交到数据库中,另外一个事务B读取的这个数据是A修改之后的。但是因为这个数据是还没有提交的数据,还是无效数据,则B读到的数据就是脏数据即所谓 脏读。
  • 解决方法:事务A提交之后,事务B才可以读取到修改之后的内容。

5.2 读提交Read Committed(提交级别隔离)

  • 事务A只有成功提交后,其他事务才可以读取到事务A修改后的数据,否则只能读取到修改之前的原始数据。
  • 潜在问题:解决了脏读问题,但是新问题“不可重复读”。当事务A第一次读取数据,然后事务B开启对数据修改并提交成功,此时事务没有结束,第二次读取数据,会发现一个事务中两次服务数据不一致。
  • 解决方案:
    当事务A对该行数据进行操作时,其他事物不允许进行修改,加一个行级别的锁。

5.3 可重读读取Repeatable Read(事务级别隔离)

  • 可以理解为在自己的事务中复制了一套相关的数据,该数据是事务私有的不受其他事务的影响,因此可以解决不可重复读的问题。
  • 潜在问题:没有解决数据覆盖的问题,即事务A插入一条记录时,事务B查询不到插入的新纪录,B读到的不是最新数据,即 幻读
  • 解决办法:对于隔离机制无法解决这个问题,需要使用行级锁进行处理。

5.4 串行化读取Serializable(表级别隔离)

  • 提供严格的事务隔离,要求多个事务并发执行时的正确性,其结果与按某一次序串行地执行这些事务时的结果相同,即可解决幻读问题。
  • 潜在问题:数据比较安全,但是操作效率比较低。

6. SQL语法

SQL支持变量的类型

  • char(n):固定长度的字符串,指定长度为n;
  • varchar(n):可变长度的字符串,最长长度为n;
  • numeric(p,d):定点数,精度由用户指定;
  • float(n):精度至少为n位的浮点数;

join

包括内连接、外连接、交叉连接

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

其中内连接相当于左连接和右连接的交集,而全连接相当于左连接和右连接的并集。
但是对于Mysql中没有FULL JOIN,为了求并集,可以使用union

union

格式:(sql语句1) union (sql语句2)
其中union all会输出所有并集结果,包含重复数据,但是只是用union不会输出重复数据。

子查询

having

group by

语法实例

create table department
(
	dept_name varchar(20),
	building varchar(15),
	budget numeric(12,2),
	primary key(dept_name)
	foreign key(dept_name) references course);

insert into instructor values (10211, 'Smith', 'Biology', 66000);  //向表instructor中插入一行数据
alter table instructor add A D;   //alter修改关系,想instructor表中国添加一行属性,A为属性,D为域即限制,比如not NULL等
alter tabel instructor drop A;  //alter修改关系,删除表中的一行属性

drop tabel r;    //drop不仅删除所有元组,并且删除关系r的模式
delete from r;    //delete只是删除r中的所有元组,但是保留关系r
alter用来改变关系r的属性;
drop不仅删除所有元组,并且删除关系r的模式;
delete只是删除r中的所有元组,但是保留关系r

7. 什么是存储过程?

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

8. 什么是索引?

索引(Index)是帮助MySQL高效获取数据的数据结构;
MySQL目前提供了以下4种索引。

  • B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。
  • HASH 索引:只有Memory引擎支持,使用场景简单。
  • R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。
  • Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引,InnoDB从MySQL5.6版本提供对全文索引的支持。

9. 范式

  1. 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

  2. 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

  3. 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y。

10. 超键 候选键 主键 外键

超键

在关系中能唯一标识元组(数据库中的一条记录)的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键

是最小超键,即没有冗余元素的超键。

主键

数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合,用户选作元组标识的一个侯选键称为主键。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键

在一个表中存在的另一个表的主键称此表的外键,外键主要是用来描述两个表的关系。

11. SQL语言分类

SQL语言分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL;
其中最重要的两类:

  • DDL(数据定义语言,Data Definition Language): 主要指建库、建表、设置约束等,包括create\drop\alter;

  • DML(数据操纵语言,Data Manipulation Language): 主要指数据的增删查改,包括select\delete\update\insert\call

    索引(包括分类及优化方式,失效条件,底层结构)           
    
    sql语法(join,union,子查询,having,group by)           
    
    引擎对比(InnoDB,MyISAM)           
    
    
    
    
    B树、B+树           
    
    优化(explain,慢查询,show profile)           
    
    数据库的范式。           
    
    分库分表,主从复制,读写分离。           
    
    Nosql相关(redis和memcached区别之类的,如果你熟悉redis,redis还有一堆要问的)
    

作者:batbattle
链接:https://www.jianshu.com/p/9b46f1dc1ce9
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值