接上基础篇,对工作中常用的数据库可编程性总结,参考csdn部分博客(文中有链接)和 陕西国防工业职业技术学院SQL server2016数据库及应用 mooc课程
create view 视图名 [(<字段一>),(<字段一>)...] --不能与现有表和视图重名,视图的属性列要么全省略,要么全定制,具体情况如下
as <子查询> --任意的select语句
[with check option] --更新时强制满足子查询中的条件
--注意:不能够省略
--1.子查询目标列有聚集函数或列表达式。
--2.子查询为多表连接,并且选出了几个同名列作为视图的字段。
--3.需要在视图中为某个列使用别名。
--例,创建性别为“女生”的学生视图,并要求对视图进行更新时保证该视图只有性别为“女生”的学生。
create view is_girl_student
as
select * from Student
where sex = '女'
with check option
视图是一张虚拟的表,查询视图和查表操作一样。用户查询的数据可能存储在多个表中,查询起来比较复杂,通过查询视图查看多个表中的数据,就可以大大简化数据的查询操作。
--例:查询期末成绩有不及格课程的学生信息,结果包含学号、姓名、课程名称、期末成绩。
--创建视图
create view v_sc
as
select Student.Sno, Sname, Cname, EndScore
from Student
join Score ON Student.Sno = Score.Sno
join Course ON Score.Cno = Course.Cno
--查询视图
select * from v_sc where EndScore<60
alter view 视图名 [(<字段一>),(<字段一>)...]
as
<selecl语句>
--例:修改视图is_girl,使其能够显示学生表中男生和女生的人数。
alter view is_girl
as
select sex as '性别',count(sno) as '人数'
from Student
group by sex
Drop View<视图名>[CASCADE]
--当使用了CASCADE关键字时,表明在删除当前视图时,如果有其它视图建立在当前视图的基础上,则把其它视图一起删除。
索引是对数据库表中的一个或多个列的值进行排序的结构,索引是依赖于
表建立的,它提供了数据库中编排表中数据的内部方法。对索引的理解
优点∶
索引能提高查询表内数据的速度;
能加快标表与表之间的连接速度。
缺点:
创建和维护索引增加了额外的时间开销;
索引会占用一定的存储空间,占用空间过大时会影响数据库的性能。
缺点∶
创建和维护索引增加了额外的时间开销。
2.索引会占用一定的存储空间,占用空间过大时会影响数据库的性能。
索引的分类
根据索引页的顺序与数据页中行的物理存储顺序是否相同,可以把索引分
为集聚索引和非聚集索引。
创建索引的基本原则
定义有主键或外键的数据列一定要建立索引。
对于经常查询的数据列最好建立索引。
对于需要在指定范围内快速或频繁查询的数据列最好建立索引。
经常使用在where子句中的数据列最好建立索引。
create [unique] --建立唯一索引
[clustered|nonclustered] --聚集索引|非聚集索引
index <索引名>
on <表名|视图名> --建立索引的表或者视图
<列名[,列名]> --建立索引的表或者视图的列
[with [索引属性[,索引属性]]] --设置索引的属性
--例:
create index index_name on Studen (sname)
分析索引
set showplan_all on|off --显示查询计划
--例︰在学生表中查询姓“陈”的学生信息,并分析哪些索引被系统采用。
Set showplan_all on;
go
select Sno sname from Student where Sname like '陈%'
go
Set showplan_all off;
set statistics io on|off --显示磁盘活动量
--例:在学生表中查询姓“陈”的学生信息,并分析磁盘活动信息。
Set statistics io on;
go
select Sno sname from Student where Sname like '陈%'
go
Set statistics io off;
维护索引
--扫描表︰指如果对表频繁的数据操作,就会产生表的碎片,而表碎片会导致不连续的数据页读取,造成数据库查询性能降低。
dbcc showcontig(表名,索引名)
--例:利用语句获取S数据库中student表的IX_Student索引碎片信息。
dbcc showcontig(student,IX_Student)
--注意扫描结果中的扫描密度,理想值是100%
--碎片整理
dbcc indexdefrag(数据库名,表名,索引名)
功能同其他语言一样,实现某些功能和特定操作。
优点
1.提高了语句的重用性、共享性和可移植性
2.减少重复编写程序段的工作量,提高程序可读性
3.能够实现较快的执行速度,能够减少网络流量
分为系统函数和用户自定义函数,这里主要说自定义函数
--创建标量值函数,创建函数时指定了函数所有者,那么调用的时候也必须指定函数的所有者。(一般都为 dbo)
create function [函数的所有者].函数名(@参数,参数类型 [=默认值])
returns 标量返回值类型
[with {Encryption | Schemabinding }]
as
begin
函数体(即 Transact-SQL 语句)
return 变量/标量表达式
end
--创建内联表函数
create function [函数的所有者].函数名(@参数,参数类型 [=默认值])
returns table --返回一张表
[with encryption] --如果指定了 encryption 则函数被加密
as
return (一条SQL语句)
--创建多表值函数
create function [函数的所有者].函数名(@参数,参数类型 [=默认值]))
returns @表变量 table 表名(表的定义建表操作)
as
begin
函数体(即Transact-SQL语句)
return
end
--调用函数
select 数据库名.所有者名.函数名(参数)
--修改函数:alter
--删除函数
drop function 函数名
一组完成特定功能的sql
语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数来执行存储过程
优点:
存储过程已在服务器注册。
存储过程允许模块化程序设计。
存储过程可以加快运行速度。
存储过程可以减少网络通信流量存储过程可以作为安全性机制。
--不带参数的存储过程
create procedure[edure] <存储过程名>
with
{recompile|encryption|recompile,encryption} --recompile:表明不保存该存储过程的执行计划,该存储过程将在运行时重新编译。encryption:指定SQL Server对syscomments表中包含本CREATE PROCEDURE语句文本的条目进行加密
as
<sql语句>[...n] --sql语句
--例:在数据库中创建一个名为“统计人数”的存储过程,用于从学生表中统计出各个班的总人数,插入到一个新表“class_num”中;class_num表的结构如下︰(班级编号nchar(10),总人数smallint )。
create proc proc_count
as
begin
delect from class_num
insert into class_num(班级编号,总人数)
select 班级编号,count(*) from Student group by 班级编号
end
--调用
exec proc_count
--修改 alter
--删除 drop
--带参数的存储过程
--输入参数
create proc <存储过程名> --取名不用sp_开头,sp为系统存储过程
@<参数名><数据类型>[n...]
as
<sql语句>[...n]
--例:创建存储过程p_studentC,根据给定的班级编号,返回对应的所有学生信息。
create proc p_studentC
@classNO nvarchar(10)
as
select * from Student where classNo = @classNO
--执行
exec p_student @classNO = '1110'
--输出参数
create proc <存储过程名> --取名不用sp_开头,sp为系统存储过程
@<参数名><数据类型>[n...]
as
<sql语句>[...n]
--例:创建存储过程p_classNum,根据给定的班级编号统计该班的学生人数,并返回学生人数。
create proc p_classNum
@classNo nvarchar(10),@classNum smallint output
as
set @classNum=(
select count(*) from student where classNo = @classNo
)
print @classNum --输出classNum
--调用
declare @classNo nvarchar(10),@classNum smallint --定义局部变量传值和接收返回值
set @classNo = '1111'
exec p_classNum @classNo,@classNum output
select @classNum --查询返回值
触发器( trigger )是一种特殊的存储过程,它与表格紧密相连,可以看作是表格定义的一部分。当用户修改指定表或视图中的数据的时候,触发器会自动执行。触发器基于一个表创建,但是可以针对多个表进行操作。
优点
1.自动执行,在表的数据做了任何修改(比如手工输入或者使用命令删除记录的操作)之后立即激活。
2.通过数据库中的相关表进行层叠更改。这比直接把代码写在前端的做法更安全合理。
3.强制限制,这些限制比用CHECK约束所定义的更复杂。与CHECK约束所不同的是,触发器可以引用其它表中的列。
4.比较修改前后表中数据的不同,并根据这些不同来进行相应的操作。
5.对于一个表上的不同操作(INSERT、UPDATE或DELETE)可以采用不同的触发器,即使是对相同的语句也可以调用不同的触发器完成不司的操作。
--按操作方式分
--DML触发器 (insert update delect)
--DDL触发器 (create alter drop)
--按执行时间分
--instead of 用于替代引起触发器执行的T-SQL语句,它的功能是不执行指定的操作,而是执行instead of触发器中定义的操作。除表之外,INSTEAD OF触发器也可以用于视图,用来扩展视图可以支持的更新操作。
--after 在一个INSERT、UPDATE或DELETE语句之后执行,进行约束检查等动作都将在AFTER触发器被激活之前发生。AFTER触发器只能用于表。
create trigger <触发器名> --触发器名唯一
on{表|视图}
[with encrtption] --加密syscomments表中包含create trigger语句
{
{for|after|instead of}
{[delect][,][insert][,][update]}
as
[if update (列)[{and|or} update (列)] [n...]]
sql语句[n...]
}
--例:在数据库中创建一个INSERT触发器,在对student表插入新的记录时,检查“班级编号”字段的值,如果student表不存在,则不执行插入操作并提示用户。
create trigger stu_insert
on student
after insert
as
declare @dep_id varchar(10)
select @dep_id = 班级编号 from inserted --判断是否存在该编号
if not exists(select * from student where 班级编号 = @dep_id)
begin
print '不存在 '
rollback transaction --回滚所有操作
end
--显示有关触发器的信息
sp_help 触发器名︰显示触发器的所有者和创建时间
sp_helptext 触发器名∶显示触发器的源代码
sp_helptrigger 表名∶显示某个表定义的触发器清单
sp_depends 触发器名∶显示该触发器引用的对象清单
--有时候需要暂时让触发器失效,在修改表的ALTER TABLE语句中使用DISABLE TRIGGER。当再次使用时,在ALTER TABLE语句使用ENABLE TRIGGER
处理数据的一种方法 类似于c语言的指针
使用步骤
声明游标 declare
打开游标 open
提取记录 fetch into
关闭游标 close
释放游标 deallocate
游标基本使用静态游标和动态游标
[local|global] --指定该游标的作用域是局部的还是全局的。
[forward_only|scroll] --指定游标只能从第一行滚动到最后一行。SCROLL:声明滚动游标。即可使用相应关键字指定游标的移动位置。(关键字如FIRST、LAST、PRIOR、NEXT等)。
[read_only] --禁止该有游标进行跟新
for select 语句
[for update[of 列清单]]
--游标移动位置
--NEXT:后一条记录(是默认选项)
--PRIOR:前一条记录
--FIRST:第一条记录
--LAST:最后一条记录
--RELATIVE n:相对于当前记录的移动位置(+前移,-后移)
--ABSOLUTE n:结果集的第n行( -则从尾部起算)
--打开游标语法∶OPEN游标名
--可使用@@CURSOR_ROWS确定游标打开尼游标存取使用语法:
fetch
[ [ NEXT |PRIOR|FIRST | LAST|ABSOLUTE n | RELATIVE n ] from ]
{ [ GLOBAL]游标名}│@游标变量名}
[ into@变量名1[,...,@变量名n ] ]
--例
declare @id int , @name nvarchar(50) --声明变量,需要读取的数据
declare cur cursor STATIC --声明静态游标
for
select * from Student
open cur --打开游标
fetch next from cur into @id, @name --取数据
while ( @@fetch_status = 0 ) --判断是否还有数据
begin
select '数据: ' + RTRIM(@id) + @name
update Student set name='张三' where id=4
fetch next from cur into @id, @name --这里一定要写取下一条数据
end
close cur --关闭游标
deallocate cur