SQL server数据库可编程要点

SQL server

摘要

接上基础篇,对工作中常用的数据库可编程性总结,参考csdn部分博客(文中有链接)和 陕西国防工业职业技术学院SQL server2016数据库及应用 mooc课程

一 视图

  • 视图是查一个或多个表时生成的虚拟表,不包含数据,只包含查询定义,操作和操作表一样,可以对其进行查询,修改(有限制)和删除
  • 简化用户操作,使用户关注自己感兴趣的数据

1.视图创建

create view 视图名	[(<字段一>),(<字段一>)...]		--不能与现有表和视图重名,视图的属性列要么全省略,要么全定制,具体情况如下
as <子查询>				--任意的select语句
[with check option]		   --更新时强制满足子查询中的条件

--注意:不能够省略
--1.子查询目标列有聚集函数或列表达式。
--2.子查询为多表连接,并且选出了几个同名列作为视图的字段。
--3.需要在视图中为某个列使用别名。

--例,创建性别为“女生”的学生视图,并要求对视图进行更新时保证该视图只有性别为“女生”的学生。

create view is_girl_student
as
select * from Student
where sex = '女'
with check option

2.视图管理

查询视图

视图是一张虚拟的表,查询视图和查表操作一样。用户查询的数据可能存储在多个表中,查询起来比较复杂,通过查询视图查看多个表中的数据,就可以大大简化数据的查询操作。

--例:查询期末成绩有不及格课程的学生信息,结果包含学号、姓名、课程名称、期末成绩。
--创建视图 
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

你可能感兴趣的:(数据库,sql,数据库,sqlserver)