索引,视图,存储过程和触发器文档
实验案例一:验证索引的作用
1、首先创建一个数据量大的表,名称为“学生表”,分别有三列,学号,姓名和班级,如下图所示,学号为自动编号,班级为默认值“一班”。
2、向表中插入大量数据,数据越多,验证索引的效果越好。
使用语句完成:While 1>0 Insert into学生表(姓名) values(‘于美丽’)
上面语句是一个死循环,除非强制结束,如果1大于就会一直向表中插入姓名
如下图所示:
等待5分钟左右,打开表的属性,查看表的行数,当前为1032363,如下图所示:
3、使用语句查询第900000行的数据,Select * from学生表Where学号=900000
4、打开“sql server profiler”工具进行跟踪,如下图所示:
打开“sql server profiler”工具查看跟踪的信息,发现查询时间很长,cpu工作了265毫秒,reads:读了8649次,writes:写了10次,duration:总计花费2336毫秒完成查询。
为了下面分析文件更准确,多执行几次Select * from学生表Where学号=900000
然后把跟踪的结果保存在桌面上:
5、打开“数据库引擎优化顾问”,添加跟踪文件,进行分析,发现索引建议,需要建立索引。
注意选择benet数据库中的学生表,然后点击“开始分析”
索引类型为clusterd(聚集索引),索引列为“学号”。
6、按照“数据库引擎优化顾问”的索引建议建立聚集索引,并且选择“唯一”
7、再次执行Select * from学生表Where学号=900000
8、打开sql server profiler查看跟踪的时间,发现查询时间大幅提升,说明索引可以提高查询速度。
发现总计时间为1毫秒,几乎忽略不计
实验案例二:分别练习创建各种索引
1、创建聚集索引
目前tstudent表中没有任何索引也没有主键
为tstudent表创建聚集索引
选中studentID,单击左上侧的主键按钮
为Tstuden表的studentID创建主键就同时创建了聚集索引
2、创建组合索引
为成绩表创建组合索引,因为一个学生不能为一门学科录入两次成绩,所以将成绩表中的studentID和subjectID创建组合索引
解决办法:
菜单栏----工具----选项
找到设计器(designers),将标记处的勾去掉,单击“确定”
这样组合索引就创建成功了
3创建唯一索引
创建唯一性约束的时候就会创建唯一性索引,不能有重复值
为Tstudent表创建唯一非聚集索引
createuniquenonclusteredindexU_cardIDonTStudent(cardID)
4、创建非聚集索引---可以有重复值
为Tstudent表的姓名列创建非聚集索引
使用命令查看表上的索引
Select*fromsys.sysindexeswhereid=(selectobject_idfromsys.all_objectswherename='Tstudent')
Indid中1代表聚集索引
Indid中2代表唯一非聚集索引
Indidz中3代表非聚集索引
使用sp_help Tstudent也可以查看到相关表的信息
实验案例三:创建视图
方法一:在图形界面下创建视图(以Myschool数据库为例)
创建一个视图,分别来自三个的表的三个列,并重命名列,生成的视图名为student_info,如下图所示:
通过查询语句查看视图:select * from student_info
方法二:使用语句创建视图(以schoolDB数据库为例)
进行数据库设计的时候,一个表有很多列,我们可以在表上创建视图,只显示指定的列。
Select语句可以作为一个视图
selectSname,sex,Classfromdbo.TStudentwhereClass='网络班'
1、创建视图,筛选行和列
createviewnetstudent
as
selectSname,sex,Classfromdbo.TStudentwhereClass='网络班'
从视图中查找数据:
select*fromnetstudentwheresex='男'
创建视图,更改列的表头,计算列,产生计算列
selectStudentID,Sname,sex,cardID,Birthday,Email,Class
fromdbo.TStudent
2、创建视图,更改列的表头
createviewV_Tstudent1
as
selectStudentID学号,Sname姓名,sex性别,cardID身份证号码,Birthday生日,Class班级fromdbo.TStudent
select*fromV_Tstudent1
以后再去查询的时候就非常方便了。
实验案例四:存储过程
1、常用的系统存储过程
exec sp_databases --列出当前系统中的数据库
exec sp_renamedb 'mybank','bank' --改变数据库名称(单用户访问)
use MySchool
go
exec sp_tables --当前数据库中可查询对象的列表
exec sp_columns student --查看表student中列的信息
exec sp_help student --查看表student的所有信息
exec sp_helpconstraint student --查看表student表的约束
exec sp_helptext view_student_result --查看视图的语句文本
exec sp_stored_procedures --返回当前数据库中的存储过程列表
2、常用的扩展存储过程(在C盘下创建一个文件夹bank)
exec xp_cmdshell 'mkdir c:bank',no_output --创建文件夹c:bank
exec xp_cmdshell 'dir c:bank' --查看文件
如果执行不了上面的语句,请开启下面的功能。然后再次执行上面的两条语句。
若xp_cmdshell作为服务器安全配置的一部分而被关闭,请使用如下语句启用:
exec sp_configure 'show advanced options', 1 --显示高级配置选项(单引号中的只能一个空格隔开)
go
reconfigure --重新配置
go
exec sp_configure 'xp_cmdshell',1 --打开xp_cmdshell选项
go
reconfigure --重新配置
go
3、用户自定义的存储过程(以schoolDB数据库为例,计算网络管理专业的平均分)
use schoolDB
go
if exists(select * from sysobjects where name='usp_getaverageresult')
dropprocedureusp_getaverageresult
go
createprocedureusp_getaverageresult
as
declare@subjectidnvarchar(4)
select @subjectid=subjectid from dbo.TSubject where subJectName='网络管理'
declare@avg decimal (18,2)
select@avg=AVG(mark)fromdbo.TScore where subJectID=@subjectid
print '网络管理专业平均分是:'+convert(varchar(5),@avg)
go
exec usp_getaverageresult
实验案例五:触发器
(Myschool数据库为例)
创建触发器(禁止修改admin表中数据):
create trigger reminder
onadmin
for update
as
print '禁止修改,请联系DBA'
rollback transaction
go
执行语句,查看错误信息:
update Admin set LoginPwd='123' where LoginId='benet'
select * from Admin
实验案例六:创建触发器(参考书上108页)
(Myschool数据库为例)
要求:创建一个触发器,以确保student表中的数据不会被删除。
create trigger stu_del
onstudent
for delete
as
print '你不具备删除管理员信息的权限'
rollback transaction
go
执行一条delete语句,测试结果。
delete from Student where StudentName='喜洋洋'
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个快速引入CDN的workflow
- 在Ryzen平台上安装macOS High Sierra苹果系统
- v-selectpage 基于Vue2的高清重制版
- Android Studio3.6中的View Binding初探及用法区别
- Android日志文件的读写工具类
- <Go语言学习笔记>【数组与切片】
- Android Studio 3.6 新特性一览(推荐)
- 03 Linux下的SVN服务器搭建
- Android openGl 绘制简单图形的实现示例
- 解决Android studio 3.6.1 出现Cause: unable to find valid certification path to requested target 报错的问题
- 使用kotlin实现MVP的方式(简单好用)
- Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解
- android studio更新gradle错误构建项目失败的解决方法
- Android Studio使用Kotlin时,修改代码后运行不生效的解决方法
- 服务端开发人员必备网页调试工具:Postman