sqlserver数据库的索引、视图和触发器
? Sqlserver数据库的索引、视图和触发器数据库的索引类似于字典中的目录,无需阅读、可以直接利用目录快速查找所需要的信息 ? 索引的种类: 聚集索引:反应的是数据存储的物理顺序,一个表只能包含一个聚集索引 非聚集索引:不反应数据存储的物理顺序,一个表可以有多个非聚集索引 1.1.?准备环境1.1.1.?创建聚集索引目前tstudent表中没有任何索引也没有主键 为tstudent表创建聚集索引 选中studentID,单击左上侧的主键按钮 为Tstuden表的studentID创建主键就同时创建了聚集索引 1.1.2.?创建组合索引为成绩表创建组合索引,因为一个学生不能为一门学科录入两次成绩,所以将成绩表中的studentID和subjectID创建组合索引 解决办法: 菜单栏----工具----选项 找到设计器(designers),将标记处的勾去掉,单击“确定” 这样组合索引就创建成功了。 ? 1.1.3.?用命令创建聚集索引创建一个表TS create?TABLE?TS?( StudentID?varchar(10)?NOT?NULL, Sname?)?DEFAULT?sex?char(2cardID?(20??Birthday?datetime?Email?(40Class?enterTime?NULL ?) Go 用命令创建聚集索引 clustered?index?CL_studentID on?TS(studentID) 创建聚集索引不一定创建主键,如下图所示: ? 1.1.4.?创建唯一索引创建唯一性约束的时候就会创建唯一性索引,不能有重复值 为Tstudent表创建唯一非聚集索引 unique?nonclustered?U_cardID?TStudentcardID) 1.1.5.?创建非聚集索引---可以有重复值为Tstudent表的姓名列创建非聚集索引 ? 使用命令查看表上的索引 Select?*?from?sys.sysindexes?where?id=(select?object_id?all_objects?name='Tstudent') Indid中1代表聚集索引 Indid中2代表唯一非聚集索引 Indidz中3代表非聚集索引 ? 使用sp_helpTstudent也可以查看到相关表的信息 2.?创建视图进行数据库设计的时候,一个表有很多列,我们可以在表上创建视图,只显示指定的列。 Select语句可以作为一个视图 select?Sname,sexdboTStudent?Class'网络班' 2.1.?创建视图,筛选行和列view?netstudent as '网络班' 从视图中查找数据: select?netstudent?'男' 创建视图,更改列的表头,计算列,产生计算列 select?StudentIDBirthdayEmailTStudent 2.2.?创建视图,更改列的表头? V_Tstudent1 学号姓名性别身份证号码生日班级?TStudent ? ? 以后再去查询的时候就非常方便了。 ? 2.3.?创建视图计算列根据出生日期计算机学生年龄,并增加一个年龄列 V_Tstudent 班级 DatediffYYGetdate())?年龄?TStudent ? year(getdate())-(birthday)等价DatediffYY,0);">BirthdayGetdate())等价于YEAR()) V_Tstudent 年龄列并没有占用数据库的存储空间,这对于使用者来说就非常方便了。 2.4.?修改视图alter?viewV_Tstudent2 selectStudentID学号Sname姓名sex性别Birthday生日Class班级 ())年龄fromTStudent ? select*fromV_Tstudent2 ? 将视图当表来用 V_Tstudent2where年龄>30 2.5.?创建视图隐藏底层数据的复杂性asname?mark?成绩subJectName?学科class?a?join?TScore?b? =bStudentID?TSubject?c?subJectIDcsubJectID?class'网络班' 创建视图 v_smark 查看视图 v_smark 使用视图计算列 SUMas?总分?v_smark?group?by?学号 ? 2.6.?从视图创建视图cjzf ? 3.?存储过程存储过程是sql语句和控制语句的预编译集合,保存在数据库中,可由应用程序执行,而且允许用户声明变量,逻辑控制语句和强大的编程功能 使用存储过程的好处: 1.模块化程序设计 2.执行速度快,效率高 3.减少网络流量 4.具有很好的安全性 系统存储过程 sql-server提供了很多的系统存储过程,他们是一组预编译的T-SQL语句,系统存储过程提供了管理数据库和更新表的机制,并充当从系统表中检索信息的快捷方式。 常用的系统存储过程 sp_database 列出服务器上的所有数据库的信息,包括数据库名和数据大小 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当前环境下可查询的表和视图的信息 sp_columns 返回某个表和视图的列信息,包括列的数据类型和长度等 sp_help 查看某个数据库对象的信息:如列名,主键,约束,外键,索引等 sp_helpconstraint 查看某个表的索引 sp_stored_procedures 显示存储过程的列表 sp_password 添加或修改登录账户的密码 sp_helptext 显示默认值,未加密的存储过程,用户定义的存储过程,触发器或视图的实际文本 ? 使用T-SQL语句调用执行存储过程的语法如下: EXEC 存储过程名 [参数值] 其中EXEC时execute的简写 3.1.?使用系统存储过程exec?SP_databases 使用sp_renameDB修改数据库的名字 开启xp_cmdshell sp_configure?'show advanced options'1 go reconfigure 'xp_cmdshell'go 在C盘创建一个bank的文件夹 xp_cmdshell'mkdir c:bank'no_output no_output是可选参数,设置执行DOS命令后是否输出返回信息 'dir c:bank' 用户自定义的存储过程 在sql-server中,用于创建处处过程的sql语句为create procedure,所有的存储过程都存放在当前数据库中。一个完整的存储过程都包含以下三部分 1.输入参数和输出参数 2.在存储过程中执行的T-SQL语句 3.存储过程的返回值 编写一个求网络管理专业平均分数的存储过程 3.2.?创建一个自定义的存储过程--求网络管理专业的平均分 ? IF?EXISTS(SELECT?FROM?SYSOBJECTS?WHERE?name?=?'usp_GetAverageResult'DROP?PROCEDURE?usp_GetAverageResult GO CREATE?AS DECLARE?@subJectID?nvarchar(4)? SELECT?@subJectIDsubJectName'网络管理' @avg?decimal (182@avgavgmark@subJectID PRINT?'网络管理专业平均分是:'+CONVERTVARCHAR(5),255);font-size:13px;">exec?usp_GetAverageResult 4.?触发器4.1.?触发器的概念? 触发器时在对表进行插入,更新或删除操作时自动执行的存储过程。触发器通常用于强制业务规则,是一种高级约束,可以定义比用check约束更为复杂的约束,可执行复杂的SQL语句,可以引用其他表中的列。 触发器是通过事件进行触发而被执行的,而存储过程可以通过存储过程名而被直接调用。 当对某一个表进行修改,诸如UPDATE,INSERT,DELETE这些操作时,sql server会自动执行触发器所定义的sql语句,从而确保对数据的处理必须符合有这些sql语句所定义的规则,由此触发器可以分为: INSERT触发器: UPDATE触发器: DELETE触发器: deleted表和inserted表 每个触发器有两个特殊的表:删除表deleted和插入表inserted。这两个表是逻辑表,并且这两个表是由系统管理的额,存储在内存中,不是存储在数据库中。因此不允许用户直接对其进行修改。 这两个表的结构与被该触发器作用的表有相同的结构。这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除。这两个表主要保存因用户操作而被影响的原数据值和新数据值。另外这两个表是只读的,用户不能向其写入内容,但可以引用表中的数据。例如可以使用select查看select * from deleted 触发器的作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性 4.2.?创建触发器trigger?reminder TScore for?UPDATE print?'禁止修改,请联系DBA' ROLLBACK?TRANSACTION ? update?set?=100 '0000000001' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |