数据库面试题(基础常考!!!)
在数据库领域,无论是日常开发还是面试场景,都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述,帮助大家更好地应对面试和实际工作中的挑战。
面试题一:三范式详解
什么是三范式
三范式是关系型数据库中用于规范数据结构的重要准则,包含第一范式、第二范式和第三范式。
假设存在一个学生成绩表,字段有:学号、姓名、课程名称、成绩、课程学分。数据如下:
学号 | 姓名 | 课程名称 | 成绩 | 课程学分 |
---|---|---|---|---|
001 | 张三 | 数学 | 90 | 4 |
001 | 张三 | 英语 | 85 | 3 |
002 | 李四 | 数学 | 88 | 4 |
002 | 李四 | 英语 | 82 | 3 |
- 第一范式(1NF):要求每一列都是不可再分割的最小单元。在此例中,所有字段(学号、姓名、课程名称、成绩、课程学分)都已达到最小数据单元,不可分割,符合第一范式。
- 第二范式(2NF):在满足第一范式的基础上,非主属性必须完全依赖于主属性。若将(学号,课程名称)设为主键,其他字段(姓名、成绩、课程学分)都完全依赖于这个主键,满足第二范式。
- 第三范式(3NF):在满足第二范式的基础上,非主键字段不能依赖于其他非主键字段。此例中,姓名依赖于学号,成绩和课程学分依赖于(学号,课程名称),不存在非主键字段相互依赖,满足第三范式。
简单概括,第一范式是确保列的原子性;第二范式是在原子性基础上,保证非主键对主键的完全依赖;第三范式是在前两者基础上,杜绝非主键之间的相互依赖。
为什么要遵循三范式
遵循三范式主要有两个目的:一是减少数据冗余,避免数据的重复存储,节省存储空间;二是方便数据的维护和更新,确保数据的一致性,避免在数据修改时出现异常情况。
实际开发中是否一定要严格遵循三范式
实际开发中,并不一定严格遵循三范式。虽然三范式能保证数据的规范性,但在实际工作中,性能也是重要考量因素。例如,某些场景下严格遵循三范式可能需要多表联查,而多表联查在数据量较大时效率较低。为了提升查询性能,有时会引入冗余字段,将数据存储在更少的表中,这是典型的空间换时间策略。
面试题二:关系型数据库与非关系数据库的区别及应用场景
关系型数据库
关系型数据库基于关系模型,以表格结构组织和存储数据,数据按行和列存储,可通过主键和外键建立表间关系。
其特点包括:
- 统一的数据结构:以表格形式存储,每列有特定数据类型,提供规范、结构化的数据存储方式。
- 强一致性:遵循 ACID 原则(原子性、一致性、隔离性、持久性),保障数据一致性和事务完整性。
- 数据完整性:支持通过主键和外键定义表间关联关系,进行数据完整性约束。
- 丰富的查询功能:借助 SQL 查询语言,可进行复杂的关系查询、连接操作、多表查询、条件查询和聚合查询等。代表数据库有 MySQL、Oracle 等。
非关系型数据库
非关系型数据库(NoSQL)不同于传统关系型数据库,不依赖表格和关系模型,采用键值对、文档、图等多种数据模型存储和管理数据,放宽了对数据一致性的要求。
其特点如下:
- 灵活的数据模型:可根据应用需求选择和定制合适的数据模型,如键值对形式。
- 高可扩展:天生支持分布式计算和存储,便于横向扩展,应对大规模数据和高并发访问。
- 高性能和高可用:由于放宽一致性要求,可进行异步读写和读写分离等优化,提升性能和可用性。代表数据库有 Redis、MongoDB、Neo4j 等。
两者区别
- 数据模型不同:关系型数据库基于关系模型,以表格存储数据,表间通过外键关联;非关系型数据库不采用表格和关系模型,数据存储形式多样。
- 数据结构不同:关系型数据库数据结构严格,需预先定义结构和字段类型,数据修改遵循规范和约束;非关系型数据库数据结构灵活,无需预先定义严格模式,可随时添加或修改数据结构。
- 查询语言不同:关系型数据库常用 SQL 查询,支持复杂查询条件、连接操作和聚合函数;非关系型数据库查询语言因类型而异,部分支持类似 SQL 语法,部分使用特定 API 或 DSL。
- 事务支持不同:关系型数据库通常支持 ACID 事务特征,保证数据一致性和完整性;非关系型数据库事务支持程度不同,多数只提供部分 ACID 特性或采用不同一致性模型。
- 扩展性与性能不同:传统关系型数据库水平扩展存在挑战,常通过垂直扩展提升性能;非关系型数据库设计更易于水平扩展,通过增加服务器分散数据和负载。
应用场景
- 关系型数据库:适用于对数据一致性要求高、查询复杂的场景,如金融交易系统、企业级应用、内容管理系统等。
- 非关系型数据库:适用于海量数据存储、日志系统、大数据分析、实时处理、Web 应用和移动应用等领域,处理半结构化和非结构化数据时优势明显。
面试题三:MySQL 常用引擎
存储引擎决定了数据的存储方式、索引建立方式以及数据更新和查询的技术实现。在 MySQL 中,常用的存储引擎有以下几种:
- InnoDB:MySQL 5.5 + 版本的默认存储引擎,支持事务处理、行级锁定和物理外键约束。特点是能提供良好的数据一致性、崩溃恢复能力和高并发性能,适用于需要事务支持和多用户读写操作的应用场景。
- MyISAM:MySQL 早期的默认存储引擎,不支持事务和行级锁定。它的优势是读取速度快,数据存储文件较小,适用于只读或读多写少、不需要事务的场景。
- MEMORY:将表数据存储在内存中,提供极快的访问速度,但数据在服务器重启后会丢失。常用于临时表、缓存表或需要快速查询的小型表。
面试题四:InnoDB 和 MyISAM 的区别
- 事务支持不同:InnoDB 支持事务,能保证数据的一致性和完整性;MyISAM 不支持事务。
- 锁粒度不同:InnoDB 最小锁粒度为行级锁,在并发操作时,仅锁定操作的行,对其他行的影响小,可提高并发性能,但锁管理开销较大;MyISAM 最小锁粒度是表级锁,操作时锁定整个表,其他读写操作需等待锁释放,并发性能较低,但锁管理开销小。
- 外键支持不同:InnoDB 支持物理外键,可建立表间的关联约束;MyISAM 不支持物理外键。
- 索引存储方式不同:InnoDB 索引叶子节点存储的是当前行的数据;MyISAM 索引的叶子节点存储的是地址,需根据地址获取当前行数据。
面试题五:阿里巴巴《Java 开发手册》不建议使用物理外键的原因
使用物理外键会带来以下问题:
- 性能问题:插入数据前需先到主键表中查询,增加了数据库的 I/O 操作和查询时间,导致性能下降。
- 数据库更新风暴问题:在高并发场景下,可能引发数据库更新风暴,大量并发的数据库更新操作集中发生,使数据库服务器承受巨大压力,导致性能瓶颈、延迟增大甚至系统崩溃。
面试题六:物理删除和逻辑删除的区别及日常开发选择
- 物理删除:直接从数据库中永久删除数据记录,释放相关存储空间,被删除数据无法恢复,原有的唯一标识也不再存在。
- 逻辑删除:在程序中实现删除功能,通常通过添加标记字段或状态字段,将数据标记为已删除状态,数据实际仍存于数据库中,可通过修改查询语句筛选出删除或未删除状态的数据。
在日常开发中,选择哪种删除方式取决于具体需求和业务场景。对于重要数据,在数据库空间和性能允许的情况下,多采用逻辑删除,这样既能保留历史数据,又方便后续数据恢复,保证数据完整性;对于不重要的数据,如具有时效性的日志数据,且数据库对性能和空间有要求时,会使用物理删除以节省系统空间,提高查询性能。
面试题七:内连接、外连接和自连接
- 内连接:是最常用的连接类型,根据两个或多个表之间的共同列值连接表,只有当连接表之间存在匹配值时才返回结果。例如:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
- 外连接:可返回连接表之间所有匹配和不匹配的数据。外连接分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。例如:
SELECT 列名 FROM 表1 LEFT OUTER JOIN 表2 ON 表1.列 = 表2.列;
内连接返回的是两个表都存在的数据;左(右)外连接是左(右)表的所有数据和右(左)表匹配的数据;全外连接返回两个表的所有数据,包括匹配和不匹配的数据。
这里我借用一下我觉得比较直观的图片,它们的区别是:内连接返回的是两个表都存在的数据,如图:
左(右)外连接是左(右)表的所有数据和右(左)表匹配的数据,如图:
全外查询到的数据,如图:
- 自连接:是一种特殊的表连接,连接的表在物理上为同一张表,但逻辑上视为多张表,常用于处理表中具有层次结构的数据。假设存在一个员工表:
员工 ID | 姓名 | 经理 ID |
---|---|---|
1 | 张三 | 3 |
2 | 李四 | 3 |
3 | 王五 | NULL |
4 | 赵六 | 1 |
通过自连接可查询每个员工的经理姓名:
SELECT e1.姓名 AS 员工姓名, e2.姓名 AS 经理姓名
FROM 员工表 AS e1
JOIN 员工表 AS e2 ON e1.经理ID = e2.员工ID;
结果如下:
员工姓名 | 经理姓名 |
---|---|
张三 | 王五 |
李四 | 王五 |
赵六 | 张三 |
面试题八:创建索引时是否锁表
在 MySQL 5.7 之前,创建索引会锁表。因为创建索引过程中,需保证表数据不被修改,以确保索引的正确性和一致性,这会导致其他会话(除 select 外)阻塞。
而在 MySQL 5.7 之后,引入了 Online DDL 技术,允许创建索引时不阻塞其他会话,所有 DML(INSERT、UPDATE、DELETE、SELECT)操作可并发执行。该技术使数据库在运行期间能执行表结构或其他数据库对象的更改操作,无需中断正在进行的事务和查询。
面试题九:聚簇索引和非聚簇索引的区别
- 聚簇索引:数据按照索引列的值顺序存储在同一页上,索引和数据存储在一起,找到索引就能找到数据。在 MySQL 的 InnoDB 引擎中,聚簇索引默认是主键。
- 非聚簇索引:将索引和数据行分开存储,索引结构的叶子节点指向数据对应的位置,叶子节点存储的是主键 ID。使用非聚簇索引查询时,先得到主键 ID,再通过主键 ID 到聚簇索引上查找真正的行数据,这个过程称为回表查询。
两者主要区别如下:
- 聚簇索引叶子节点存储行数据,非聚簇索引叶子节点存储聚簇索引(通常是主键 ID)。
- 聚簇索引查询效率更高,非聚簇索引需回表查询,性能相对较低。
- 聚簇索引一般为主键索引,一个表中只能有一个;非聚簇索引一个表中可以有多个。
面试题十:聚簇索引与主键索引的关系及生成规则
聚簇索引在大多数有主键的情况下等于主键索引。若表中没有主键索引,聚簇索引的生成规则如下:
- 无主键索引,则使用非空唯一索引:若表中无主键索引,InnoDB 会使用第一个满足唯一约束且设置了非空约束的索引作为聚簇索引。
- 无任何满足的索引,则生成隐藏聚簇索引:若表中既无主键索引,也无符合条件的唯一索引,InnoDB 会生成一个名为 GEN_CLUST_INDEX 的隐藏聚簇索引,该索引为六字节长整型类型。
通过对这些面试题的深入理解,我们不仅能在面试中脱颖而出,更能在实际数据库开发和管理工作中做出更合理的决策,提升系统性能和稳定性。
相关文章:

数据库面试题(基础常考!!!)
在数据库领域,无论是日常开发还是面试场景,都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述,帮助大家更好地应对面试和实际工作中的挑战。 面试题一:三范式详解 什么是三范式 三范式是关…...

ASP.NET Core Clean Architecture
文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. IEmail接口层2. Ema…...
蓝桥杯备赛-精卫填海-DP
精卫终于快把东海填平了!只剩下了最后的一小片区域了。同时,西山上的木石也已经不多了。精卫能把东海填平吗? 事实上,东海未填平的区域还需要至少体积为 v 的木石才可以填平,而西山上的木石还剩下 n 块,每块…...

Windows10配置C++版本的Kafka,并进行发布和订阅测试
配置的环境为:Release x64下的环境 完整项目:https://gitee.com/jiajingong/kafka-publisher 1、首先下载相应的库文件(.lib,.dll) 参考链接: GitHub - eStreamSoftware/delphi-kafka GitHub - cloade…...
vue3 下载文件 responseType-blob 或者 a标签
在 Vue 3 中,你可以使用 axios 或 fetch 来下载文件,并将 responseType 设置为 blob 以处理二进制数据。以下是一个使用 axios 的示例: 使用 axios 下载文件 首先,确保你已经安装了 axios: npm install axios然后在你…...

【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶
本文目录 一、限流二、漏桶三、令牌桶算法四、Gin框架中实现令牌桶限流 一、限流 限流又称为流量控制,也就是流控,通常是指限制到达系统的并发请求数。 限流虽然会影响部分用户的使用体验,但是能一定程度上保证系统的稳定性,不至…...

51单片机-AT24CXX存储器工作原理
1、AT24CXX存储器工作原理 1.1、特点: 与400KHz,I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…...

突破性能极限:DeepSeek开源FlashMLA解码内核技术解析
引言:大模型时代的推理加速革命 在生成式AI大行其道的今天,如何提升大语言模型的推理效率已成为行业焦点。DeepSeek团队最新开源的FlashMLA项目凭借其惊人的性能表现引发关注——在H800 GPU上实现580 TFLOPS计算性能,这正是大模型推理优化的…...

点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...

[AI]从零开始的树莓派运行DeepSeek模型教程
一、前言 在前面的教程中,教了大家如何在windows中使用llama.cpp来运行DeepSeek模型。根据前面的教程中,我们也了解到了,我们只需要编译好llama.cpp就可以运行DeepSeek以及类似的LLM模型。那么本次教程就来教大家如何使用树莓派来运行大模型。…...

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…...

Open WebUI本地部署教程
文章目录 1、系统环境配置2、源码下载2.1 github源码地址下载 3、环境启动3.1 后端环境3.2 前端环境 4、问题4.1 浏览器跨域问题4.2 all-MiniLM-L6-v2模型文件下载失败问题4.3 单独部署backend启动报错问题 1、系统环境配置 操作系统:windows/linux/macos Python版…...

Missing required prop: “maxlength“
背景: 封装一个使用功能相同使用频率较高的input公共组件作为子组件,大多数长度要求为200,且实时显示统计子数,部分input有输入提示。 代码实现如下: <template><el-input v-model"inputValue" t…...

dify本地部署
安装docker。 在官网安装docker。 如果遇到wsl报错,就使用 wsl --updata 进行更新。如果问题解决,进入docker应该是如下界面: 克隆 在自己创建的文件内使用 git clone gitgithub.com:langgenius/dify.git 或 git clone https://github.com…...
python学习一
学习网络安全为什么要学python? 1、在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工 具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者 编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定 的编程能力。 2、python是一门编程语言经常用它…...
git branch
文章目录 1.简介2.格式3.选项4.示例参考文献 1.简介 git branch 用于管理分支,包括查看、创建、删除、重命名和关联。 git branch 是 Git 版本控制系统中用于管理分支的命令。分支是 Git 的核心功能之一,允许开发者在同一个代码库中并行开发不同的功能…...

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历
邻接矩阵广度优先遍历(BFS)是一种用于遍历或搜索图的算法,以下是具体介绍: 1. 基本概念 图是一种非线性的数据结构,由顶点和边组成,可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…...
数学建模之数学模型—2:非线性规划
文章目录 非线性规划基本概念与结论凸集与凸函数极值条件无约束条件的极值判断条件有约束条件的极值判断条件 无约束非线性规划一维搜索算法步骤示例特点代码模板 最速下降法算法详细步骤 代码实现示例最优步长的求解 黄金分割法斐波那契法牛顿法阻尼牛顿法模式搜索法Powell方法…...

unity学习51:所有UI的父物体:canvas画布
目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载,导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas,UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…...

ctfshow做题笔记—栈溢出—pwn57~pwn60
目录 前言 一、pwn57(先了解一下简单的64位shellcode吧) 二、pwn58 三、pwn59(64位 无限制) 四、pwn60(入门难度shellcode) 前言 往前写了几道题,与shellcode有关,关于shellc…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...