• 8.16 Day42---数据库面试题


    目录

    1. 什么是三范式, 反三范式

    三范式:

    2. MySQL的数据类型:

    3. 约束 (5种):

    4. 什么是事务, 为什么需要事务, 四大特性, 操作事务的语句 (开启、 提交、回滚)

    什么是事务:

    为什么需要事务:

    事务的四大特性(ACID):

    操作事务的语句:

    5. 事务的四种隔离级别:

    6. 你对索引的理解

    什么是索引:

    索引的优缺点:

    优点:

    缺点:

    索引的种类:

    索引的数据结构为什么是B+树:

    B树与B+树的区别, B+树与Hash索引的区别:

    聚簇与非聚簇的区别:

    聚簇索引:

    非聚簇索引:

    回表查询:

     最左前缀原则:

    索引失效的场景:

    索引的优化

    7. 数据库锁的种类:

    按照是否独占式: 

    按照锁的粒度: 行、 页、表:

    8. 什么是死锁, 怎么解决

    死锁:

    解决死锁的办法:

    9. 什么是乐观锁, 悲观锁:

    悲观锁:

    乐观锁:

    10. 内连接与外连接的语法, 区别

    11. 左外连接与右外连接的语法, 区别:

    12. 子查询的语法

    13. 分组查询的语法:

    14. where 与 having的区别:

    15. 说出常用的数据库函数

    日期:

    数学:

    字符串:

    聚合 (统计, 分组):

    16. count (*)  count(主键id) count(1) 的区别:

    17. 创建表的语法:

    18. 创建索引的语法:

    19. drop, delete, truncate的区别:

    20. 增删改查的语法:

    21. 数据库备份和还原:

    22. SQL语句优化:

    23. 数据库优化:


    1. 什么是三范式, 反三范式

    三范式:

    第一范式:每个列都不可以再拆分。

    第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

    第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

    反三范式:基于第三范式所调整的,有时为了提高运行效率,就必须降低范式标准。

    2. MySQL的数据类型:

    整数类型有int,小数类型有float、double,日期类型有year、time、date、datetime,文本/二进制类型有char、varchar

    3. 约束 (5种):

    非空约束:字段内容一定不能为空。

    唯一约束:字段内容不允许重复,一个表允许有多个唯一约束。

    主键约束:字段内容不允许重复,一个表只能有一个主键约束。

    外键约束:预防破坏表与表之间的连接,防止非法数据插入外键列。

    检测约束:控制字段的值范围。

    4. 什么是事务, 为什么需要事务, 四大特性, 操作事务的语句 (开启、 提交、回滚)

    什么是事务:

    事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,所执行的结果使数据库从一种一致性状态转换成另一种一致性状态,它还是逻辑上的一组操作,要么都执行,要么都不执行。

    为什么需要事务:

    将多个读写操作组合成一个逻辑单位来执行,要么都成功,要么都失败。

    事务的四大特性(ACID):

    原子性(Atomicity):事务的原子性确保动作要么全部完成,要么全部不执行。

    一致性(Consistency ):多个事务对同一个数据的读取结果是相同的。

    隔离性(Isolation ):并发事务之间数据库是独立的。

    持久性(Durability ):事务被提交之后,对数据库中数据的改变是持久的。

    操作事务的语句:

    开启事务:start transation

    回滚:rollback

    提交:commit

    5. 事务的四种隔离级别:

    读取未提交(READ-UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据,可能会导致脏读、不可重复读或幻读。

    读取已提交(READ-COMMITTED):允许读取并发事务已经提交的数据,可以阻止脏读,但可能会发生不可重复读或者幻读。

    可重复读(REPEATABLE-READ):对同一字段的读取结果是相同的,除非事务本身自己去修改数据,可以阻止脏读和不可重复读,但可能会发生幻读。

    可串行化(SERIALIZABLE):最高的隔离级别,完全服从事务的原子性,让所有的事务依次逐个执行,这样各事务之间完全不可能产生干扰,可串行化可以阻止脏读、不可重复读以及幻读。

    6. 你对索引的理解

    什么是索引:

    1.索引是一种特殊文件,它包含着对数据表里所有记录的引用指针。

    2.索引是一种数据结构,数据库索引是数据管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中的数据。

    3.索引相当于一个目录,为了方便查找书中的内容,通过内容建立索引形成目录。

    4.索引是一个文件,是需要占据物理空间的。

    索引的优缺点:

    优点:

    可以加快数据的检索速度

    使用索引在查询过程中,可以使用优化隐藏器,提高系统的性能。

    缺点:

    时间方面:创建和维护索引需要耗费时间,当对表中的数据进行增、删、改时,也需要动态的维护索引,这样会降低增、删、改的执行效率。

    空间方面:索引是需要占据物理空间的。

    索引的种类:

    主键索引:数据列不允许重复、不允许为空,一个表只能有一个主键。

    唯一索引:数据列不允许重复、允许为空,一个表允许多个列创建唯一索引。

    普通索引:基本的索引类型,没有唯一性的限制,允许为空。

    全文索引:是目前搜索引擎使用的一种关键技术。

    索引的数据结构为什么是B+树:

    索引的数据结构和存储引擎的实现有关,我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引。

    B树与B+树的区别, B+树与Hash索引的区别:

    B树和B+树的区别:

        在B树中可以将键和值存放在内部节点和叶子节点;在B+树中,内部节点都是键没有值,叶子节点同时存放键和值。

        B+树的叶子节点有一条链相连,B树的叶子节点各自独立。

    B+树和Hash索引的区别:

    1.Hash索引进行等值查询时较快,但不稳定,并且无法进行范围查询;B+树查询效率比较稳定且支持范围查询。

    2.Hash索引不支持使用索引进行排序,B+树支持。

    3.Hash索引不支持模糊查询以及最左前缀匹配原则,B+树支持。

    4.Hash索引避免不了回表查询,B+树在符合聚簇索引、覆盖索引等情况下可以通过索引完成查询。

    聚簇与非聚簇的区别:

    聚簇索引:

    将数据存储与索引放在一块,找到索引也就找到了数据。

    非聚簇索引:

    将数据存储和索引分开,当需要访问数据时,在内存中搜索索引,然后通过索引找到磁盘中的相应数据。

    回表查询:

    先通过普通索引的值定位聚簇索引的值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树。

     最左前缀原则:

    即最左优先,在检索数据时从联合索引的最左边开始匹配。

    索引失效的场景:

    1.使用了select 查询所有列

    2.索引列上有计算

    3.索引列用了函数

    4.字段类型不同

    5.like使用了模糊查询

    6.使用了or关键字

    7.没有满足最左前缀匹配原则

    索引的优化

    1.like语句的前导模糊查询不能使用索引。

    2.建议使用in来命中索引。

    3.负向条件的查询不能使用索引。

    4.联合索引最左前缀原则。

    5.索引列上不要有函数,不要在索引列进行计算

    6.不要使用索引中范围条件右边的列。


    7. 数据库锁的种类:

    按照是否独占式: 

    共享锁:当用户读取数据的时,加上共享锁,共享锁可以同时锁多个。

    排他锁:当用户写入数据的时,加上排他锁,排他锁只能锁一个,排他锁和其他的排他锁、共享锁都相斥。

    按照锁的粒度: 行、 页、表:

    行级锁:是MySQL中锁定粒度最细的一种锁,只对当前操作的行进行加锁,能减少数据库操作冲突。

    表级锁:是MySQL中锁定粒度最大的一种锁,只对当前操作的整张表加锁,该锁实现简单、资源消耗少,被大部分MySQL引擎支持。

    页级锁:是MySQL中锁定粒度介于行级锁和表级锁之间的一种锁。

    8. 什么是死锁, 怎么解决

    死锁:

    两个或及以上的事务在同一资源上相互作用,并请求锁定对方的资源,从而导致恶性循环。

    解决死锁的办法:

    1.让所有事物获取资源的顺序保持一致

    2.在事务中一次性锁定所有的资源

    3.使用乐观锁

    9. 什么是乐观锁, 悲观锁:

    悲观锁:

    比较悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。

    乐观锁:

    比较乐观,假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version版本的方式来进行锁定。

    10. 内连接与外连接的语法, 区别

    内连接语法:inner join

    外连接语法:left join/right join

    内连接与外连接的区别:

    内连接:连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

    外连接:连接结果包含符合连接条件的行和自身不符合条件的行。

    11. 左外连接与右外连接的语法, 区别:

    左外连接语法:left join

    右外连接语法:right join

    左外连接与右外连接的区别:

    左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。

    右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。

    12. 子查询的语法

    子查询返回单行单列:结果集是一个值,父查询使用:=、<、>等运算符。

    子查询返回多行单列:结果集类似于一个数组,父查询使用:in any all运算符。

    子查询返回多行多列:结果集类似一张虚拟表,不能使用where条件用于select子句做子表。

    13. 分组查询的语法:

    group by:指定一个或多个字段对数据进行分组。

    having:对分组数据进行条件过滤。

    聚会函数:和group by结合使用,统计和计算每个分组的数据。

    14. where 与 having的区别:

    相同点:都是设定条件筛选的语句。

    不同点:where是在分组前对数据进行筛选,后面不可以使用聚合函数。having是在分组后对数据进行筛选,后面可以使用聚合函数。

    聚合函数:count、sum、avg、max、min

    15. 说出常用的数据库函数

    日期:

    now():返回当前时间和日期

    curdate():返回当前日期

    curtime():返回当前时间

    date():提取日期表达式中的日期部分

    date_add():日期添加指定的时间间隔

    date_sub():日期减去指定的时间间隔

    datediff():返回两个日期之间的天数

    数学:

    ceiling(count(*)/5.0)取大于结果的最小整数

    floor(count(*)/5.0)取小于结果的最大整数

    sqrt(2)数值开平方

    round(3.45645,2):取两位有效数字

    abs(-5):取绝对值

    字符串:

    concat()返回多个字符串连接后的字符串

    lower()将字符串转换为小写的形式

    upper()将字符串转换为大写的形式

    length()返回字符串的长度

    substring(str,pos,len)str表示字符串,返回从pos开始的子串,len表示返回的长度

    trim([remstr from] str)返回删除str字符串两端remstr的字符后的子串

    replace(str,a_str,b_str)将字符中所有的a_str替换成b_str

    reverse()反转字符

    聚合 (统计, 分组):

    count()求总数

    sum()求和

    avg()求平均值

    max()求最大值

    min()求最小值

    16. count (*)  count(主键id) count(1) 的区别:

    count(*):求所有列的总数,不会忽略空值

    count(主键id):求列名为id字段的总行数,会忽略空值

    count(1):求所有记录的行数,不会忽略空值

    17. 创建表的语法:

    create table 表名(

    字段名1  类型[(宽度)约束条件],

    字段名2  类型[(宽度)约束条件],

    字段名3  类型[(宽度)约束条件]

    );

    18. 创建索引的语法:

    create index 索引名 on 表名(字段名)

    19. drop, delete, truncate的区别:

    虽然它们都有删除表的作用,但是truncate是保留表删除所有数据,delete是删除部分数据,drop删除整张表。

    20. 增删改查的语法:

    增:insert into

    删:delete

    改:update

    查:select

    21. 数据库备份和还原:

    冷备份:读写操作均不可进行

    热备份:读写操作均可执行

    温备份:只能读不能写

    22. SQL语句优化:

    1.使用where条件限定要查询的数据

    2.使用连接语句时,优先使用Inner join

    3.避免在 where 子句中使用比较运算操作符

    4.使用联合索引时,遵循最左匹配原则

    5.在 where 或order by 涉及的列上建立索引时,尽量避免全表扫描

    6.当插入数据过多时考虑批量插入

    23. 数据库优化:

    1.将字段很多的表分解成多个表

    2.增加中间表

    3.增加冗余字段

  • 相关阅读:
    torch.mean()、tensor.mean() 用法及维度的理解(二维、三维)
    今日睡眠质量记录90分
    低代码开发项目
    java---IO流:字节流
    Windows 权限维持手法
    解决服务器重装无法通过ssh连接的问题
    矩阵分析与应用-17-Moore-Penrose逆矩阵01
    分享一下便利店怎么做微信小程序
    报错Failed to allocate graph: MYRIAD device is not opened.
    Upcoming Tasks Privacy Policy
  • 原文地址:https://blog.csdn.net/qq_63771774/article/details/126358310