《单元7事务视图和索引计算机软件及应用IT计算机专业资料.ppt》由会员分享,可在线阅读,更多相关《单元7事务视图和索引计算机软件及应用IT计算机专业资料.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、事务、视图和索引事务、视图和索引事务、视图和索引事务、视图和索引回顾与作业点评3-1下面的下面的SQL语句有错吗?实现了什么功能?语句有错吗?实现了什么功能?上述语句可以用下面的联接替换吗?上述语句可以用下面的联接替换吗?可可 以以 SELECT*FROM Student WHERE StudentNo IN SELECT Student.*FROM Student INNER JOIN Result ON Student.StudentNo=Result.StudentNo(SELECT*FROM Result)(SELECT StudentNo FROM Result)回顾与作业点评3-2
2、下列语句实现了什么功能?下列语句实现了什么功能?上述语句可以用下面的联接替换吗?上述语句可以用下面的联接替换吗?查看没有参加考试的学生查看没有参加考试的学生 有的子查询不有的子查询不能用联接替换。这就是典型的例子能用联接替换。这就是典型的例子SELECT*FROM Student WHERE StudentNo NOT IN(SELECT StudentNo FROM Result)SELECT*FROM Student INNER JOIN Result ON Student.StudentNoResult.StudentNo 不可以不可以回顾与作业点评3-3下列语句实现了什么功能?下列语句
3、实现了什么功能?请使用请使用IN子查询改写上述语句?子查询改写上述语句?请使用联接查询改写上述语句请使用联接查询改写上述语句SELECT*FROM Student WHERE StudentNo IN(SELECT StudentNo FROM Result)SELECT*FROM Student INNER JOIN ResultON Student.StudentNo=Result.StudentNoSELECT*FROM Student WHERE EXISTS(SELECT*FROM Result WHERE StudentNo=Student.StudentNo)查询参加考试的学生查
4、询参加考试的学生预习检查T-SQL语句如何提交一个事务?语句如何提交一个事务?事务具有的四个特性是什么?事务具有的四个特性是什么?视图是虚拟表吗?视图是虚拟表吗?索引的作用是什么?索引的作用是什么?本章任务模拟实现银行转帐功能模拟实现银行转帐功能批量插入学生考试成绩批量插入学生考试成绩办理毕业学生离校手续办理毕业学生离校手续查看学生成绩查看学生成绩查看学生档案查看学生档案本章目标使用事务保证操纵数据的完整性使用事务保证操纵数据的完整性掌握如何创建并使用视图掌握如何创建并使用视图为什么需要事务5-1银行转账银行转账 银行转账问题:银行转账问题:假定资金从账户假定资金从账户A转到账户转到账户B,至
5、少需要两步:,至少需要两步:账户账户A的资金减少的资金减少然后账户然后账户B的资金相应增加的资金相应增加账户账户A账户账户B假定张三的账户直接转账假定张三的账户直接转账1000元到李四的账户元到李四的账户为什么需要事务5-2CREATE TABLE bank(customerName CHAR(10),-顾客姓名顾客姓名 currentMoney MONEY -当前余额当前余额)GOALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1)GOINSERT INTO bank(customerName,curren
6、tMoney)VALUES(张三张三,1000)INSERT INTO bank(customerName,currentMoney)VALUES(李四李四,1)创建账户表,存放用户的账户信息创建账户表,存放用户的账户信息添加约束:根据银行规定,账户余额不能添加约束:根据银行规定,账户余额不能少于少于1元,否则视为销户元,否则视为销户 张三开户,开户金额为张三开户,开户金额为1000元元;李四开户,开户金额;李四开户,开户金额1元元 为什么需要事务5-3目前两个账户的余额总和为:目前两个账户的余额总和为:1000+1=1001元元 为什么需要事务5-4模拟实现转账模拟实现转账从张三的账户转账从
7、张三的账户转账1000元到李四的账户元到李四的账户/*-转账测试:张三转账转账测试:张三转账1000元给李四元给李四-*/-我们可能会这样编写语句我们可能会这样编写语句-张三的账户少张三的账户少1000元,李四的账户多元,李四的账户多1000元元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三张三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四李四GO-再次查看转账后的结果再次查看转账后的结果 SELECT*FROM b
8、ankGO请问:请问:执行转账语句后,张三、李四的账户余额分执行转账语句后,张三、李四的账户余额分别是多少?别是多少?张三的账户没有减少张三的账户没有减少 但李四的账户却多了但李四的账户却多了1000元元 100010012001元元总额多出了总额多出了1000元!元!为什么需要事务5-5-张三的账户减少张三的账户减少1000元,李四的账户增加元,李四的账户增加1000元元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三张三UPDATE bank SET currentMoney=currentMoney+
9、1000 WHERE customerName=李四李四GO发生错误的原因发生错误的原因执行失败,张三账户余额还是执行失败,张三账户余额还是1000元元继续往下执行:执行成功,李四账户余额变为继续往下执行:执行成功,李四账户余额变为1001元元如何解决呢?使用事务如何解决呢?使用事务UPDATE语句违反约束:语句违反约束:余额余额=1元元什么是事务事务事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作是作为单个逻辑工作单元执行的一系列操作多个操作作为一个整体向系统提交,要么都执行、要么都不执行多个操作作为一个整体向系统提交,要么都执行、要么都不执行 事务是一个不可分割的工作逻
10、辑单元事务是一个不可分割的工作逻辑单元 转账过程就是一个事务转账过程就是一个事务它需要两条它需要两条UPDATE语句来完成,这两条语句是一个整体语句来完成,这两条语句是一个整体如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是从而确保转账前和转账后的余额不变,即都是1001元元事务的特性事务必须具备以下四个属性,简称事务必须具备以下四个属性,简称ACID 属性:属性:原子性(原子性(Atomicity)一致性(一致性(Consistenc
11、y)隔离性隔离性(Isolation)永久性(永久性(Durability)事务是一个完整的操作事务是一个完整的操作事务的各步操作是不可分的(原子的);事务的各步操作是不可分的(原子的);要么都执行,要么都不执行要么都执行,要么都不执行当事务完成时,数据必须处于一致状态当事务完成时,数据必须处于一致状态并发事务之间彼此隔离、独立,它不应并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务以任何方式依赖于或影响其他事务事务完成后,它对数据库的修改被永久事务完成后,它对数据库的修改被永久保持保持如何创建事务2-1使用使用SQL语句管理事务语句管理事务开始事务开始事务提交事务提交事务回滚
12、(撤销)事务回滚(撤销)事务ROLLBACK TRANSACTIONCOMMIT TRANSACTIONBEGIN TRANSACTION如何创建事务2-2一旦事务提交或回滚,则事务结束一旦事务提交或回滚,则事务结束判断某条语句执行是否出错:判断某条语句执行是否出错:使用全局变量使用全局变量ERRORERROR只判断当前一条只判断当前一条T-SQL语句执行是否有错语句执行是否有错为了判断事务中所有为了判断事务中所有T-SQL语句是否有错,可以对错误进行累计语句是否有错,可以对错误进行累计 如:如:事务可以嵌套事务可以嵌套SET errorSum=errorSum+ERROR事务分类显式事务显式
13、事务用用BEGIN TRANSACTION明确指定事务的开始明确指定事务的开始最常用的事务类型最常用的事务类型隐性事务隐性事务通过设置通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开语句,将隐性事务模式设置为打开其后的其后的T-SQL语句自动启动一个新事务语句自动启动一个新事务提交或回滚一个事务后,下一个提交或回滚一个事务后,下一个 T-SQL 语句又将启动一个新事务语句又将启动一个新事务自动提交事务自动提交事务SQL Server 的默认模式的默认模式每条单独的每条单独的 T-SQL 语句视为一个事务语句视为一个事务BEGIN TRANSACT
14、ION/*-定义变量,用于累计事务执行过程中的错误定义变量,用于累计事务执行过程中的错误-*/DECLARE errorSum INT SET errorSum=0 -初始化为初始化为0,即无错误,即无错误/*-转账:张三的账户减少转账:张三的账户减少1000元,李四的账户增加元,李四的账户增加1000元元*/UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=张三张三SET errorSum=errorSum+ERROR-累计是否有错误累计是否有错误UPDATE bank SET currentMoney=cur
15、rentMoney+1000 WHERE customerName=李四李四SET errorSum=errorSum+ERROR使用事务解决银行转账问题4-1从张三的账户转出从张三的账户转出1000元,存入李四的账户中元,存入李四的账户中开始事务(指定事务从此处开始,后续的开始事务(指定事务从此处开始,后续的T-SQL语句都是一个整体)语句都是一个整体)累计是否有错误累计是否有错误IF errorSum0 -如果如果SQL语句执行出错语句执行出错 BEGIN PRINT 交易失败,回滚事务交易失败,回滚事务 ROLLBACK TRANSACTION END ELSE BEGIN PRINT
16、交易成功,提交事务,写入硬盘,永久的保存交易成功,提交事务,写入硬盘,永久的保存 COMMIT TRANSACTION ENDGOPRINT 查看转账事务后的余额查看转账事务后的余额SELECT*FROM bank GO 使用事务解决银行转账问题4-2根据执行是否有错误,决定提交事根据执行是否有错误,决定提交事务,或撤销事务务,或撤销事务如果有错,则回滚操作,事务结束如果有错,则回滚操作,事务结束如果成功,则提交操作,事务结束如果成功,则提交操作,事务结束从张三的账户转出从张三的账户转出1000元,存入李四的账户中元,存入李四的账户中使用事务解决银行转账问题4-3转账事务前转账事务前转账事务过
17、程中转账事务过程中转账事务结束后转账事务结束后转账转账1000元,转账失败的情况元,转账失败的情况演示案例演示案例1:利用事务实现转账:利用事务实现转账1000元元使用事务解决银行转账问题4-4转账事务前转账事务前转账事务过程中转账事务过程中转账事务结束后转账事务结束后转账转账800元,转账成功的情况元,转账成功的情况演示案例演示案例2:利用事务实现转账:利用事务实现转账800元元指导批量插入学生考试成绩2-1训练要点:训练要点:使用事务向表中插入多条记录使用事务向表中插入多条记录需求说明:需求说明:批量插入参加今天批量插入参加今天“Java Logic”课程考试的十名学生成绩课程考试的十名学
18、生成绩如果输入的成绩大于如果输入的成绩大于100分,将违反约束分,将违反约束讲解需求说明讲解需求说明指导批量插入学生考试成绩2-2实现思路:实现思路:使用显式事务完成批量插入使用显式事务完成批量插入10个学生考试成绩的操作个学生考试成绩的操作使用全局变量使用全局变量ERROR判断插入操作是否成功判断插入操作是否成功使用使用IF语句判断语句判断ERROR值。如果插入成功,提交事务;否则回滚事务值。如果插入成功,提交事务;否则回滚事务BEGIN TRANSACTIONDECLARE errorSum INTSET errorSum=0/*-插入数据插入数据-*/INSERT INTO Result
19、(StudentNo,SubjectNo,ExamDate,StudentResult)VALUES(10012,1,2009-5-20,102)-分数违反约束分数违反约束SET errorSum=errorSum+ERROR IF(errorSum0)-如果有错误如果有错误 BEGIN PRINT 插入失败,回滚事务插入失败,回滚事务 ROLLBACK TRANSACTION END ELSE BEGIN PRINT 插入成功,提交事务插入成功,提交事务 COMMIT TRANSACTION END完成时间:完成时间:20分钟分钟练习办理毕业学生离校手续需求说明:需求说明:将毕业学生的基本信
20、息和考试成绩分别保存到历史表中将毕业学生的基本信息和考试成绩分别保存到历史表中提示:提示:使用显式事务使用显式事务查询查询Result表中所有表中所有三年级学生的考试成绩,保存到表三年级学生的考试成绩,保存到表HistoreResult中中删除删除Result表中所有表中所有三年级学生的考试成绩三年级学生的考试成绩查询查询Student表中所有表中所有三年级的学生记录,保存到表三年级的学生记录,保存到表HistoryStudent中中删除删除Studet表中所有表中所有三年级学生记录三年级学生记录完成时间:完成时间:20分钟分钟BEGIN TRANSACTIONDECLARE errorSum
21、 INTSET errorSum=0/*-查询查询Result表中所有表中所有三年级学生的考试成绩三年级学生的考试成绩,保存到新表,保存到新表HistoreResult*/SELECT Result.*INTO HistoreResult FROM Result INNER JOIN Student ON Result.StudentNo=Student.StudentNoINNER JOIN Grade ON Grade.GradeId=Student.GradeId WHERE GradeName=三三年级年级SET errorSum=errorSumERROR/*-删除删除Result表
22、中所有表中所有三年级学生的考试成绩三年级学生的考试成绩*/DELETE Result FROM Result JOIN Student ON Result.StudentNo=Student.StudentNoINNER JOIN Grade ON Grade.GradeId=Student.GradeId WHERE GradeName=三年级三年级SET errorSum=errorSum+ERROR/*-将将Student表中所有表中所有三年级的学生记录三年级的学生记录,保存到新表,保存到新表HistoryStudent*/*-删除删除Studet表中所有表中所有三年级学生记录三年级学生
23、记录*/*-根据是否有错误,确定事务是提交还是撤销根据是否有错误,确定事务是提交还是撤销-*/共性问题讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解为什么需要视图不同的人员关注不同的数据不同的人员关注不同的数据保证信息的安全性保证信息的安全性雇员雇员 ID姓名姓名薪金薪金职务职务绩效绩效E10004Ian Smith43000技术技术BE10005Ricky M.32000营销营销A 雇员数据库雇员数据库雇员数据库雇员数据库老板老板 出纳出纳 人力资源人力资源主管主管员工员工拒绝访问拒绝访问什么是视图3-1教师需要的视图:教师需要的
24、视图:方便查看学生的成绩方便查看学生的成绩CREATE VIEW vw_Student_Result AS SELECT 姓名姓名=stuName,学号学号=Student.StudentNo,基于学生信息表和成绩基于学生信息表和成绩表创建视图表创建视图班主任需要的视图:班主任需要的视图:方便查看学生的档案方便查看学生的档案什么是视图3-2视图是一视图是一张张虚拟表,虚拟表,表示一张表的部分数据或多张表的综合数据表示一张表的部分数据或多张表的综合数据其结构和数据是建立在对表的查询基础上其结构和数据是建立在对表的查询基础上视图中不存放数据视图中不存放数据数据存放在视图所引用的原始表中数据存放在视
25、图所引用的原始表中一个原始表,根据不同用户的不同需求,可以创建不同的一个原始表,根据不同用户的不同需求,可以创建不同的视图视图什么是视图3-3视图的用途视图的用途筛选表筛选表中中的行的行防止未经许可的用户访问敏感数据防止未经许可的用户访问敏感数据降低数据库的复杂程度降低数据库的复杂程度将将多个多个物理数据库抽象为一个逻辑数据库物理数据库抽象为一个逻辑数据库如何创建视图3-1使用管理器创建视图:名称:使用管理器创建视图:名称:vw_Student_Resultvw_Student_Result操作演示:使用管理器创建视图操作演示:使用管理器创建视图如何创建视图3-2使用使用T-SQL语句创建视图
26、语句创建视图CREATE VIEW view_name AS 使用使用T-SQL语句删除视图语句删除视图IF EXISTS(SELECT*FROM sysobjects WHERE name=view_name)DROP VIEW view_name 使用使用T-SQL语句查看视图语句查看视图SELECT*FROM view_name 需要使用一对单引需要使用一对单引号括起号括起如何创建视图3-3创建方便创建方便教师教师查看成绩的视图查看成绩的视图IF EXISTS(SELECT*FROM sysobjects WHERE name=vw_student_result)DROP VIEW vw
27、_student_resultGOCREATE VIEW vw_student_resultAS GOSELECT*FROM vw_student_result检测是否存在检测是否存在创建视图创建视图查看视图查看视图删除视图删除视图演示案例演示案例3:使用:使用SQL创建、执行视图创建、执行视图使用视图注意事项视图中可以使用多个表视图中可以使用多个表一个视图可以嵌套另一个视图一个视图可以嵌套另一个视图 视图定义中的视图定义中的 SELECT 语句不能包括下列内容:语句不能包括下列内容:ORDER BY 子句,除非在子句,除非在 SELECT 语句的选择列表中也有一个语句的选择列表中也有一个 T
28、OP 子句子句INTO 关键字关键字引用临时表或表变量引用临时表或表变量 指导查看学生各学期总成绩2-1训练要点:训练要点:使用视图获取多表中数据使用视图获取多表中数据需求说明:需求说明:统计每个学生各学期(大一、大二、大三)所有课程的总成绩统计每个学生各学期(大一、大二、大三)所有课程的总成绩讲解需求说明讲解需求说明指导查看学生各学期总成绩2-2实现思路:实现思路:创建视图创建视图编写代码查询每个学生各学期参加考试的总成绩,每门课成绩以该生参加的最后编写代码查询每个学生各学期参加考试的总成绩,每门课成绩以该生参加的最后一次考试为准一次考试为准编译执行视图,获得学生各学期的总成绩编译执行视图,
29、获得学生各学期的总成绩CREATE VIEW vw_student_result_infoAS SELECT 姓名姓名=StudentName,学号学号=Student.StudentNo,联系电话联系电话=Phone,学期学期=GradeName,成绩成绩=Total FROM Student LEFT OUTER JOIN(SELECT r.StudentNo,GradeName,SUM(StudentResult)Total FROM Result r INNER JOIN(SELECT StudentNo,SubjectNo,MAX(ExamDate)ExamDate FROM Res
30、ult GROUP BY StudentNo,SubjectNo)tmp ON r.ExamDate=tmp.ExamDate AND r.SubjectNo=tmp.SubjectNo AND r.StudentNo=tmp.StudentNo INNER JOIN Subject sub ON sub.SubjectNo=r.SubjectNo INNER JOIN Grade g ON g.GradeId=sub.GradeId GROUP By r.StudentNo,GradeName)TmpResult2 ON Student.StudentNo=TmpResult2.Studen
31、tNo GROUP BY StudentName,Student.StudentNo,Phone,GradeName,TotalGOSELECT*FROM vw_student_result_info完成时间:完成时间:20分钟分钟SQL Server的安全模型数据库数据库 1数据库数据库 2数据库数据库 3表表 1表表 2表表 1表表 2表表 1表表 2增删增删改查改查增删增删改查改查增删增删改查改查增删增删改查改查增删增删改查改查增删增删改查改查数据库用户数据库用户 数据库用户数据库用户数据库用户数据库用户登录帐号登录帐号SQLserver三层安全管理三层安全管理登录方式登录验证有两种方式
32、:登录验证有两种方式:SQL身份验证:适合于非身份验证:适合于非windows平台的用户或平台的用户或Internet用户,用户,需要提供帐户和密码需要提供帐户和密码Windows身份验证:适合于身份验证:适合于windows平台用户,不需要提供密码,和平台用户,不需要提供密码,和windows集成验证集成验证登录帐户相应有两种:登录帐户相应有两种:SQL 帐户和帐户和Windows帐户帐户 创建登录添加添加 Windows登录帐户登录帐户 EXEC sp_grantlogin jbtrainingS26301 添加添加 SQL登录帐户登录帐户 EXEC sp_addlogin zhangsa
33、n,1234演示创建登录演示创建登录EXEC表示调用存储过程,表示调用存储过程,存储过程类似存储过程类似C语言的函数语言的函数内置的系统管理员内置的系统管理员 帐户帐户sa密码默认为空,建议修改密码密码默认为空,建议修改密码 域名域名用户名用户名用户名用户名,密码密码创建登录创建数据库用户创建数据库用户需要调用系统存储过程创建数据库用户需要调用系统存储过程sp_grantdbaccesssp_grantdbaccess,其用法为:,其用法为:EXEC sp_grantdbaccess 登录帐户名登录帐户名,数据库用户名数据库用户名 其中,其中,“数据库用户数据库用户“为可选参数,默认为登录帐户
34、,为可选参数,默认为登录帐户,即数据库用户默认和登录帐户同名。即数据库用户默认和登录帐户同名。USE stuDBGOEXEC sp_grantdbaccess jbtrainingS26301,S26301DBUser EXEC sp_grantdbaccess zhangsan,zhangsanDBUser在在stuDB数据库中添加两个用户数据库中添加两个用户创建数据库用户系统内置的数据库用户系统内置的数据库用户dbo 用户用户表示数据库的所有者(表示数据库的所有者(DB Owner)无法删除无法删除 dbo 用户,此用户始终出现在每个数据库中用户,此用户始终出现在每个数据库中 guest
35、用户用户适用于没有数据库用户的登录帐号访问适用于没有数据库用户的登录帐号访问每个数据库可有也可删除每个数据库可有也可删除向数据库用户授权 EmployeesEmployeeID123LastNameDavolioFullerLeverling FirstName NancyAndrewJanetReportsTo22.delete FROM EmployeesSELECT*FROM Employees权限的类型授权的语法为:授权的语法为:GRANT 权限权限 ON 表名表名 TO 数据库用户数据库用户USE stuDBGO/*-为为zhangsanDBUser分配对表分配对表stuInfo的的
36、select,insert,update权限权限-*/GRANT select,insert,update ON stuInfo TO zhangsanDBUser /*-为为S26301DBUser分配建表的权限分配建表的权限-*/GRANT create table TO S26301DBUser权限的类型没有授予没有授予delete权限权限共性问题讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解什么是索引3-1汉语字典中的汉字按页存放,一般都有汉语拼音目录(索引)、偏旁部首目录等汉语字典中的汉字按页存放,一般都有汉语拼音目录(索
37、引)、偏旁部首目录等我们可以根据拼音或偏旁部首,快速查找某个字词我们可以根据拼音或偏旁部首,快速查找某个字词什么是索引3-2Indexes Use Key Values to Locate Data(根据索引键查找定位数据行)(根据索引键查找定位数据行)Data Pages(数据页)(数据页)Index Pages(索引页)(索引页)什么是索引3-3SQL Server中的数据也是按页存放中的数据也是按页存放索引:是索引:是SQL Server编排数据的内部方法。它为编排数据的内部方法。它为SQL Server提供一种方法来编排查询提供一种方法来编排查询数据数据 索引页:数据库中存储索引的数据
38、页;索引页类似于汉语字(词)典中按拼音或笔画排索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页序的目录页索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能索引类型唯一索引:唯一索引不允许两行具有相同的索引值唯一索引:唯一索引不允许两行具有相同的索引值主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空索引要求主键中的每
39、个值是唯一的,并且不能为空聚集索引聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有:表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个一个非聚集索引非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存:非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个个如何创建索引3-1使用使用SQL Server Management Studio创建索引创建索引操
40、作演示:使用操作演示:使用SQLServ管理器创建索引管理器创建索引如何创建索引3-2使用使用T-SQL语句创建索引语句创建索引CREATE UNIQUE CLUSTERED|NONCLUSTERED INDEX index_name ON table_name(column_name)WITH FILLFACTOR=x唯一索引唯一索引聚集索引或非聚集索引聚集索引或非聚集索引填充因子(系数)填充因子(系数):指定一个指定一个0100之间的值,之间的值,表示索引页填充的百分比表示索引页填充的百分比使用使用T-SQL语句删除索引语句删除索引DROP INDEX table_name.index_n
41、ame 删除表时,该表的所有索引同时会被删除删除表时,该表的所有索引同时会被删除 表名和索引名称之间,用表名和索引名称之间,用“.”分隔分隔如何创建索引3-3在在Student表的表的StudentName列创建非聚集索引列创建非聚集索引USE MySchoolGO/*-检测是否存在该索引检测是否存在该索引(索引存放在系统表索引存放在系统表sysindexes中中)-*/IF EXISTS(SELECT name FROM sysindexes WHERE name=IX_Student_StudentName)DROP INDEX Student.IX_Student_StudentName
42、 -删除索引删除索引GO/*-学生姓名列创建非聚集索引:填充因子为学生姓名列创建非聚集索引:填充因子为30-*/CREATE NONCLUSTERED INDEX IX_Student_StudentName ON Student(StudentName)WITH FILLFACTOR=30GO检测索引是否存在:检测索引是否存在:索引存放在系统表索引存放在系统表sysindexes中中演示示例演示示例4:使用:使用T-SQL创建索引创建索引按指定的索引查询数据使用索引查询使用索引查询“李李”姓的学生信息姓的学生信息/*-指定按索引:指定按索引:IX_Student_StudentName查询查
43、询-*/SELECT*FROM StudentWITH(INDEX=IX_Student_StudentName)WHERE StudentName LIKE 李李%演示示例演示示例5:使用索引查询数据:使用索引查询数据索引的优缺点优点优点加快访问速度加快访问速度加强行的唯一性加强行的唯一性缺点缺点带索引的表在数据库中需要更多的存储空间带索引的表在数据库中需要更多的存储空间操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新创建索引的指导原则按照下列标准选择建立索引的列按照下列标准选择建立索引的列频繁搜索的列频繁搜索的列经常用
44、作查询选择的列经常用作查询选择的列经常排序、分组的列经常排序、分组的列经常用作联接的列(主键经常用作联接的列(主键/外键)外键)请不要使用下面的列创建索引请不要使用下面的列创建索引仅包含几个不同值的列仅包含几个不同值的列表中仅包含几行表中仅包含几行使用索引时注意事项查询时减少使用查询时减少使用*返回全部列,不要返回不需要的列返回全部列,不要返回不需要的列索引应该尽量小,在字节数小的列上建立索引索引应该尽量小,在字节数小的列上建立索引WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前避免在避免在ORD
45、ER BY子句中使用表达式子句中使用表达式根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理 查看索引 使用系统存储过程使用系统存储过程sp_helpIndex查看有关表或视图上索引的信息查看有关表或视图上索引的信息EXEC sp_helpIndex name SELECT*FROM sys.indexes EXEC sp_helpindex Result USE MySchoolSELECT*FROM sys.indexes 可以是表名或视可以是表名或视图名图名使用视图使用视图sys.indexes查看索引查看索引 查
46、看查看Result表的索引信息表的索引信息 查看查看MySchool数据库中全部索引信息数据库中全部索引信息 演示示例演示示例6:查看索引:查看索引练习使用索引查询学生考试成绩 需求说明:需求说明:利用索引查询考试成绩在利用索引查询考试成绩在80分到分到90分之间的学生考试记录分之间的学生考试记录要求:要求:考试成绩列上创建可重复索引:填充因子为考试成绩列上创建可重复索引:填充因子为70输出学生姓名、课程名称、考试日期和考试成绩输出学生姓名、课程名称、考试日期和考试成绩 提示:提示:在在MySchool的的Result表中表中StudentResult字段上,创建可重复索引字段上,创建可重复索
47、引使用所创建的索引查询成绩在使用所创建的索引查询成绩在80分到分到90分之间的所有考试记录分之间的所有考试记录 完成时间:完成时间:20分钟分钟IF EXISTS(SELECT name FROM sysindexes WHERE name=IX_Result_StudentResult)DROP INDEX Result.IX_Result_StudentResult -删除索引删除索引GO-考试成绩列上创建可重复索引:填充因子为考试成绩列上创建可重复索引:填充因子为 70-CREATE INDEX IX_Result_StudentResult ON Result(StudentResul
48、t)WITH FILLFACTOR=70GO-查询输出学生姓名、课程名称、考试日期和考试成绩查询输出学生姓名、课程名称、考试日期和考试成绩SELECT StudentName 学生姓名学生姓名,SubjectName 课程名称课程名称,ExamDate 考试日期考试日期,StudentResult 考试成绩考试成绩 FROM Subject,Student,ResultWITH(INDEX=IX_Result_StudentResult)WHERE StudentResult BETWEEN 80 AND 90 AND Student.StudentNo=Result.StudentNo AN
49、D Subject.SubjectId=Result.SubjectId共性问题讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解总结数据库事务具有哪些特性?数据库事务具有哪些特性?SQL Server中,事务有几种类型?中,事务有几种类型?Transact-SQL使用哪些语句来管理事务?使用哪些语句来管理事务?什么是视图?它的作用?什么是视图?它的作用?简述建立索引的作用和索引的分类简述建立索引的作用和索引的分类 作业课后作业课后作业必做必做教员备课时在此添加内容教员备课时在此添加内容选做选做教员备课时在此添加内容教员备课时在此添加内容提交时间:提交时间:xxx提交形式:提交形式:xxx预习作业预习作业背诵英文单词背诵英文单词教员备课时在此添加内容教员备课时在此添加内容