您的位置:首页 > 职场人生

数据库常见面试题

2015-07-28 13:18 281 查看
第一范式:数据库表中的每一列都是不可再分的基本数据项,值或者不能有重复的属性 ,比如说在一个表中有电话这个字段,其值既有手机号,又有座机号,这就不符合了。

总结:字段不能再分。

第二范式:在第一范式的基础上建立起来的,即满足第二范式必须要先满足第一范式,第二范式要求数据库表中的每个实例或行必须可以被惟一的区分 为实现区分通常需要为表加上一个列 以存储各个实例的惟一标识。

总结:不能部分依赖,就是说当一个表有组合主键时,其他非主键的字段必须完全依赖于主键。

第三范式:第三范式是要符合第二范式,第三范式就是一个数据表中不能存在其他数据表中的非主键字段,比如说表中a,b,c三个字段,a->b,b->c那么c与a就是传递依赖,不符和。

总结:不可以有传递依赖,也就是说主键以外的字段必须完全依赖于主键,而不能依赖其他字段。

sql的优化问题(其实也就是索引的优化,因为我们不可能修改数据结构的情况下,提高数据库的查询效率似乎也只能用索引了)

1,创建索引:对于查询占主要的应用来说,索引显得尤为重要,可以有效地避免每次查询都全表扫描的情况出现,如果表的数据很大,而符合条件的数据又很少,那么不加索引就会引起性能下降。

2,复合索引

比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。

3,索引不会包含有NULL值的列,

4,使用短索引, 对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。

5,不要在列上进行运算,在列上进行运算将会导致索引失效,进行全盘扫描。

6,不使用NOT IN和<>操作,将会导致索引失效,进行全盘扫描。

事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.

事务的四大属性:

1 原子性(Atomicity):事务是一个完整的操作。

2 一致性(Consistency):当事务完成时,数据必须处于一致状态。

3 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。

4 持久性(Durability):事务完成后,它对于系统的影响是永久性的。

三、创建事务

T-SQL中管理事务的语句:

1 开始事务:begin transaction

2 提交事务:committransaction

3 回滚事务:rollback transaction

事务分类:

1 显式事务:用begin transaction明确指定事务的开始。

2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。

3 自动提交事务:SQLServer的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。

示例:张三转800元到李四帐户上。

use stuDB

go

–创建帐户表bank–

if exists(select* from sysobjects where name=’bank’)

drop table bank

create table bank

(

customerName char(10), –顾客姓名

currentMoney money –当前余额

)

go

/*//–添加约束,帐户不能少于元–*/

alter table bank add

constraint CK_currentMoneycheck(currentMoney>=1)

/*//–插入测试数据–*/

insert into bank(customerName,currentMoney)

select ‘张三’,1000union

select ‘李四’,1

select * from bank

go

/*//–使用事务–*/

use stuDB

go

–恢复原来的数据

–update bank set currentMoney=currentMoney-1000 where customerName=’李’

set nocount on –不显示受影响的行数

print ‘查看转帐事务前的余额’

select * from bank

go

/*//–开始事务–*/

begin transaction

declare @errorSum int –定义变量,用于累计事务执行过程中的错误

/*//–转帐–*/

update bank set currentMoney=currentMoney-800 where customerName=’张三’

set @errorSum=@errorSum+@@error –累计是否有错误

update bank set currentMoney=currentMoney+800 where customerName=’李四’

set @errorSum=@errorSum+@@error –累计是否有错误

print ‘查看转帐事务过程中的余额’

select * from bank

/*//–根据是否有错误,确定事务是提交还是回滚–*/

if @errorSum>0

begin

print ‘交易失败,回滚事务.’

rollback transaction

end

else

begin

print ‘交易成功,提交事务,写入硬盘,永久保存!’

commit transaction

end

go

print ‘查看转帐后的余额’

select * from bank

go

索引定义:SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者字画查找)。

索引作用:通过索引可以大大的提高数据库的检索速度,提高数据库的性能。

索引的类型:

1:唯一索引:唯一索引不允许两行有相同的索引值(其实也就是说唯一索引的这一列,每个值都是唯一的);

例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。

2:主键索引:定义表主键的时候,会自动创建主键索引(其实主键索引就是唯一索引的特例),主键索引要求每一个值都是唯一的且非空。

主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

3:聚集索引:表中各行的物理顺序与键值的逻辑顺序相同,每个表只能有一个。

在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。

4:非聚集索引:非聚集索引指定表的逻辑顺序,数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。

如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。

提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引

索引的优缺点:

优点:加快访问速度;

加强行的唯一性

缺点:带索引的表在数据库中的存储需要更多的空间;

创建索引的原则:

下列情况下可以使用索引:

该列频繁用于搜索;

该列用于对数据进行排序;

下列情况下避免使用索引:

列中仅仅包含几个不同的值;

表中仅包含几行。为小型表创建索引可能不太划算,因为SQLServer在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长。

hashtable和hashset的区别:

这两个从不同的接口继承下来的,两者完全不一样,前者数据以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: