SQL面试题

SQL面试题
1. 简述视图的意义

<1>.视图的优点
A.数据安全性。
对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
B.查询简单化。
为复杂的查询建立一个视图,用户不必输入复杂的查询语句,只需针对此视图做简单的查询即可。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
C.逻辑数据独立性。
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
对于视图的操作,例如,查询只依赖于视图的定义,当构成视图的基本表需要修改时,只需要修改视图定义中的子查询部分,而基于视图的查询不用改变。

<2>.视图的缺点
A.性能。
SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
B.修改限制。
当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的,这些视图有如下特征:
  a.有UNIQUE等集合操作符的视图。
  b.有GROUP BY子句的视图。
  c.有诸如AVG\SUM\MAX等聚合函数的视图。
  d.使用DISTINCT关键字的视图。
  e.连接表的视图(其中有些例外)
(3).创建视图的限制:
在创建视图时,还要注意试图必须满足以下几点限制:
<1>.不能将规则或者DEFAULT定义关联于视图。
<2>.定义视图的查询中不能含有ORDER BY\COMPURER\COMPUTER BY 子句和INTO关键字
<3>.如果视图中某一列是一个算术表达式、构造函数或者常数,而且视图中两个或者更多的不同列拥有一个相同的名字(这种情况通常是因为在视图的定义中有一个连接,而且这两个或者多个来自不同表的列拥有相同的名字),此时,用户需要为视图的每一列指定列的名称。

作用:
(1)视图能够简化用户的操作。
(2)视图使用户能以多种角度看待同一数据。
(3)视图对重构数据库提供了一定程度的逻辑独立性。
(4)视图能够对机密数据提供安全保护。

2. 简述索引的原理以及创建索引的意义

索引是以表列为基础的数据库对象,它保存着表中排序的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序,其主要目的是提高SQL Server系统的性能,加快数据的查询速度和减少系统的响应时间。索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致SQL Server搜索表中的所有记录,以获取匹配结果。
索引除了可以提高查询表内数据的速度以外,还可以使表和表之间的连接速度加快。例如,在实现数据参照完整性时,可以将表的外键制作为索引,这样将加速表与表之间的连接。
虽然索引有很多优点,但索引的存在也让系统付出了一定的代价。创建索引和维护索引都会消耗时间,当对表中的数据进行增加、删除和修改操作时,索引就要进行维护,否则索引的作用就会下降;另外,每个索引都会占用一定的物理空间,如果占用的物理空间过多,就会影响到整个SQL Server系统的性能。

原理参考:https://www.cnblogs.com/wlwl/p/9465583.html

3.事务会出现哪些并发性问题,怎么解决。

脏读:事务A读取了事务B更新、未提交的数据,然后B回滚操作,那么A读取到的数据是脏数据(没有用的数据)

不可重复读:事务 A 多次读取同一数据,结果读取的数据不一致,也就是说不支持重复读,重复读会有错误。 原因是 事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据不一致。

幻读:事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。 需要表锁才能隔离,所以大都数数据库都 没有将幻读隔离。

为了解决以上3个并发问题,要用到事务隔离,有以下四种隔离级别

Serializable (串行化) 可避免脏读、不可重复读、幻读的发生。但是效率最低
Repeatable read (可重复读) 可避免脏读、不可重复读的发生。(最常用的mysql默认的级别就是4)
Read committed (读已提交) 可避免脏读的发生。
Read uncommitted (读未提交) 最低级别,任何情况都无法保证,但效率最高,最不安全。

11. 简述主键选取的原则

  1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
  2. 永远也不要更新主键。实际上,因为主键除了唯一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
    注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
  3. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
  4. 主键应当由计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了唯一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

13. 简述外键约束的意义

如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。

作用:保证数据的完整性和一致性。
外键约束的意义
1、外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两
个字段的关系。
2、比如emp表的deptno列参照dept表的deptno列,则dept称作主表或父表,
emp表称作从表或子表。

15. 简述外键约束对性能的影响,以及应对策略

1、如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库
自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些
判断将增加额外负担,可以省去。
2、另外外键确定了主从表的先后生成关系,有时会影响业务逻辑。
决解办法
会去掉外键关联关系后,数据由程序来负责

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值