数据库面经---10则

数据库范式有哪些:​​​​​​​

  1. 第一范式(1NF):
    1. 数据表中的每一列都是不可分割的原子值。
    2. 每一行数据在关系表中都有唯一标识,通常是通过主键来实现。
  2. 第二范式(2NF):
    1. 满足第一范式。
    2. 非主键列完全依赖于全部主键而不是部分主键。也就是说,非主键列不能依赖于主键中的一部分属性。
  3. 第三范式(3NF):
    1. 满足第二范式。
    2. 非主键列之间没有传递依赖关系。换句话说,如果 A→B 且 B→C,则不能有 A→C。

group by和order by

前者分组,后者排序

where和having的区别

  1. WHERE:WHERE子句通常用于SELECT、UPDATE和DELETE语句中。
    1. WHERE用于在查询之前对行进行过滤,根据指定的条件选择满足条件的行。
    2. WHERE可以使用比较运算符(如等于、大于、小于等)和逻辑运算符(如AND、OR、NOT)来构建条件。
  2. HAVING:HAVING子句通常用于SELECT语句中结合GROUP BY子句使用,用于对分组后的结果进行筛选。
    1. HAVING用于在分组聚合查询之后对结果进行过滤,根据指定的条件筛选满足条件的分组。
    2. HAVING一般用于统计函数(如SUM、COUNT、AVG)的结果上进行筛选。

存储器、视图、游标

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。想要实现相应的功能时,只需要调用这个存储过程就行了(类似于函数,输入具有输出参数)。

优点

  • 预先编译,而不需要每次运行时编译,提高了数据库执行效率。
  • 封装了一系列操作,对于一些数据交互比较多的操作,相比于单独执行SQL语句,可以减少网络通信量。
  • 具有可复用性,减少了数据库开发的工作量。
  • 安全性高,可以让没有权限的用户通过存储过程间接操作数据库。
  • 更易于维护。

缺点

  • 可移植性差,存储过程将应用程序绑定到了数据库上。
  • 开发调试复杂。
  • 修改复杂,需要重新编译,有时还需要更新程序中的代码以更新调用。

触发器:

触发器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)来触发运行的操作(不能被直接调用,不能接收参数)。在数据库里以独立的对象存储,用于保证数据完整性(比如可以检验或转换数据)。

视图

从数据库的基本表中通过查询选取出来的数据组成的虚拟表(数据库中只存放视图的定义,而不存放视图的数据)。可以对其进行增/删/改/查等操作。视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变)。

可以跟基本表一样,进行增删改查操作(增删改操作有条件限制,一般视图只允许查询操作),对视图的增删改也会影响原表的数据。它就像一个窗口,透过它可以看到数据库中自己感兴趣的数据并且操作它们。

优点:

简单化,数据所见即所得

安全性,用户只能查询或修改他们所能见到得到的数据

逻辑独立性,可以屏蔽真实表结构变化带来的影响

缺点:

性能相对较差,简单的查询也会变得稍显复杂

修改不方便,特变是复杂的聚合视图基本无法修改

游标:

 用于定位在查询返回的结果集的特定行,以对特定行进行操作。使用游标可以方便地对结果集进行移动遍历,根据需要滚动或对浏览/修改任意行中的数据。主要用于交互式应用。它是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响的数据,简单来说,就是将受影响的数据暂时放到了一个内存区域的虚表当中,这个虚表就是游标。

  游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。即游标用来逐行读取结果集。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

  游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。通俗来说,游标就是能在sql的查询结果中,显示某一行(或某多行)数据,其查询的结果不是数据表,而是已经查询出来的结果集。

内连接、外连接、左连接、右连接

内连接:

包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

外连接:

外联接可以是左向外联接、右向外联接或完整外部联接。

左连接:

左边所有数据行

右连接:

右边所有数据行

索引的数据结构

  1. B+树索引(B+ Tree Index):B+树是一种平衡多路查找树,它具有以下特点:
    1. 所有叶子节点都位于同一层,且通过指针连接。
    2. 非叶子节点不存储具体的数据,只存储索引键和指向子节点的指针。
    3. 叶子节点按照索引键的顺序存储了所有数据,并且相邻叶子节点之间有一个双向链表连接。

B+树索引适合范围查询和排序操作,可以快速定位到指定的索引键或者一个范围内的索引键。

  1. 哈希索引(Hash Index):

哈希索引是使用哈希表作为底层实现的索引结构。它通过将索引键映射为哈希桶的位置来加快查询速度。每个哈希桶中存储了符合哈希值的索引键所关联的数据位置。

哈希索引适合等值查询,可以在常数时间内精确定位到指定的索引键。然而,哈希索引不支持范围查询和排序操作,并且对于哈希冲突需要进行额外的处理。

B树和B+树是什么意思,区别在哪?

B 树的每个节点都包含数据(索引+记录),而用户的记录数据的大小很有可能远远超过了索引数据,这就需要花费更多的磁盘 I/O 操作次数来读到「有用的索引数据」。

而且,在我们查询位于底层的某个节点(比如 A 记录)过程中,「非 A 记录节点」里的记录数据会从磁盘加载到内存,但是这些记录数据是没用的,我们只是想读取这些节点的索引数据来做比较查询,而「非 A 记录节点」里的记录数据对我们是没用的,这样不仅增多磁盘 I/O 操作次数,也占用内存资源。

B+树:

B+树是在B树的基础上进行改进和优化的一种变体,它具有以下特点:

  • 所有叶子节点通过指针连接形成一个有序链表,方便范围查询。
  • 只有叶子节点存储索引键和对应的数据,非叶子节点只存储索引键,不存储数据。
  • 非叶子节点的索引键用于搜索和定位到正确的子节点。

B+ 树与 B 树差异的点,主要是以下这几点:

  • 叶子节点(最底部的节点)才会存放实际数据(索引+记录),非叶子节点只会存放索引;
  • 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表;
  • 非叶子节点的索引也会同时存在在子节点中,并且是在子节点中所有索引的最大(或最小)。
  • 非叶子节点中有多少个子节点,就有多少个索引;

聚簇索引和非聚簇索引

聚簇索引:找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。聚簇索引按照索引键的顺序对表中的数据行进行物理排序,并将数据行直接存储在叶子节点上。每张表只能有一个聚簇索引,

非聚簇索引:索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。非聚簇索引不改变表中数据行的物理存储顺序,而是在索引中存储索引键和指向对应数据行的指针。一个表可以有多个非聚簇索引。

适合/不适合创建索引的情况

  1. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
  2. where条件里用不到的字段,不创建索引;
  3. 表记录太少,不需要创建索引;
  4. 数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适。立索引。

什么时候适用索引?

  • 字段有唯一性限制的,比如商品编码;
  • 经常用于 WHERE 查询条件的字段,这样能够提高整个表的查询速度,如果查询条件不是一个字段,可以建立联合索引。
  • 经常用于 GROUP BY 和 ORDER BY 的字段,这样在查询的时候就不需要再去做一次排序了,因为我们都已经知道了建立索引之后在 B+Tree 中的记录都是排序好的。

什么时候不需要创建索引?

  • WHERE 条件,GROUP BY,ORDER BY 里用不到的字段,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的,因为索引是会占用物理空间的。
  • 字段中存在大量重复数据,不需要创建索引,比如性别字段,只有男女,
  • 表数据太少的时候,不需要创建索引;
  • 经常更新的字段不用创建索引,比如不要对电商项目的用户余额建立索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引,这个过程是会影响数据库性能的。

事物的概念

事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

你可能感兴趣的:(数据库SQL,数据库,oracle)