/**********存储过程*********/
sp_系统存储过程
xp_系统扩展存储过程
存储过程是序编译SQL语句的集合,要比函数的执行速度要快,分为系统存储过程和用户自定义存储过程
exec执行字符串,也可执行存储过程
createproc创建存储过程
OBJECT_ID()用来检测对象是否存在,包括存储过程或者数据表等等。参数'p'表示存储过程。
如:
/**********执行存储过程'test'例一*********/
IFOBJECT_ID('test','P')ISNOTNULL
createproctestasselect*fromS_INFO
go
exectest
/**********执行存储过程'test'例二*********/
IFOBJECT_ID('test','P')ISNOTNULL
createproctest
@aINT,@bINT//此存储过程需要传入两个整型参数
asselect@a+@b
go
exectest12+25//传入两个参数
/**********执行存储过程分页*********/
createprocpage
@currentpageint=1,//当前第几页
@countint=10//每页有几条
as
declare@sqlnvarcher(1000)
set@sql='selecttop'+cast(@countasnvarchar(3))
set@sql=@sql+'*froms_infowheres_idnotin('
set@sql=@sql+n'selecttop'+cast(((@currentpage-1)*@count)asnvarchar(3))
set@sql=@sql+n's_idfroms_info'
exec(@sql)
go
execpage1,3
/**********触发器*********/
自动机制用触发器实现,即触发器是一种自动机制,实现表与表之间的约束。
事务把几个操作当作一个整体,要么一起执行,要么一个也不执行
SETXACT_ABORT(ON/OFF)//当事务出现错误时,是否自动回滚
BEGINTRANSACTION//开始一个事务
...
...
COMMITTRAN
事务隔离级别:提交读,可重复读,可串行读。
提交读可避免脏读。
设置事务隔离级别:SETTRANSACTIONISOLATIONLEVEL
readuncommitted:允许脏读,即允许读取别人修改但未提交的行;
readcommitted:待别人提交后再读,可以避免脏读;
repeatableread:其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据;
snapshot:
serialzable:
//以下为创建一个触发器:在更新CARD表的同时把结果查出来
CREATETRIGGERTEST
ONCARDFORUPDATEAS
SELECT*FROMCARD
/**********视图*********/
创建视图:(注:视图是个虚拟的表,并没有实际存储内容)
CREATEVIEWVW_TEST
AS
SELECTS_NAME,SCORE
FROMCOURSECINNERJOINS_INFOS
ONC.S_ID=S.S_ID
GO
SELECT*FROMVW_TEST
/**********索引*********/
索引类型:聚集索引;非聚集索引;唯一索引
索引的作用是增加搜索效率,但要牺牲一定的空间,即用空间换效率。
每个表只能有一个聚集索引,可以有多个非聚集索引
聚集索引的意思是:物理存储和逻辑存储相关联,即如果聚集存储(逻辑存储)为升序,则在硬盘上的物理存储顺序也为升序,反之则为降序。
非聚集索引的意思是:物理存储和逻辑存储不关联,即假如逻辑存储为升序,则物理存储的存储方式不一定为升序。
唯一索引和主键约束的区别:唯一性索引可以为空,但只可有一个为空,因为空值也必须是唯一的
索引默认是升序、且是非聚集索引
创建索引:
CREATEINDEXIN_TEST
ONS_INFO(S_NAME)
GO
SELECT*FROMS_INFOwhith(index(in_test))
/**********模糊查询*********/
select*fromS_INFOWHERES_NAMELIKE'[张周]%'//查询姓张或者姓周的人
select*fromS_INFOWHERES_IDLIKE'[1-3]'//查找编号是1-3之前的人
select*fromS_INFOWHERES_IDLIKE'[^1-3]'//查找编号不在1-3之前的人
altertable***addconstraintFK_本表名_字段名refrences被引用表名(字段名)//建立外键约束
sqlserver中的model(模板库)中创建一个数据库后,这个模板库中的表都会存在于任何新建的数据库中
数据库的扩展名可以随意改,即.mdf可以改为任何的扩展名:.xxxxxx
创建数据库关系图
约束:1、检查约束,如添加表达式:sex='男'orsex='女';
2、主键约束;3、默认值约束;4、外键约束
DB_ID()返回数据库是否存在,用法如下:
ifdb_id(N'test')isnotnull
dropdatabasetest
go注:不加N也可以执行,不加N是ascall编码格式,加N是unicode编码格式(宽字符格式)
truncate和delete的区别是前者删除表中所有的字段,且前者删除的操作没有记录日志,也就相当于没有可恢复性
declare声明变量,@为局部变量,@@为全局变量,用法如下:
declare@Aint
set@A=100,
也可用如下方式给变量赋值:
select@A=AVG(num)fromTable
替换值的两种方式的SQL例子如下:1、selects.Intidas编号,s.Strnameas,ISNULL(b.Strcaption,'未知')as学历frompersonassleftjoinBaseCodeasbonb.Intid=s.InteducationidleftjoinBaseCodeasdond.Intid=s.Intnationid
解释:ISNULL(b.Strcaption,'未知')的意思是,如果b.Strcaption的值为null,则在执行查询后的结果集中学历项中所有的NULL值全部显示“未知”,而不是NULL。
2、selects.Intidas编号,s.Strnameas,'学历'=CASEwhenb.Strcaptionisnullthen'未知'elseb.StrcaptionendfrompersonassleftjoinBaseCodeasbonb.Intid=s.InteducationidleftjoinBaseCodeasdond.Intid=s.Intnationid
解释:此处用case...when...then...end去替换ISNULL,再举例如下:
casetable.colum1
when'value1'then'value2'
when'value3'then'value4'
end此例的意思是如果table表中的colum1的值是value1,则在结果集中替换为value2来显示,value3同理
数据库有了登录名还不能进行操作,必须把用户名映射成一个用户名(即每个数据库下都有一个安全性下,安全性下有一个用户,右击某个用户名某看其属性,就可以看到此用户是由哪个登录名映射出来的)
创建登录名需要系统存储过程:sp_addlogin'登录名','密码'
把登录名映射成用户:sp_grantdbaccess'用户名','密码'
给某个用户分配某些权限:GRANT操作权限(如:select或update等等)ON'表名'TO'用户'
创建角色:SP_ADDROLE'角色名'
给角色添加用户:SP_ADDROLEMEMBER
给角色分配权限:同给用户分配权限类似