【面试】数据库(低频)

本文详细讲解了数据库的基础知识,包括视图、游标、DROP、DELETE、TRUNCATE的区别、触发器、CURD操作、数据类型、去重操作、GROUP BY与HAVING的使用,以及数据库事务的含义和一致性保证。此外,还深入探讨了存储过程、联合索引、页分裂的影响、主键选择、覆盖索引等进阶话题,以及如何防止数据库死锁和备份恢复策略。
摘要由CSDN通过智能技术生成

一、基础篇

1、什么叫视图?游标是什么?

视图:

  • 1)视图是多个基础表根据某些条件组合而成的结果集,一般来说只能select,不能进行update、insert、delete等操作,因为它是虚拟的内存表。

  • 2)视图 VS 表 <==> 快捷方式 VS 文件

游标:数据缓冲区,存放SQL语句执行结果,用户可以从中逐一获取记录进行处理。

2、drop、delete与truncate的区别
3、什么是触发器?
4、CURD是什么?C是什么?

Create-增加,Retrieve-读取,Update-更新,Delete-删除。

5、MySQL有哪些类型?

主要分为:数值型、日期时间和字符串型。
1
注意:

  • 无符号上限取值为原来2倍;货币精确等精确数字场景必须使用DECIMAL类型;
  • 时间分类:年月日-DATE,年月日时分秒-DATETIME,时分秒-TIME;TIMESTAMP与时区相关。
  • 字符串:CHAR创建时固定为表明长度,VARCHAR值为可变长字符串。
6、int和varchar;int占多少位?
类型大小有符号范围无符号范围
int4 bytes − 2 32 -2^{32} 232 ~ 2 31 − 1 2^{31} − 1 2311 0 0 0 ~ 2 32 − 1 2^{32} − 1 2321
varchar(M)0~65536 bytes0~M个字节的变长字符串
7、数据库去重操作;
  • 1)rowid:Oracle常用,其他需要声明字段。
# 删除表1和表2 中name相同的所有数据
delete from table1 a
where rowid !=( select max(rowid) from table2 b
				where  a.name1 = b.name1 and  a.name2 = b.name2 ……
			  )
  • 2)group by:主要用于分组统计,一般在聚合函数中使用
# 删除表中num列所有重复的数据
delete from student
Group by num
having count(num)>1
  • 3)distinct:一般用于比较小的表进行去重,过滤掉多余的重复记录
select distinct name from student
8、SQL的group by、order by作用;having和where区别?

1)group by VS order by

  • 作用:group by:分组,常与聚合函数结合使用;order by:排序;

2)having VS where

  • 对象:where作用于基表或视图,从中选择满足条件的元组;having作用于组,从中选择满足条件的组。
9、设计学生成绩管理系统,符合第三范式要求,并绘出UML图。

……

10、数据库事务(*2)含义?

数据库事务不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行结果必须使数据库从一致性状态变到另一种一致性状态。

11、如何保证一致性。

数据库层面:MVCC–RR、日志、2PL;应用层面:……

二、进阶篇(一)

1、存储过程

1、定义:事先编译并存储在数据库中一段SQL语句的集合。
2、优缺点

序号优点缺点
1重复使用,一次开发编译即可移植性差
2减少网络流量,只需传名称和参数到服务器引用关系对象改变时会影响,需要重新编译或报错
3安全性高,只有某些用户可使用维护难,数据结构变化,存储过程需要变化
2、联合/组合索引

举例:(name, age) 联合索引分析:
5

可以看到索引项是按照索引定义出现字段顺序排序。当你的逻辑需求是查到所有名字是“张三”的人时,可以快速定位到ID4,然后向后遍历得到所有需要的结果。
SQL查询条件是where name like ‘张%’,也能够用上这个索引,查找到第一个符合条件的记录是ID3,然后向后遍历,直到不满足条件为止。
可以看到,不只是索引全部定义,只要满足最左前缀,就可以利用索引加速检索。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

3、页分裂含义及负面影响?

叶分裂指B+树插入新值时,数据页已满,需要申请新的数据页,然后挪动部分数据过去的情况。这种情况会造成性能下降,数据页的利用率下降,补充一下,叶分裂的逆过程-合并也比较耗费性能。

4、什么场景适合业务字段直接做主键?

典型KV场景:1)只有一个索引;2)该索引必须是唯一索引。
由于没有其他索引,所以不用考虑其他索引叶子节点大小的问题。优先考虑“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。

5、覆盖索引

8

SQL:select ID from T where k between 3 and 5;
此时索引k已经“覆盖了”我们的查询请求,所以称为覆盖索引。覆盖索引不用回表,能减少树的搜索次数,显著提升查询性能,是常见的性能优化手段

6、手写创建索引语句;
CREATE INDEX index_name
ON table_name (column_name)
7、MongDB存储引擎。
特点WiredTigerinMemory
持久化存到Disk Files中存到Cache中
并发大多数读写操作使用乐观并发控制文件级别并发控制,多个写操作同一个文档必须以序列化方式执行
异常/崩溃通过日志文件可还原到Checkpoint操作之后发生的数据更新数据会丢失

三、进阶篇(二)

1、数据库死锁,如何防止?

答:

  1. 发生死锁情形
    1)一个线程两次加锁;
    2)两个线程互相申请对方的锁,但都不释放。

  2. 死锁产生必要条件 及 预防
    1)互斥:一次只有一个进程可使用一个资源,其他进程不能访问已分配给其他进程的资源。
    –>设备固有属性决定,不能改变。
    2)占用且等待:当一个进程在等待分配得到其他资源时,其继续占有已分配得到的资源。
    –>可以要求进程一次性请求所有需要的资源,比较低效。
    3)非抢占:不能强行抢占进程中已占有的资源。
    –> 如果占有某些资源的一个进程的进一步资源请求被拒绝,则该进程必须释放最初占有资源。
    –>如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。
    4)循环等待:存在一个封闭进程链,使得每个资源至少占有此链中下一个进程所需要的一个资源。
    –>如果一个进程已经分配了R类资源,那么接下来请求资源只能是排在R类型之后的资源类型,比较低效。

  3. 处理死锁4种办法:死锁预防、检测、避免、解除。

办法内容
预防破坏1个必要条件
检测检查结构,及时清除
避免进程启动拒绝、不允许分配【银行家算法】
解除资源剥夺法、撤销进程法
2、备份恢复

……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值