数据库面试题目

1  关系数据库的设计范式有哪些?

第一范式: 关系数据库表的每一列都是不可分割的基本数据项。第一范式是确保列中的值是不重复。

第二范式:必须是第一范式。而且数据库表中的每一行必须被唯一的区分。 通常将表的一个或者多个属性作为行的主键。(另一种说法:而且R中每一个非主属性完全函数依赖于R的某个候选键)

第三范式:必须是第二范式。一个表中的列不能依赖于另一个表中的非主键列。(另一种说法:每个非主属性都不传递依赖于R的候选键)

BCF: 必须是第一范式,而且每个属性都不传递依赖于关系R的候选键。

第四范式:设R是一个关系模式,D是R上的多值依赖集合。如果D中成立非平凡多值依赖X->->Y时,X必是R的超键。


2 存储过程和函数的区别是什么?

存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是它接收参数并返回某种类型的值,并且不涉及特定用户表。

如下表格是在Oracle中里面的:




存储过程的定义:

CREATE [OR REPLACE] Procedure [模式名.]过程名

                      [(参数名 [IN | OUT| IN OUT ] 数据类型 ...)]

{IS | AS}

                  [说明部分]

<PL/SQL块>;


函数的定义:

CREATE [OR REPLACE]  FUNCTION  [模式名.]过程名

                      [(参数名 [IN ] 数据类型 ...)]

                      RETURN 数据类型

{IS | AS}

                  [说明部分]

<PL/SQL块>;



3  什么是数据库事务?

答案:数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 满足ACID。

A 原子性: 事务的原子性是指一个事务要么全部执行,要么不执行。

C 一致性: 事务的一致性是指事务的运行并不改变数据库中数据的一致性。 (银行转账)

I 独立性:事务的独立性是指并发执行的事务相互之间不能干扰。

D 持久性: 事务的持久性是指 事务运行成功以后,系统的更新是永久的。


4 索引基本问题

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。建立索引的目的是加快对表中记录的查找排序。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
创建索引可以大大提高系统的性能。
创建索引的优点:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?
因为,增加索引也有许多不利的方面。
创建索引的缺点:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
什么情况下创建索引??一般来说,应该在这些列上创建索引
1  在经常需要搜索的列上,可以加快搜索的速度;
2  在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
3  在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
4   在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5   在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
 6   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引
什么情况下不宜创建索引??一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。


5 解释聚集索引和非聚集索引之间的区别

答案: 聚集索引的顺序就是数据的物理存储顺序,而对非聚集索引是索引顺序与数据的物理存储顺序无关。正因为如此,一个表最多只能有一个聚集索引。

聚集索引确定了数据的物理顺序。聚集索引类似于电话薄(按姓氏排序)。 由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话薄按照姓氏和名字进行组织一样。 聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理上相邻。


非聚集索引:非聚集索引与课本中索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按照索引键值的顺序存储,而表中的信息按另一种顺序存储。


eg: 在sql Server中,索引是通过二叉树的数据结构来描述的,我们可以这么理解聚集索引: 索引的叶节点就是数据节点。 而非聚集索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。



6  角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。

 

1 创建一个角色

Create ROLE R1;

 

2 使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限

GRANT SELECT ,PDATE,INSERT

ON TABLE Student

TO R1;

 

3  将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限

GRANT R1

TO 王平,张明, 赵玲;

 

4  当然,也可以一次性的通过R1来回收王平的这3个权限

REVOKE R1

FROM 王平;

 

角色的修改

GRANT DELETE

ON TABLE Student

TO R1

使角色R1在原来的基础上增加了Student表的DELETE权限

 

REVOKE SELECT

ON TABLE Student

FROM R1;

 

7  求成绩第二高的学生的名字

求:1、每个科目的最高分。 
      2、java成绩最高的姓名 
      3、java成绩第二高的姓名



1.每个科目的最高分:
    SELECT kemu,max(score) FROM table GROUP BY kemu;

    分析:找出成绩最高的人后,根据科目分组就可以得到每组的最高分的人。


2.java成绩最高的姓名:
     SELECT name FROM table WHERE kemu='java' and 
           score=(SELECT max(score) FROM table WHERE kemu='java');

     分析:从表格中查询名称时,提出两点条件1.科目是java,2.科目是java的最高分


3.java成绩第二高的姓名:
     SELECT name FROM table WHERE kemu='java' GROUP BY name 
           ORDER BY SCORE DESC LIMIT 1,1;

    分析:在查询姓名时根据[color=blue]  kemu='java'  [/color]这个条件,然后根据姓名分组,然后根据成绩排序,最后在列表中根据TOP 方法 LIMIT 选取从0开始的第二个姓名,只取1个人。OK了!这个题目主要考察了分组,排名和TOP取值方面的知识,难度相对最高。如果遇到这样的题,应该把大的问题一个个分散成小问题,然后一个个的解决小问题,然后拼凑起来,大问题就可以解决了。



8  稠密索引和稀疏索引


一、稠密索引
如果记录是排好序的,我们就可以在记录上建立稠密索引,它是这样一系列存储块:块中只存放记录的键以及指向记录本身的指针,指针就是一个指向记录或存储块地址。稠密索引文件中的索引块保持键的顺序与文件中的排序顺序一致。既然我们假定查找键和指针所占存储空间远小于记录本身,我们就可以认为存储索引文件比存储数据文件所需存储块要少得多。当内存容纳不下数据文件,但能容纳下索引文件时,索引的优势尤为明显。这时,通过使用索引文件,我们每次查询只用一次I/O操作就能找到给定键值的记录。
  www.2cto.com  
下图所示为一个建立在顺序文件上的稠密索引。
图1 顺序文件(右)上的稠密索引(左)
第一个索引块存放指向前四个记录的指针,第二个索引块存放指向接下来的四个记录的指针,依此类推。
稠密索引支持按给定键值查找相应记录的查询。给定一个键值K,我们先在索引块中查找K。当找到K后,我们按照K所对应的指针到数据文件中找到相应的记录。似乎在找到K之前我们需要检索索引文件的每个存储块,或平均一半的存储块。然而,由于有下面几个因素,基于索引的查找比它看起来更为有效:
 
1.索引块数量通常比数据块数量少。
2.由于键被排序,我们可以使用二分查找法来查找K。若有n个索引块,我们只需查找log2n个块。
3.索引文件可能足够小,以至可以永久地存放在主存缓冲区中。要是这样的话,查找键K时就只涉及主存访问而不需执行I/O操作。
 
二、稀疏索引
稀疏索引只为数据文件的每个存储块设一个键-指针对,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间。只有当数据文件是按照某个查找键排序时,在该查找键上建立的稀疏索引才能被使用,而稠密索引则可以应用在任何的查找键。如图2所示,稀疏索引只为每个存储块设一个键-指针对。键值是每个数据块中第一个记录的对应值。
图2 顺序文件上的稀疏索引
同图1实例一样,我们假定数据文件已排序,且其键值为连续的10的倍数,直至某个较大的数。我们还继续假定每个存储块可存放四个键-指针对。这样,第一个索引存储块中为前四个数据存储块的第一个键值的索引项,它们分别是10、30、50和70。按照前面假定的键值模式,第二个索引存储块中为第五至第八个数据存储块的第一个键值的索引项,它们分别是90、110、130和150。图中我们还列出第三个索引存储块存放的键值,它们分别是假设的第九至第十二个数据存储块的第一个键值。
  www.2cto.com  
在已有稀疏索引的情况下,要找出查找键值为K的记录,我们得在索引中查找到键值小于或等于K的最大键值。由于索引文件已按键排序,我们可以使用二分查找法来定位这个索引项,然后根据它的指针找到相应的数据块。现在我们必须搜索这个数据块以找到键值为K的记录。当然,数据块中必须有足够的格式化信息来标明其中的记录及记录内容,可以采用2.5节和2.7节中的任何技术。

10  B-Tree索引和Hash索引的区别  



Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。


可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。


(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。


由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。


(2)Hash 索引无法被用来避免数据的排序操作。


由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;


(3)Hash 索引不能利用部分索引键查询。


对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。


(4)Hash 索引在任何时候都不能避免表扫描。


前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。


(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。


对于选择性比较低(即选择度  %)的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。


hash相当于把key通过hash函数计算,得到key的hash值,再用这个hash值做指针,查找hash表中是否存在key,如果存在就返回 key所对应的value,选定一个好的hash函数很重要,好的hash函数可以使计算出的hash值分布均匀,降低冲突,只有冲突减小了,才会降低 hash表的查找时间。


b-tree完全基于key的比较,和二叉树相同的道理,相当于建个排序后的数据集,使用二分法查找算法,实际上也非常快,而且受数据量增长影响非常小。



9  行式数据库 和 列式数据库


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值