一 MS SQL的备份方式:
1. 只备份数据库结构以及表结构的方式:
备份:数据库--右键--任务--生成脚本--SQL
还原:执行生成的.sql文件。
2. 连同数据一起备份的方式:
(1)备份:分离数据库--Copy 。
还原:还原数据库即可。
(2)备份:数据库--任务--备份(.bak文件)
还原:数据库--任务--还原--数据库
二 MS SQL核心知识点:
1.高级T-SQL
2.约束
3.索引
4.常用函数
5.视图
6.存储过程
7.触发器
8.事务
9.作业
10.游标
三 逐个击破
1.约束
主键约束:表设计--右键--索引/键--add
外键约束:表设计--右键--关系
唯一约束:表设计--右键--索引/键--add
check约束:表设计--右键--check约束...
2.T-SQL
常用的运算符:in, bettween, or, and, not, like
_表示一个字符
[1-3]表示1,2,3
[^1-3]表示除1,2,3的数
连接查询:
连接查询分为三种:内连接(两表的地方相同,如果直接写两个表明,则默认我这种情况);
外连接:分为左外连接,右外连接,全连接(这三种连接方式都存在主次之分)
交叉连接:笛卡尔积
注意:连接查询中,先根据连接类型进行筛选,最后可以根据两表的字段进行筛选
3.常用函数
LOWER, UPPER, LEN, SUM, AVG, MAX, MIN, COUNT
日期:getDate()获取当前的日期时间
DATEADD DATEADD(mm, 4, '01/12/2013'),返回05
DATEDIFF 比较两个日期 eg:DATEDIFF(mm, '2013/01/15', '2012/02/15'); 返回-11
Convert()类型转换函数 eg:Convert(varchar(5), 12345);返回”12345“
ISNULL()判断是否为NULL值 eg:字段名=ISNULL(值, 字段名);用于在根据条件查询时,条件不确定存在的情况下
4.视图
使用视图的优点:简单性,避免了用户对复杂的表结构进行分析;安全性,避免了用户对敏感数据的暴漏;独立性,视图可以把应用程序和数据表连接起来,避免了应用程序对表的直接操作。
使用视图的缺点:性能,对视图的操作都需要转化成为对基表的操作,所以需要一定的时间;权限,对视图数据的修改,需要转换为对基表的操作,但是有些操作是禁止的,所以可能在权限上有所约束。
视图操作的约束:
(1) 若视图是基于多个表使用联接操作而导出的,那么对这个视图执行更新操作时,每次只能影响其中的一个表。
(2) 若视图导出时包含有分组和聚合操作,则不允许对这个视图执行更新操作。
(3) 若视图中未包含基表中的非空字段,则改视图不允许插入操作。
特殊的视图:索引视图
有些普通视图生成结果集的开销很大,所以引进了“索引视图”,因为索引视图的结果集存在数据库中,所以特别适合大量查询的用途。但是,更新成本比较高,所以索引视图适合于那种频繁查询的视图。
格式:
CREATE VIEW view_name
AS
sql statement
5.存储过程
存储过程:是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
格式:
CREATE PROC proc_name(
@param1 数据类型 [=参数默认值] ,--默认输入参数
@param2 数据类型 [=参数默认值] [out],--输出参数,存储返回值,传进来的时候不需要值
@param3 数据类型 [=参数默认值][output], --输入输出参数,两用,需要赋初值
...)
AS
sql statement
金典的分页存储过程:
create proc [dbo].[pro_student_pager](
@pageIndex int,
@pageSize int
)
as
declare @startRow int, @endRow int
set @startRow = (@pageIndex - 1) * @pageSize +1
set @endRow = @startRow + @pageSize -1
select * from (
select *, row_number() over (order by id asc) as number from student
) t
where t.number between @startRow and @endRow;6.触发器
触发器的分类:
(1)、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
( 2)、 instead of 触发器 (之前触发)
触发器的两张虚拟表(与原表的机构一样):
(1)inserted:存储插入后的数据,更新后的数据
(2)deleted:存储更新前的数据,删除的数据
格式:
对表的操作
Inserted逻辑表
Deleted逻辑表
增加记录(insert)
存放增加的记录
无
删除记录(delete)
无
存放被删除的记录
修改记录(update)
存放更新后的记录
存放更新前的记录
CREATE TRIGGER trigger_name
ON table_name
FOR/AFTER insert/update/delete
AS
sql statement
GO
7. 事务
(1)事务的特点
原子性:事务内的所有工作要么全部完成,要么全部不完成
一致性:事务内的操作都不能违反数据库的约束或规则,事务完成时有内部数据结构都必须是正确的。
隔离性:事务直接是相互隔离的,如果有两个事务对同一个数据库进行操作,比如读取表数据。任何一个事务看到的所有内容要么是其他事务完成之前的状态,要么是其他事务完成之后的状态。一个事务不可能遇到另一个事务的中间状态。
持久性:事务完成之后,它对数据库系统的影响是持久的,即使是系统错误,重新启动系统后,该事务的结果依然存在。
(2)事务的类型
显式事务:以begin transaction开始,commit transaction提交或者以rollback transaction回滚的事务。
自动提交事务:每一条单独的SQL语句就是一个自动提交的事务。
隐式事务
(3)例子
--开始事务 begin transaction tran_bank; declare @tran_error int; set @tran_error = 0; begin try update bank set totalMoney = totalMoney - 10000 where userName = 'jack'; set @tran_error = @tran_error + @@error; update bank set totalMoney = totalMoney + 10000 where userName = 'jason'; set @tran_error = @tran_error + @@error; end try begin catch print '出现异常,错误编号:' + convert(varchar, error_number()) + ', 错误消息:' + error_message(); set @tran_error = @tran_error + 1; end catch if (@tran_error > 0) begin --执行出错,回滚事务 rollback tran; print '转账失败,取消交易'; end else begin --没有异常,提交事务 commit tran; print '转账成功'; end go
8.游标
游标实际上是一种能从多条数据记录的结果集中每次提取一条记录的机制。游标可以完成:
a.允许定位到结果集中的特定行
b.从结果集的当前位置检索一行或多行数据
c.支持对结果集中当前位置的进行修改
(1)、定义游标
declare cursor_name --游标名称 cursor [local | global] --全局、局部 [forward only | scroll] --游标滚动方式 [read_only | scroll_locks | optimistic] --读取方式 for select_statements --查询语句 [for update | of column_name ...] --修改字段(2)、打开游标open cursor_name;
游标打开后,可以使用全局变量@@cursor_rows显示读取记录条数
(3)、检索游标
fetch cursor_name;
检索方式如下:
fetch first; 读取第一行
fetch next; 读取下一行
fetch prior; 读取上一行
fetch last; 读取最后一行
fetch absolute n; 读取某一行
如果n为正整数,则读取第n条记录
如果n为负数,则倒数提取第n条记录
如果n为,则不读取任何记录
fetch pelative n
如果n为正整数,则读取上次读取记录之后第n条记录
如果n为负数,则读取上次读取记录之前第n条记录
如果n为,则读取上次读取的记录
(4)关闭游标
close cursor_name;
(5)删除游标
deallocate cursor_name;
(6)例子
--创建一个游标
declare cursor_stu cursor scroll for
select id, studentname, gender from student where classid = 1;
--打开游标
open cursor_stu;
--存储读取的值
declare @id int,
@studentname nchar(10),
@gender int;
--读取第一条记录
fetch first from cursor_stu into @id, @studentname, @gender;
--循环读取游标记录
print '读取的数据如下:';
--全局变量
while (@@fetch_status = 0)
begin
declare @gendername char(2);
if(@gender = 0)
begin
set @gendername = '男';
end
else
begin
set @gendername = '女';
end
print '编号:' + convert(char(5), @id) + ', 名称:' + @studentname + ', 性别:' + @gendername;
--继续读取下一条记录
fetch next from cursor_stu into @id, @studentname, @gender;
end
--关闭游标
close cursor_stu;
--删除游标
deallocate cursor_stu;
9. 索引
(1)索引的分类
唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个
唯一索引:唯一索引不允许两行具有相同的索引值。
主键索引:在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
聚集索引(clustered index)
在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。
非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引。索引的优缺点
• 优点
– 加快访问速度
– 加强行的唯一性
• 缺点
– 带索引的表在数据库中需要更多的存储空间
– 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新
创建索引的指导原则
• 请按照下列标准选择建立索引的列。
– 该列用于频繁搜索
– 该列用于对数据进行排序
• 请不要使用下面的列创建索引:
– 列中仅包含几个不同的值。
– 表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长