第一范式:数据库表中的每一列都是不可再分的基本数据项,值或者不能有重复的属性 ,比如说在一个表中有电话这个字段,其值既有手机号,又有座机号,这就不符合了。
总结:字段不能再分。
第二范式:在第一范式的基础上建立起来的,即满足第二范式必须要先满足第一范式,第二范式要求数据库表中的每个实例或行必须可以被惟一的区分 为实现区分通常需要为表加上一个列 以存储各个实例的惟一标识。
总结:不能部分依赖,就是说当一个表有组合主键时,其他非主键的字段必须完全依赖于主键。
第三范式:第三范式是要符合第二范式,第三范式就是一个数据表中不能存在其他数据表中的非主键字段,比如说表中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的区别:
这两个从不同的接口继承下来的,两者完全不一样,前者数据以
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qinlinlinwoaini/article/details/47103939