数据库面试题(更新中。。。)

来源:互联网 发布:手机海外电视直播软件 编辑:程序博客网 时间:2024/05/17 02:12

1. 视图的作用

  1. 使用视图可以使一些查询表达更加简洁
  2. 视图提供了一定程度的逻辑独立性
  3. 视图的安全保护作用
  4. 视图使得用户能够以不通角度看待相同的数据

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。

视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。


2. 事务的特性(ACID)

1. 原子性:事务是数据库的逻辑工作单元。整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2. 一致性:事务隔离执行时要保持数据库的一致性(正确性);也就是说,事务的执行结果必须使数据库从一个一致性状态转变到另一个一致性状态,但事务内部无须保证一致性。
3. 隔离性:一个事务的执行不能被其他事务干扰。也就是说,即使多个事务并发执行,任何事务的更新操作直到其成功提交,对其他事务都是不可见的。
4. 持久性:一个事务完成后,它对数据库的改变必须是永久的,即使系统出现故障,它对数据库的更新也将永久有效。


3. 两种基本的锁

  1. 共享锁(读锁)
  2. 排它锁(写锁)


4. 三个范式

即: 属性唯一, 记录唯一, 表唯一

第一范式(1NF):数据库表中的所有属性值都是原子的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

第二范式(2NF):要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y

简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。(我的理解是消除冗余)

5. 什么是嵌套查询?什么是相关子查询?

  • 我们称一个查询嵌套在另一个查询中的查询为嵌套查询。前者为子查询(内层查询),后者为父查询(外层查询)。
  • 相关子查询:其子查询的查询条件依赖于父查询
  • 不相关子查询:其子查询的查询条件不依赖于父查询

6. 存储过程与触发器的区别

触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

7. 什么是触发器?

触发器(trigger)是特殊类型的存储过程,当某个事件发生时它被自动执行。要设置触发器机制,必须满足两个要求:

  • 指明什么事件发生和满足什么条件执行触发器
  • 指明触发器执行什么样的动作

这种模型称作事件-条件-动作模型。数据库系统将像保存数据一样存储触发器。只要指定的事情发生,触发条件满足,相应的存储过程就被执行。除了支持完整性外,触发器还有其他作用。例如,一个定时触发器可以在每个周末自动地制作某些定制的报表,而不必在用户要求之后才被动的完成这些任务。

8. 几种DBS的区别

  • 集中式:数据库和应用程序均储存在一台计算机上
  • 分布式:数据库物理上存放在不同的场地的计算机中,而在逻辑上属于一个整体。每一场地都有自治处理能力并完成局部应用
  • 主从式(客户机/服务器):数据库存放在服务器上,应用程序存放在客户机上

9. 什么是存储过程?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。存储过程是独立于数据库而存在的。

10. 什么是游标?

游标是一个数据缓冲区,暂时存放SQL语句的执行结果,以便主语言可以逐一获取记录,进行处理。

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

11. 什么是索引?

索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。

在数据库关系图中,可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。

12. 索引的作用、优点

  1. 大大加快数据的检索速度;
  2. 创建唯一性索引,保证数据库表中每一行数据的唯一性;
  3. 加速表和表之间的连接,实现表与表之间的参照完整性;
  4. 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

13. 四种索引的区别

  • 普通索引:是最基本的索引类型,而且它没有唯一性之类的限制。
  • 唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。
  • 主键索引:数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
  • 聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。


  • 主键索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索引的关键字绝对不允许有重复值。
  • 候选索引:和主索引类似,它的值也不允许在指定的字段或表达式中重复。一个表中可以有多个 候选索引。
  • 唯一索引:唯一索引允许关键字取重复的值。当有重复值出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的 版本。
  • 普通索引:普通索引允许关键字段有相同值。在一对 多关系的多方,可以使用普通索引

14. 什么是复合索引?其作用是什么?

索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作复合索引

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。

例子:

CREATE INDEX name
ON employee (emp_lname, emp_fname)

复合索引的结构与电话簿类似,它首先按姓氏对雇员进行排序,然后按名字对所有姓氏相同的雇员进行排序。如果您知道姓氏,电话簿将非常有用,如果您知道名字和姓氏,电话簿则更为有用,但如果您只知道名字而不知道姓氏,电话簿将没有用处。所以复合索引,字段的先后顺序是很重要的。

列的顺序:在创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

15. 在关系模型中,每一个二维表称为一个?

元组是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组 ,每列就是一个属性。 在二维表里,元组也称为记录。

16. GROUP BY 子句和 ALL 关键字

Transact-SQL 在 GROUP BY 子句中提供 ALL 关键字。只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。

如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。


17. 事务隔离

  • 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
  • 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
  • 提交读(Read Committed):只能读取到已经提交的数据
  • 可重复读(Repeated Read):在同一个事务内的查询都是事务开始时刻一致的


18. 事务并发

  • 更新丢失: 一个事务的更新覆盖了另一个事务的更新。
  • 脏读: 一个事务读取了另一个事务未提交的数据。
  • 不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致。
  • 幻象读: 一个事务两次读取一个范围的记录,两次读取的记录数不一致。

19. 视图包含下列结构是不可以更新的

  1. 集合运算符 union,union all, intersect,minus
  2. distinct关键字
  3. group by,order by,connect by,或者start with
  4. 子查询
  5. 分组函数
  6. 需要更新的列不是视图定义的
  7. 具有连接查询(可以更新键值保存表的数据)
  8. 违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改的功能)

如果视图是从多个基本表使用联接操作导出的,则不允许更新。如果导出的视图使用了分组和聚合操作,也不允许更新。如果视图是从单个基本表使用选择和投影操作导出的,并且包括了基本表的主键或某个候选键,则可以执行操作。


20. 聚集索引和非聚集索引

聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。

非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引,因为这是读者查找信息的两种最常用的方法。


21. 数据库执行SQL语句的过程

先解析编译后,处理优化,最后执行返回结果


22. SQL语句执行顺序

SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述。

( 8 ) SELECT
( 9 ) DISTINCT
( 11 ) < Top Num > < select list >
( 1 ) FROM [ left_table ]
( 3 ) < join_type > JOIN < right_table >
( 2 ) ON < join_condition >
( 4 ) WHERE < where_condition >
( 5 ) GROUP BY < group_by_list >
( 6 ) WITH < CUBE | RollUP >
( 7 ) HAVING < having_condition >
( 10 ) ORDER BY < order_by_list >

逻辑查询处理阶段简介
1. FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
2. ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。
3. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
4. WHERE:对VT3应用WHERE筛选器。只有使为true的行才被插入VT4.
5. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
6. CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
7. HAVING:对VT6应用HAVING筛选器。只有使为true的组才会被插入VT7.
8. SELECT:处理SELECT列表,产生VT8.
9. DISTINCT:将重复的行从VT8中移除,产生VT9.
10. ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

例子:

select foo,count(foo)from pokes where foo>10group by foo having count (*)>5 order by foo

这条语句的执行顺序是:
FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY


23. 数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据包括哪些?

日志文件,数据库后备副本


24. 数据库DB,数据库系统DBS,数据库管理系统DBMS三者之间的关系是什么?

DBS包括DB和DBMS

数据库系统是指在计算机系统中引入数据库后的系统,一般由数据库(DB),数据库管理系统(DBMS),应用系统,数据库管理员(DBA)构成。

1 0
原创粉丝点击