常见面试题整理--数据库篇(每位开发者必备)

转载自:https://zhuanlan.zhihu.com/p/23713529        知乎专栏

继续前面有关于的Python面试的两篇内容:Python代码篇 、Python概念篇 今天说一说数据库。不管你是Java开发者还是Python开发者还是其他语言开发者,基本上面试的时候都会被问到数据库相关的知识点。所以掌握一些经常被问的数据库知识是十分重要的。

如果你对数据库不熟悉,想学习的话,学习专栏有一篇MySQL学习资料

那么常见的数据库面试题有哪些呢?(非DBA向)

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

存储过程是一些预编译的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、delete与truncate的区别

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

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

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

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

  • 不再需要一张表的时候,用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」数据库基本概念面试必问

常见面试题整理--数据库篇(每位开发者必备相关推荐

  1. 常见面试题整理--操作系统篇(每位开发者必备)

    这两日整理了很多编程方面的资料:教学视频.书籍资源以及实战项目全部放在了百度网盘里,资源的目录以及获取方式都放在了文末的图上,你可以直接翻至文末查看. 有过面试经历的人都知道操作系统是面试官必问的几大 ...

  2. 【Java常见面试题】数据库篇

    导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud+黑马旅游+谷粒商城+学成在线+MySQL高级篇+设计模式+牛客面试题 ...

  3. 常见面试题整理--操作系统篇

    (一)请分别简单说一说进程和线程以及它们的区别. 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位. 线程是进程的实体,是CPU调度和分派的基本单位 ...

  4. 面:常见面试题整理(操作系统)

    常见面试题整理(操作系统) 常见面试题整理(操作系统) 2018年03月08日 20:47:11 逃离地球的小小呆 阅读数:20782 (一)请分别简单说一说进程和线程以及它们的区别. 进程是具有一定 ...

  5. Java常见面试题整理(一)

    Java常见面试题整理 字符串 抽象类与接口 集合 多线程 锁 IO流 网络编程 字符串 主要包括String.StringBuffer和StringBuilder基本概念 String相关知识 St ...

  6. 操作系统常见面试题整理

    (一)请分别简单说一说进程和线程以及它们的区别. 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位. 线程是进程的实体,是CPU调度和分派的基本单位 ...

  7. (操作系统) 常见面试题整理

    (一)请分别简单说一说进程和线程以及它们的区别. 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位. 线程是进程的实体,是CPU调度和分派的基本单位 ...

  8. 常见面试题整理(操作系统)

    (一)请分别简单说一说进程和线程以及它们的区别. 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位. 线程是进程的实体,是CPU调度和分派的基本单位 ...

  9. 测试开发java常见面试题_Java常见面试题200+,学习、面试必备

    本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者. 主要包含: Java 基础.容器.多线程.反射.对象拷贝 ...

最新文章

  1. Stimulsoft Reports.Net基础教程(十):创建图表报表②
  2. 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机...
  3. Error Code: 1052. Column '列名' in where clause is ambiguous
  4. Eclipse 里找不到 Servers 面板的原因和处理办法
  5. x86异常处理与中断机制(1)概述中断的来源和处理方式
  6. Java StringBuilder trimToSize()方法与示例
  7. 不同浏览器对回车提交表单的处理办法(转载)
  8. [导入]JavaScript常用函数:Trim() LTrim() RTrim()
  9. linux 内核内核签名_24岁生日快乐,Linux内核
  10. html+css个人博客_如何在互联网放置 HTML 页面
  11. 高通:预计未来几年向苹果公司出售的芯片将减少
  12. Java Android 代码片段收集
  13. 超酷网页 Message Box 样式集合
  14. 莽荒纪手游源码/服务端!
  15. Android 热修复原理
  16. 暮光之城3蓝光BD高清下载
  17. error:crosses initialization of
  18. 前端工程师的前途与价值体现
  19. IDEA 工具中 如何生成有参和无参的构造方法
  20. 育润多维发力慈善领域,勇抗企业公益大旗

热门文章

  1. 字符串的使用(JavaScript)
  2. C++标准库笔记-多线程-shared_future-future的补充扩展
  3. win10此电脑桌面显示(桌面显示)
  4. python sqlite3的使用及sql语句
  5. 记录一次最坑的微信会员卡 跳转型开发时的bug errcode72011
  6. Compound word transformer代码详解(一)数据预处理
  7. dll和lib的区别
  8. LabVIEW编程LabVIEW控制NET0816以太网数据采集卡例程与相关资料
  9. 复选框checkbox实现批量删除
  10. 盘点男士们也喜爱的八大女性APP