面试-数据库

1、什么是数据库锁?oracle中有哪些类型的锁?
数据库锁在多个用户访问同一张表时用以保护数据。
锁的种类:
共享锁:即读锁,在查看时无法修改和删除,在查询时放置,表级
排它锁:即写锁,保证同一个条记录在同一时间只有拥有此锁的用户访问,其他用户线程阻塞

共享锁阻塞排他锁,不阻塞共享锁
排他锁阻塞全部锁

2、数据库的三范式?
1NF:具有原子性(字段不可拆分)
2NF:主键列与非主键列具有完全依赖关系(确保表中的每一列都和主键有关)
3NF:消除传递依赖关系。(确保非主键列之间不存在关系)

3、索引?
索引的实现使用B-tree。使得查询变快,因为不需要全表扫描。但是增删改速度慢,同时会增加数据库的体积大小。
经常查询的字段可以建索引(where后面)
不建议建索引的情况:
不怎么查询,增删改较多
数据量很小
对于很少数据的列(比如 性别 男、女)
text、image、bit不加,数据量太大
增删改的性能要求>>>查询性能
索引的细节后面另开一篇详细说明。

4、什么是事务?它的四个性质
事务指数据库数据的一组操作,要么全部执行,要么全部不执行,是一个不可分割的单位。
性质:
原子性:不可分割
一致性:数据库从一个一致性状态到另一个一致性状态。(3+7=5+5)
隔离性:事务操作的时候不允许其他并发的事务同时进行,排它锁
持久性:一旦提交,对数据库的修改是永久的

5、数据库死锁出现原因和死锁处理?
后面说

6、union 、union all 、intersect、minus的区别
union:并集,去重
union all:不去重,排序
intersect:交集(mysql没有)
minus:差集 a中有而b中没有(mysql没有)

7、联合索引和单个索引的区别
如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:
(area,age,salary),(area,age)、(area)三个索引,这被称为最佳左前缀
特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
例:
select * from test where area=’11’
select * from test where area=’11’ and age=1
select * from test where area=’11’ and age=1 and salary=2.0
以上有索引
select * from test where age=11
select * from test where age=1 and salary=2.0

以上无索引

如果在查询中需要匹配多个字段的条件,可以把这几个字段做个联合索引,效率要比在每个字段上加索引高多了

8、MyISAM与InnoDB的区别是什么?
InnoDB支持事务和行级锁
MyIsam有表级锁,读写性能更高

9、mysql索引的类型?
普通索引:方便查询,提高查询效率
唯一索引:unique ,去重
主键索引:primary key,主键,一个表只能创建一个主键索引
全文索引【 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引, 】:

创建方式:
FULLTEXT (title, content) –在title和content列上创建全文索引

ALTER TABLE article
ADD FULLTEXT INDEX fulltext_article (title, content)

使用方式:
SELECT * FROM article WHERE MATCH(title, content) AGAINST(‘查询字符串’)

9、delete、truncate、drop区别
区别1:delete带where删除部分数据,truncate删除所有数据,drop删除数据和表结构
区别2:delete是dml,提交后生效,触发器会生效,truncate、drop ddl 隐式提交,无法回滚,不会触发触发器
区别3:delete不减少表和索引所占用的空间。truncate使表和索引占有的空间回复到初始大小,drop释放表和索引的所有空间

10、rollback segment?
临时保存数据库数据发生改变时的先前值。
作用1:在transaction 过程中,segment存储了数据的先前值,当执行commit之前,这个数据标记为有效,执行rollback,新数据回滚为原数据,当执行commit后,这个数据标记为无效,数据的改变将永久化。
作用2:并发访问同一条数据并且没有提交之前。当select执行查询语句的同时存在一个数据正在修改这个表的值,修改前的数据会放到segment中,select语句也是从segment中读取表的值。

11、oracle分页与mysql分页

oracle

select * from (
select A.*,rownum rn 
from
(select * from tbl)A
)B where B.rn between 2 and 10
  • 1
  • 2
  • 3
  • 4
  • 5

mysql

select * from tbl limit 1,9
  • 1

12、rownum和rowid的区别
rowid:是物理地址,定位数据在数据库里的地址是相对不变的
rownum:是查询某条记录在某个结果集中的位置

13、数据库的隔离级别
read uncomitted(读未提交):容易出现脏读,A给B发了5000,但是没有提交事务,B查看已到账5000(读取未提交),A发现应该是2000,立刻回滚,修改后提交事务2000。
read commited(读提交):避免了脏读,但是出现不可重复读,A要买东西看了一下卡里5000,与此同时,老婆很快的转走了5000,A付款的时候发现没钱了。 即A读取数据,B更新数据并且提交事务,此时A再次读取发现数据被改变了。oracle默认
repeatable read(可重复读):避免了脏读和不可重复读。当A查看以后准备买东西了,他老婆就没法转账了。但是这个级别会出现幻读。比如A事务把表中所有的1改成2,然后事务B又插了一条1,此时事务A去查看发现居然还有1,就像出现幻觉一样。幻读是批量操作下的,脏读针对同一条数据。mysql默认
Serializable 序列化:最高的事务隔离级别,避免了脏读幻读不可重复读,但是开销很大,性能低。


一)什么是存储过程?有哪些优缺点?

存储过程是一些预编译的SQL语句。

更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

  • 存储过程是一个预编译的代码块,执行效率比较高
  • 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
  • 可以一定程度上确保数据安全

如果你对存储过程不熟悉,建议阅读:存储过程详解-博客园

(二)索引是什么?有什么作用以及优缺点?

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

你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引

  • 索引加快数据库的检索速度
  • 索引降低了插入、删除、修改等维护任务的速度
  • 唯一索引可以确保每一行数据的唯一性
  • 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
  • 索引需要占物理和数据空间 

如果你对索引还不太熟悉,建议阅读:漫谈数据库索引

(三)什么是事务?

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

如果你对索引还不太熟悉,建议阅读:数据库事务 - Mr. David 专栏

(四)数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

如果你对两种锁还不太熟悉,建议阅读:深入理解乐观锁与悲观锁

(五) 使用索引查询一定能提高查询的性能吗?为什么

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

  • 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
  • 基于非唯一性索引的检索

(六)简单说一说drop、deletetruncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

  • delete和truncate只删除表的数据不删除表的结构
  • 速度,一般来说: drop> truncate >delete 
  • delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
    如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger

如果你对这三者的用法还不太熟悉,建议阅读: drop、truncate和delete的区别

(七)drop、deletetruncate分别在什么场景之下使用?

  • 不再需要一张表的时候,用drop
  • 想删除部分数据行时候,用delete,并且带上where子句
  • 保留表而删除所有数据的时候用truncate

(八) 超键、候选键、主键、外键分别是什么?

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

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

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

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

(九)什么是视图?以及视图的使用场景有哪些?

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

  • 只暴露部分字段给访问者,所以就建一个虚表,就是视图。
  • 查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异

(十)说一说三个范式。

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

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

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

如果你对三个还不太了解,建议阅读:解释一下关系数据库的第一第二第三范式?

本文参考文献文章: 

「1」很全的Python面试题

「2」数据库常见笔试面试题

「3」数据库索引

「4」数据库常见笔试面试题 - Hectorhua的专栏

「5」 SQL 中 drop 、delete 和truncate 的区别

「6」数据库基本概念面试必问


猜你喜欢

转载自blog.csdn.net/lovezhaohaimig/article/details/80287813