第九章 SQL Server的简单应用
第九章 SQL Server的简单应用
9。1 数据库的创建与管理
一、数据库的创建
CREATE DATABASE 教师库 --逻辑名
ON
(NAME ='教师库_Data', --物理名
FILENAME='D:\教师库_Data.MDF' , --物理位置
SIZE = 2, FILEGROWTH = 10%) --分配空间,增长速度
LOG ON
(NAME ='教师库_Log',
FILENAME='D:\教师库_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)
GO
采用默认方法:create database 数据库名,则默认的空间大小为1MB,并且按10%的速度自动增长。
二、数据库的查看与修改
1、使用企业管理器查看
2、使用T-SQL语句:利用存储过程。
SP_helpdb [数据库名]:查看服务器上的数据库信息
Sp_databases:与
SP_helpfile:查看当前数据库中文件的信息(数据文件与日志文件)
3、T—SQL语句:
alter DATABASE 教师库 --逻辑名
modify file
(NAME ='教师库_data', --物理名
maxSIZE =4, FILEGROWTH = 5%) --分配空间,增长速度
GO
sp_helpdb 教师库
三、数据库的删除
drop database 教师库
四、备份数据库
掌握企业管理的方法
9。2 表的创建与管理
一、表的创建
1、企业管理器方法
2、T-SQL语句的方法
CREATE TABLE教师(
[教师ID] [char] (10) NOT NULL ,
[教师姓名] [nvarchar] (50) NULL ,
[出生年月] [smalldatetime] NULL ,
[性别] [nvarchar] (50) NULL ,
[职称] [nvarchar] (50) NULL ,
[工资] [money] NULL ,
[系ID] [char] (10) NULL ,
CONSTRAINT [PK_教师] PRIMARY KEY CLUSTERED
([教师ID]) ON [PRIMARY] ,
CONSTRAINT [FK_教师表_系] FOREIGN KEY ([系ID]) REFERENCES [系表] ([系ID])) ON [PRIMARY]
GO
二、修改表、删除表
P:241,表结构的修改——尽量在表中无数据的时候修改列,增加列时,该列要保证有允许空值。
三、视图的创建
1、企业管理器中创建
2、T-SQL语句建立
CREATE VIEW 任课视图
AS
SELECT 教师表.*, 课程名称
FROM 教师表 RIGHT JOIN
教师任课表 ON 教师表.教师ID = 教师任课表.教师ID
9。3 索引的创建与管理
一、索引的概念
1、索引是在基本表的列上建立的一种数据库对象,一个指向表中数据的指针。
2、索引的作用:是改善数据库性能的最常用的技术。——在查找中加快速度。
3、SQL-Server的索引建立好后,由系统自动选择和维护。
二、索引的创建
索引的建立应该注意P:245
1、基本表的记录数量越多,越要建立索引
2、索引的建立会影响基本表的更新活动。只有对数据量大、查询频度较高、实时性要求强的基本表才创建索引。
3、索引是建立在基本表列上的对象,一般可以根据列在where order by group by 子句中出现较高的列来建立索引。
下面情况尽量不建立索引P:246
4、可以使用企业管理器或T-SQL语句来建立
create unique index 姓名 on 教师表(教师姓名)——索引名不能重复
例P:248,例9-2
三、索引的分类
1、从列的角度上分:
(1)单列索引:单列索引是对表中某一单独的列进行索引,是最简单最常用的索引,通常对主关键字列建立单列索引。
(2)唯一索引:可在一个或多个列上建立。不允许在此列上有重复的列值。作用是能提高查询速度,还可维护数据完整性。
(3)复合索引:对两个以上的列建立索引。
2、从是否改变表中记录的物理位置角度可分为:
(1)聚集索引:聚集索引的表按该列值表中的记录会重新排列(物理位置重新排列)
(2)非聚集索引:表中记录不改变其物理位置,而是仍按实际录入的先后顺序排列。在非聚集索引使用时,再按改变其逻辑位置。——实际上非聚集索引只是建立一个排列的指针。所以需要更多的空间。
(3)聚集索引与非聚集索引的区别:P:246~247——聚集索引的存取速度要比非聚集索引快、但一个表中只能建立一个聚集索引,即可建立最多249个非聚集索引。一个表中可同时有聚集索引与非聚集索引。
四、索引的删除
DROP INDEX 索引名
9。4 T—SQL的编程基础
一、程序注释语句
--:单行注释;
/*。。。。*/:多行注释。此多行注释中不能包括go语句。
二、变量
1、分类:局部变量@与全局变量@@
2、局部变量使用前要先定义,赋值、再使用
declare @变量名 数据类型——每次可定义多个变量
set|select @变量名=常量
(1)set 与select 赋值的区别为:set 只能一次一个变量,select 则可以一次给多个变量赋值。
(2)变量赋值时要注意数据类型要匹配。
例:P:251 例9-3,9-4,9-5,9-6
三、
四、程序结构
1、if …else 结构——条件分支结构
(1)if 逻辑表达式
单条语句or begin…end 语句组(多条语句)
else
单条语句or begin…end 语句组(多条语句)
课本P:253 例7
例1:查询某个教师是否是高级职称
use 教师库
go
declare @myN char(8)
set @myN='周建林'
if (select 职称 from 教师表 where 教师姓名=@myNO)='教授' or (select 职称 from 教师表 where 教师姓名=@myNO)='副教授'
print @myN+'是高级职称!'
else
print @myN+'不是高级职称!'
例2:查看周建林老师的工资是否大于2000,如果大于,则显示‘工资大于2000’,否则加到2000。
use 教师库
go
declare @myN char(8)
set @myN='周建林'
if (select 工资 from 教师表 where 教师姓名=@myNO)>=2000
print @myN+'的工资已过2000!'
else
begin
update 教师表 set 工资=2000 where 教师姓名=@myNO
print @myN+'工资已加到2000!'
end
(2)分支嵌套:P:254 ,例9-8
2、CASE多重分支结构
有两种结构P:255
例1:select 教师姓名,出生年月,年龄层次=
case
when 出生年月<'1950-01-01' then '老'
when 出生年月 between '1950-01-01'and '1969-12-31' then '中'
else '青'
end
from 教师表
例2;
--use xs
select 教师姓名,出生年月,年龄层次=
(
case
when 出生年月<'1950-01-01' then '老'
when 出生年月 between '1950-01-01'and '1969-12-31' then '中'
when 出生年月>'1970-01-01' then '青'
else ' '
end
),
工资层次=
(
case
when 工资<1000 then '低'
when 工资 between 1000 and 2000 then '中'
when 工资>2000 then '高'
else ''
end
)
from 教师表
3、while 循环结构:
语法结构P:256
while 逻辑表达式
begin
T-SQL语句组
[break]——无条件终止整个循环语句,即跳出循环
[continue]——结束本次循环,回到while处再判断是否重新开始下一次循环
end
例:declare @a int ,@b int ,@c int
select @a=1,@b=1,@c=20
while @c>0
begin
set @b=@b+3
set @a=@a+@b
if @b<10
continue
set @c=@c-5
select @a,@b,@c
end
Q1:循环几次?(2+4)
Q2:写出每次循环后abc的值各为多少?
例:9-11(课本P:256)
4、return返回语句
作用:在批处理、语句块或存储过程中,使用return可以从当前程序中退出,其后的语句将不会执行。如在上例加入return
例:declare @a int ,@b int ,@c int
select @a=1,@b=1,@c=20
while @c>0
begin
set @b=@b+3
set @a=@a+@b(此后加入 select @a,@b,@c return,结果又如何?)
if @b<10
continue
set @c=@c-5
select @a,@b,@c
end
课堂作业P:课本P:285 三:3、4、5
五、游标
1、 定义:交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行作为个性化处理。游标就是提供这种机制的结果集扩展。游标是结果集的逻辑扩展,它使应用程序得以逐行处理结果集。
2、 请求游标
Microsoft® SQL Server™ 2000 支持两种请求游标的方法: Transact-SQL
及数据库应用程序编程接口(API)游标函数 (我们只讨论后者)
对根据 SQL-92 游标语法制定的游标,Transact-SQL 语言支持使用它们的语法
3、 标准的SQL-92 语法定义游标:P:260
DECLARE cursor_name (游标名字)[ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement (必选子句)
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
说明:(若时间关系可以不讲)
A、INSENSITIVE
定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。
B、SCROLL
指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。
C、select 语句:定义游标结果集
D、UPDATE 定义游标中可更新的列
例9-13,例9-14
4、 从游标中检索行的操作称为提取。提取选项如下:
l FETCH FIRST :提取游标中的第一行。
l FETCH NEXT :提取上次提取行之后的行。
l FETCH PRIOR :提取上次提取行之前的行。
l FETCH LAST :提取游标中的最后一行。
l FETCH ABSOLUTE n :如果 n 为正整数,则提取游标中从第 1 行开始的第 n 行。如果 n 为负整数,则提取游标中的倒数第 n 行。如果 n 为 0,则没有行被提取。
l FETCH RELATIVE n :提取上次所提取行之后的第 n 行。如果 n 为正数,则提取所上次提取行之后的第 n 行。如果 n 为负数,则提取上次所提取行之前的第 n 行。如果 n 为 0,则同一行被再次提取。
注意:(1)打开游标时,游标中当前行的位置逻辑上应位于第一行之前。这使不同的提取选项具有下列行为,如果这是打开游标后的第一次提取操作:
FETCH FIRST :提取游标中的第一行。
FETCH NEXT:提取游标中的第一行。
FETCH PRIOR :不提取行。
注意:(2)Transact-SQL 游标限于一次只能提取一行。API 服务器游标则支持每次提取时提取一批行。支持一次提取多行的游标称为块状游标。
Transact-SQL 扩展语法增加了很多参数,基本语句是一样的。(有时间的同学可以自己查看SQL的帮助系统)
例1:定义一个游标,名为。。。,并从教师表中获取的数据行集以填充该游标
DECLARE teacher CURSOR(没scroll参数,这是个只进游标,只能有first next操作)
FOR SELECT * FROM 教师表 order by 出生日期
OPEN teacher —在应用中游标只打开一次就可以了,打开后游标指在第一条记录前
go
select * FROM 学生表
go
FETCH NEXT FROM stu --取得第一条记录信息
go
FETCH NEXT FROM stu --取得第一条记录信
Go
5、 游标可以按照它所支持的提取选项进行分类:
(1)只进
必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作。
在声明游标时未选用scroll参数时建立的游标就是只进游标,
(2)可滚动性
可以在游标中任何地方随机提取任意行。允许所有的提取操作(但动态游标不支持绝对提取)。
可滚动游标对支持联机应用程序特别有用。可将游标映射为应用程序中的表格或列表框。随着用户向上、向下和在整个表格中滚动,应用程序使用滚动提取从游标中检索用户想要查看的行。
例2:
declare pass scroll cursor for select * from 成绩表 where 成绩>60 order by 课程号,成绩 --定义一个滚动游标,其内结果集为成绩表中及格的同学记录
open pass
fetch first from pass –第一条记录
fetch next from pass 第二条记录
fetch last from pass 最后一条记录
FETCH PRIOR from pass 倒数第二条记录
6、 游标进程
Transact-SQL 游标和 API 游标有不同的语法,但下列一般进程可用于所有 SQL Server 游标:
A. 把游标与 Transact-SQL 语句的结果集相关联,并且定义游标的特征,如是否能够更新游标中的行。(声明游标)
B. 执行 Transact-SQL 语句以填充游标。(声明游标)
C. 检索想要查看的游标中的行。从游标中检索一行或多行的操作称为提取。执行一系列的提取操作以向前或向后检索行的操作称为滚动。
D. 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。
E. 关闭游标。
例3 :
declare in_c1 cursor for select 教师姓名,职称,工资 from 教师表 order by 工资 for update of 工资open in_c ——声明一个只进游标,但可以更新工资列。
declare @nin money ,@name char(8),@zc char(10) --定义变量
fetch next from in_c into @name,@zc,@nin --从游标中取得第一记录内容存入变量
while @@fetch_status=0 --判断获取是否成功,即记录是否取得完成
begin
if @zc='教授'or @zc=’副教授’
update 教师表 set 工资=工资+200 where current of in_c
else
update 教师表 set 工资=工资+100 where current of in_c
fetch next from in_c into @name,@zc,@nin --再次取数据,这条语句不可少,否则end 无法循环。
Go
Close in_c1 ——关闭游标
——这只是一个范例,采用遍历表的方式对数据表中的所有记录进行扫描更新,对大型库这个程序执行时间要考虑好。
7、 打开游标、 关闭游标、释放游标
open close deallocate
注意关闭与释放的区别P:261
8、 使用游标取数:
fetch…..from 游标 into @变量(表)
注意:INTO允许将提取的数据放入变量表中,各变量的数据类型要与游标选择列表中的相同。同时变量的数目要与列表中列的数目一样。
9、 与游标相关的系统全局变量:
A、@@fetch_status:返回FETCH语句的最后状态 0——表示获取成功,-1——表示获取失败或此行不在结果集中,-2表示被提取的行不存在。
B、@@cursor_rows:返回本次在服务器连接中打开游标取回的数据行的数目。
例:fetch first from pass
fetch next from pass
select @@fetch_status --返回0
fetch last from pass
fetch next from pass
select @@fetch_status --返回-1
select @@cursor_rows --返回10
例9-12:为了实现表9-2的结果,可使用游标编写以下代码:
USE xs --打开"教学管理"数据库
--创建"T学生表"
create TABlE 学生表(序号 int ,学号 char(8),姓名 char (8),年龄 int)
DECLARE @I int --声明计数器变量
--声明MyN0,MYName,MyAge变量用于存储学号、姓名、年龄字段信息1
DECLARE @MyN0 char(8),@MYName char(8),@MyAge int
DECLARE MyCursor SCROLL CURSOR --定义游标,游标名为MYcursor
FOR SElect 学生证号,姓名,年龄 FROM 学生基本信息表ORDER BY 年龄
OPEN MyCUrsor ---打开游标
SET @I=1 --计数器设初值1
FETCH FIRST FROM MyCursor
into @MyN0,@MYName,@MyAge --取"学生表"第一行记录,并对变量赋值
--通过@@fetcj_STATUS系统全局变量,判断是否到"学生表"的尾部,否则开始循环
While @@FETCH_STATUS =0
begin
INSERT INTO 学生表(序号,学号,姓名,年龄) ---向"学生表'中插入数据
VALUES(@I,@MyN0,@MYName,@MyAge)
fetch NEXT FROM MyCursor INto @MyN0,@MYName,@MyAge ---取下一行记录
SET @I=@I+1 --计数器值加1
End
close MyCursor --关闭并释放游标
DEALLOCATE MyCursor
SElect * FROM 学生表 --一查询"T学生表"数据
DROP TABLE T学生表 --删除'T学生表"
GO
10、 利用游标修改数据:
(1)、更新操作:
update 表名 set 列名= 表达式 where current of 游标名
(2)、删除操作:
delete from 表名 where current of 游标名
current of 游标名:指对当前游标数据行操作
例9-15
六、事务
1、事务的作用:
transaction是并发控制的基本单位。SQL Server通过事务机制,将逻辑相关的一组操作捆绑在一起,以便服务器保持数据的完整性
例9-16,9-17
事务机制的的解决方法:要么全部处理,要么全都不处理。
2、事务处理控制语句
begin tain ---开始一个事务名
commit tain ——提交一个事务
rollback ——回滚一个事务。(在发生情况时,撤消提交)
例9-18
9。5 存储过程
一、存储过程(stored procedure)
1、存储过程是一组预先编译好的T-SQL代码。
2、存储过程的作用P:265
二、创建存储过程
1、系统存储过程以SP_或DT_开头
2、创建存储过程的语法:P:266
create procedure 存储过程名
AS
Select 语句
例9-19
例:CREATE PROCEDURE xs AS select * from 学生表
三、执行存储过程
在查询分析器中使用。当是第一条语句时,可以直接用存储过程名,否则之前加上exec 。
如:exec xs
四、修改存储过程
alter procedure 存储过程名 AS select 语句
例:alter procedure xs as select 学号,姓名 from 学生表
五、删除存储过程
drop procedure 存储过程名
9。6 触发器
一、定义:
触发器是一种特殊的存储过程。它与表紧密相连,主要用来保证数据的完整性。
二、触发器的建立
1、语句:P:269
create trrigger 名 on 表名 for [insert | delete | update ]
AS
SQL语句
2、例1
create trigger mytr on spk1 for delete 设置一个删除触发器
as
declare @OID char(10) --定义一个变量,用于从逻辑表中存储被删除的记录信息
select @OID=商品代号 from deleted --从逻辑表中检索被删除的商品代号
delete from spk2 where 商品代号=@OID
GO
delete from spk1 where 商品代号='DSJ-120'--此条语句执行后,相应的在SPK2中的DSJ-120记录也被删除。
例2:建立一个更新触发器
create trigger mytr on spk1 for update 设置一个触发器,相连删除与插入操作
as
declare @OID char(10) --定义两个变量,用于存储被删除的记录信息
declare @NID char(10) --存储被插入的记录信息
select @OID=商品代号 from deleted
select @NID=商品代号 from inserted
update spk2 set 商品代号=@NID where 商品代号=@OID
return ---返回语句
update spk1 set 商品代号='DSJ-111' where 商品代号='DSJ-120'
练习:仿上面两个例子,建立一个插入记录的触发器
3、触发器的建立必须是批处理中的第一条语句。触发器建立好后,由SQL Server系统自动执行。(与索引一样)
一个表中可以建立很多个触发器。一般一种操作建立一个。
三、删除触发器
drop trigger 触发器名
四、修改触发器:与建立语句一样。
9。7 数据库完整性管理
SQL SERVER实施完整性的主要途径
P:271 表9-3
数据完整性是指存储在数据库中的数据的正确性和相容性,以防止不符合语义的数据进入数据库。
数据完整性分为:实体完整性、值域完整性、参照完整性、用户定义的完整性。SQL Server可以用以下的途径来实施数据完整性:
约束(Constraint)
– 标识列(Identity Column)
– 默认值(Default)
– 规则(Rule)
– 触发器(Trigger)
– 数据类型(Data Type)
– 索引(Index)
– 存储过程(Stored Procedure)
这些途径使用时可以用在数据完整性的多方面。
• 考试重点表9-3(P271
一、 使用约束实施数据的完整性
在第四章曾提过:约束是限制用户输入到表中的数据的值的范围,一般分为列级约束与表级约束。
列级约束有六种:主键Primary key、外键foreign key 、唯一 unique、检查 checck 、默认default 、非空/空值 not null/ null
表级约束有四种:主键、外键、唯一、检查
(一)建立的语法格式:
A、在利用T-SQL语句建立表时加入约束,分为列级约束与表级约束
CREATE TABLE 表名(
字段名1 数据类型 constraint 约束名 约束类型(受约束字段),--列级约束
。。。。
constraint 约束名 约束类型(受约束字段) ---表级约束
)
B、表已建立好的基础上,增加约束:
Alter table 表名 add constraint 约束名(受约束字段名或表达式)
例1:create table xsb(
xh char(8) constraint PK_xh primary key constraint FK_xh references 学生表(学号) , --主键、外部键列级约束——外部键只在表定义时才给出)
xm char(6) constraint UN_xm unique constraint n_n not null, --唯一性、非空列约束
xb char(2) constraint CH_xb check (xb='男'or xb='女') --检查列级约束
)
Q1:在第四章讲到标准的SQL语句建表时的加入以上约束是如何写的?
create table xsb(
xh char(8) primary key references 学生表(学号) , --主键、外部键列级约束--外部键只在表定义时才给出)
xm char(6) unique not null, --唯一性列约束,非空列约束
xb char(2) check (xb='男'or xb='女') --检查列级约束
)
Q2:对比两种写法,有何不同?
——T-SQL中增加了constraint 约束名 ,即使用T-SQL的写法,表中的每个约束都会有按给定的名字,而标准的SQL语句创建的表,其约束名是系统给出。
例2:若表已建立好但没有加任何约束,则可以用下面的语句:
alter table xsb add constraint PK_xh primary key(xh) ——对主键字段,建立时必须为非空
alter table xsb add constraint ch_xb check (xb='男'or xb='女') --增加
alter table xsb add constraint un_xm unique(xm)
alter table xsb add constraint DF_xb default '男' for xb --增加默认约束
(二)删除的语法格式:
删除约束:ALTER TABLE DROP CONSTRAINT 约束名
(三)注意事项
1、约束建立时会自动建立索引的有主键(建立聚集索引)、unique(建立非聚集索引)
2、建立主键约束的字段一定要非空,而建立唯一约束的字段最好也规定为非空;
3、default不能放在标识列字段或时间戳数据类型(它们会自动加入数据)
二、 使用规则实施数据的完整性
建立规则——绑定规则到具体表中某列——解除绑定——删除绑定
create rule sex
as @sex='男'or @sex='女' ――建立一个规则,它可以用在该数据库的任何表。
sp_bindrule sex ,'xsb.xb '草药 ―将此规则绑定在xsb中的xb列,可同时绑定在多个表中
sp_unbindrule 'xsb.xb ' ――解除梆定在xsb中的xb列的规则
drop rule sex --删除规则,但在删除前要确定已解除了所有绑定。
三、 使用默认实施数据完整性
与绑定相似。
9。8 SQL Server数据库安全性管理
SQL Server提供了内置的安全性和数据保护机制,归纳为四种:客户端的操作系统安全、数据库的登录安全、数据训使用安全和数据库对象的使用安全。
依赖账户管理来实现。——SQL server登录账号与集成的Windows登录账号码P:277
登录后,则依赖用户账号和登录账号之间的关系来实现数据库访问P:279
总结第九章
一、T-SQL的语句
1、建立命令:
database name P:231
table name
create view name as SQL 语句
proc name as SQL语句
trigger 触发器名 on 表名 for 操作 AS SQL语句
index 索引名 on 表名 P:248
rule 规则名 AS 条件表达式 P:275
default 默认名 AS 默认值
例:
2、修改命令:
datebase 数据库名 modify file ( ) P:235
alter table 表名 add 列名 数据类型 | drop column列名
proc 存储过程名 AS SQL语句
3、删除命令:
database 数据库名
drop table 表名
index 索引名
proc 存储过程名
trigger 触发器名
4、定义变量命令与定义游标命令
declare @变量名 数据类型
declare 游标名 cursor for SQL语句
5、编程语句:
(1)IF 。。。else
(2)case
(3)while
(4)begin …end
(5)return
6、约束的建立与修改
7、 概念:
(1)索引的概念、分类
特点是聚集索引与非聚集索引的区别
(2)游标的概念
(3)触发器
(4)存储过程: