数据库常见面试题-数据库常见面试题
1. 超键、候选键、主键、外键
超键:关系中能够唯一标识一个元组的属性集,称为关系模式的超键。 一个属性可以作为超键,多个属性的组合也可以作为超键。 超级键包括候选键和主键。
候选键:是最小的超键,即没有冗余元素的超键。
主键:数据列或属性的组合,唯一且完整地标识数据库表中存储的数据对象。 一个数据列只能有一个主键,主键的值不能缺失,即不能为空值(Null)。
外键:存在于一张表中的另一张表的主键,称为该表的外键。
2.什么是交易? 什么是锁?
事务:它是一组作为逻辑工作单元绑定在一起的 SQL 语句。 任何一条语句操作失败,整个操作都会失败,后续操作会回滚到操作前的状态,或者上面有一个节点。 为了确保某事被执行或不被执行,可以使用事务。 要将组语句视为事务,需要通过 ACID 测试,即原子性、一致性、隔离性和持久性。
锁:在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。 就像现实生活中的一把锁,可以让某些数据拥有者在一定时间内无法使用某些数据或数据结构。 当然,锁也分等级。
3.数据库事务的四个特点及意义
原子性:整个事务中的所有操作要么完成要么不完成,不可能停滞在中间的某个环节。 如果事务执行过程中出现错误,则会回滚(Rollback)到事务开始前的状态,就好像事务从未执行过一样。
一致性:事务开始前和事务结束后,不违反数据库的完整性约束。
隔离:隔离执行事务,使它们看起来是系统在给定时间执行的唯一操作。 如果有两个事务同时运行并执行相同的功能,事务隔离将确保每个事务都被认为是系统中唯一使用该系统的事务。 此属性有时称为序列化,为了防止事务操作之间的混淆,请求必须被序列化或序列化以便一次只有一个请求针对相同的数据。
持久化:事务完成后,事务对数据库所做的修改永久保存在数据库中,不会回滚。
4. 什么是视图?
视图是具有与物理表相同功能的虚拟表。 可以添加、修改、检查和操作视图。 视图通常是一个或多个表的行或列的子集。 对视图的修改不会影响基础表。 相比多表查询,它更方便我们获取数据。
视图一般用于以下两种场景:
(1)我们不希望访问者获取整张表的信息,只是将部分字段暴露给访问者数据库常见面试题,所以我们构建了一个虚拟表,也就是一个视图。
(2)查询的数据来自不同的表,查询者想统一查询。 这样也可以创建一个视图,将多个表的查询结果合并起来。 查询者只需直接从视图中获取数据即可,无需考虑数据源自不同表所带来的差异。
注意:此视图是在数据库中创建的,而不是在代码中创建的。
5.触发器的作用是什么?
触发器是一种特殊的存储过程,主要由事件触发并执行。 它可以强制执行约束以维护数据的完整性和一致性,并可以跟踪数据库内的操作,从而不允许未经授权的更新和更改。 级联操作是可能的。 例如,一个表上的触发器包含对另一个表的数据操作,这个操作会导致该表上的触发器被触发。
6. 维护数据库的完整性和一致性,你更喜欢使用触发器还是自写业务逻辑? 为什么?
尽量使用约束,比如check、primary key、foreign key、non-null field等来约束,这样最高效方便。 第二种是使用触发器。 这种方式可以保证无论什么业务系统访问数据库,都可以保证数据的完整性和一致性。 最后考虑的是自写业务逻辑,但是这样比较麻烦,编程复杂,效率低。
7、索引的作用是什么? 它的优点和缺点是什么?
数据库索引是数据库管理系统中的一种排序数据结构,用于帮助快速查询和更新数据库表中的数据。 索引的实现通常使用B-tree及其变体B+树。
除了数据之外,数据库系统还维护着满足特定搜索算法的数据结构,这些数据结构以某种方式引用(指向)数据,从而可以在这些数据结构上实现高级搜索算法。 这个数据结构是一个索引。
为表设置索引是要付出代价的:一是增加数据库的存储空间,二是在插入和修改数据时要花费更多的时间(因为索引也会随之变化)。
创建索引可以大大提高系统的性能(优点):
首先,通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
其次,它可以大大加快数据检索的速度,这是创建索引的主要原因。
第三,可以加快表与表之间的连接,特别是在实现数据的参照完整性方面。
第四,当使用分组排序子句进行数据检索时,查询中分组排序的时间也可以大大减少。
第五,通过使用索引,可以在查询过程中使用优化隐藏器来提高系统的性能。
可能有人会问:加索引有这么多好处,为什么不为表中的每一列都创建一个索引呢? 因为加索引也有很多缺点:
首先,创建和维护索引需要时间,而且这个时间随着数据量的增加而增加。
其次,索引需要占用物理空间。 除了数据表占用的数据空间外,每个索引还占用一定的物理空间。 如果要建立聚簇索引,需要的空间就更大了。
第三,对表中的数据进行增删改查时,还必须动态维护索引,降低了数据维护的速度。
索引建立在数据库表中的某些列上。 创建索引时,应该考虑哪些列可以被索引,哪些列不能被索引。
通常,应在这些列上创建索引:
(1) 在经常需要查找的栏目上,可以加快查找速度;
(2) 在作为主键的列上,强制列的唯一性和数据在组织表中的排列结构;
(3) 在连接中经常用到的列上,这些列主要是一些外键,可以加快连接速度;
(4)在经常需要根据范围查找的列上建立索引,因为索引已经排序,指定的范围是连续的;
(5)在经常需要排序的列上建立索引,因为索引已经排序了,这样查询就可以利用索引的排序来加快排序查询时间;
(6)在WHERE子句中经常使用的列上建立索引,加快条件的判断。
此外,还有一些列不应被索引:
首先数据库常见面试题,不应为查询中很少使用或引用的列创建索引。 这是因为,由于很少使用这些列,索引或不索引都不会提高查询速度。 相反,由于索引的增加,系统的维护速度降低,空间需求增加。
其次,索引不应该添加到数据值很少的列。 这是因为,由于这些列的值很少,比如人员表的性别列,在查询结果中,结果集的数据行占表中数据行的比例很大,即,表中需要查找的数据 行的比例是巨大的。 增加索引并不能显着加快检索速度。
第三,不应向定义为文本、图像和位数据类型的列添加索引。 这是因为这些列中的数据量要么非常大,要么取的值非常少。
第四,当修改性能远大于检索性能时,不应该创建索引。 这是因为修改性能和检索性能是相互矛盾的。 添加索引时,检索性能会提高,但修改性能会降低。 减少索引时,会提高修改性能,降低检索性能。 因此,当修改性能远大于检索性能时,不应创建索引。
8.drop、delete、truncate的区别
drop 直接删除表。
truncate删除表中的数据,再次插入时自增id从1开始。
delete删除表中的数据,可以加上where子句。
(1)DELETE语句每次执行从表中删除一行的过程,同时将该行的删除操作保存在日志中,作为回滚操作的事务记录。 TRUNCATE TABLE一次性删除表中的所有数据,日志中不记录单独的删除操作记录,被删除的行无法恢复。 并且在删除过程中不会激活与表相关的删除触发器。 快速执行。
(2) 表和索引占用的空间。 当表被TRUNCATE时,表和索引占用的空间会恢复到原来的大小,DELETE操作不会减少表或索引占用的空间。 drop 语句释放表占用的所有空间。
(3) 一般情况下,drop > truncate > delete
(四)适用范围。 TRUNCATE 只能用于 TABLE; DELETE 可用于表和视图
(5)TRUNCATE和DELETE只删除数据,而DROP删除整个表(结构和数据)。
(6) truncate and delete without where:只删除数据,不删除表的结构(definition) drop语句会删除表的结构是约束(constrain)、触发器(trigger)、索引(index)依赖于; 该表上的依赖存储过程/函数将被保留,但它们的状态将变为:无效。
(7) delete语句是DML(data maintain Language),这个操作会放在回滚段,事务提交后才会生效。 如果有对应的触发器,则在执行时触发。
(8) truncate和drop是DLL(data define language),操作立即生效。 原始数据没有放在回滚段中,不能回滚。
(9) 没有备份时,慎用drop和truncate。 删除一些数据行,使用delete,注意结合where限制影响范围。 回滚段应该足够大。 要删除表,请使用 drop; 如果要保留表,删除表中的数据,如果与事务无关,可以使用truncate。 如果是业务相关,或者老师要触发trigger,还是用delete。
(10) Truncate table表名快速高效,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:两者都删除表中的所有行。 但是,TRUNCATE TABLE 比 DELETE 更快并且使用更少的系统和事务日志资源。 DELETE 语句一次删除一行,并在事务日志中为删除的每一行记录一个条目。 TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且只在事务日志中记录页面释放。
(11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。 用于新行标识的计数值重置为列的种子。 如果要保留标识计数值,请改用 DELETE。 如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(12)对于FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应使用不带WHERE子句的DELETE语句。 由于未记录 TRUNCATE TABLE,因此它无法触发触发器。