学习笔记 源自于《Sybase基础教程》
2012.7.5 Thursday
第一讲 Sybase基础知识
一、Sybase SQL Server是一个多库结构的RDBMS,体系结构大致如下:
1.系统数据库
Sybase 在安装时,自动创建了四个系统数据库:
master、model、tempdb、sybsystemprocs
(1)master 数据库
它是管理和控制用户数据库以及维护服务器正常运行的核心数据库,它保存了大量的系统信息,如服
务器配置、用户、设备等。
在 master 数据库中不允许普通用户在其中创建数据库对象,否则会使得 master 数据库的事务日志很
快变满。如果事务日志用尽,就无法使用 dump transaction 命令释放 master 数据库中的空间。
(2)model 数据库
它是为创建用户数据库而提供的模板。每当创建新的数据库时,SQL Server 自动建立 model 数据库的
一份拷贝,并把它扩充到用户所要求的大小,以此作为新用户数据库。
Model 数据库中包含每个用户数据库所要求的系统表。Model 数据库可以被修改以便定制新创建的。
(3)tempdb 数据库
它是个临时数据库,为服务器运行与处理提供一个共享的存储区域,如 group by 和 order by 的中间
结果就存放在这里。Tempdb 的空间为服务器中所有数据库的所有用户所共享。
每次重启 SQL Server,服务器的一个自动进程都拷贝 model 数据库到 tempdb 数据库,并清除 tempdb
中原来的内容。因此 tempdb 中的用户表都是临时的。临时表分为两类:可共享的和不可共享的。不可共享
的临时表在由 create table 中将符号#置于表名之前创立;可共享的临时表通过 create table 中指定表名
前缀 tempdb..而创立。不可共享的临时表 SQL Server 自动为其添加数字后缀名,且它只存在于当前会话
中。
(4)sybsystemprocs 数据库
它是专门用来保存系统命令(存储过程)的数据库,如 sp_help、sp_configure、sp_helpdevice 等。
当任一数据库用户运行以 sp_开头的存储过程时,SQL Server 按照以下顺序查找:当前数据库、
sybsystemprocs 数据库、master 数据库。
2.用户数据库
用户数据库是我们使用 Sybase 服务器的真正目的。要管理用户数据,必须在 Sybase 中创建自己的数
据库,它是指用 create database 命令创建的数据库。不能存取 master 数据库的用户是无权创建新的数据
库的。
数据库中的主要内容——数据库对象:
表、视图、临时表
索引、主键、外键
缺省值、规则
存储过程、触发器等
二、Sybase 的安装与配置
1. 安装建立 SQL Server 以后,要建立放置数据库、日志和索引的逻辑磁盘设备。数据库、日志和索引的
配置应注意以下原则;
a.不要把任何用户对象安装在 master 数据库中。
b.日志应该保存在与数据库分离的磁盘上。
c.可以通过跨越多个设备分配工作优化 I/O 性能。
2.创建用户数据库
以下通过一个建立数据库的脚本说明建立数据库的过程:
//创建数据库设备,设备大小以页(2K)为单位
disk init name=”test_dbdev”, physname=”c:\test\test_dbdev.dat”, vdevno=10, size=10240
go
disk init name=”test_logdev”, phyname=”c:\test\test_logdev.dat”, vdevno=11, size=5120
go
//创建数据库 TEST_DB,其大小为 20M,日志大小为 10M
create database TEST_DB on test_dbdev=20 log on test_logdev=10
go
//打开数据库
use TEST_DB
go
3.SQL Server 的配置参数
服务器配置是系统管理员的职责,正确的配置对系统性能有重大的影响。有两个系统表存储配置信息:
sysconfigures 和 syscurconfigs;sysconfigures 是永久性的,一旦系统运行,sysconfigures 的信息就
拷贝到 syscurconfigs 中。显示配置和改变配置使用系统过程 sp_configure。
有两种配置值:动态的和静态的,动态值一旦改变立即生效,静态值要在系统重启动后才起作用。
第二讲 数据库设备与存储空间管理
1. 磁盘读写速度是 I/O 操作的瓶颈,正确地把数据库对象放置到物理设备上有利于改进性能;
把日志和数据库对象置于单独的设备上可以提高系统性能;
把表放在一个硬盘上而把索引放在另一个硬盘上,由于把工作分置于两个硬盘驱动器上,所以可以确
保物理读写速度加快;
磁盘镜像会降低磁盘写的速度。
2.设备
Sybase 将数据库中的所有数据存放在设备上。
设备是 Sybase 预先配置的专门存放数据库的一块连续的磁盘空间,并且它被映射到一操作系统文件或
一原始磁盘分区上。它有两个对应的名称:逻辑名和物理名。NT 仅支持设备映射到文件。
设备与数据库之间的关系:多对多关系。一个数据库可以被创建或扩充到多个设备上,一个设备也可
以被用来存放多个数据库。不同的设备操作系统可以对其并行地读写,因此我们可以人为地将一个数据库
放置到多个数据库设备上。
设备的分类:Database Device 和 Dump Device。数据库设备存放数据库和事务日志,转储设备用来存
放数据库或日志的备份。
1)设备的创建
DISK INIT Name=’device_name’, Physname=’physical_name’, Vdevno=virtual_device_number
Size=number_of_pages
[......]
举例说明:
DISK INIT Name=’My_Device’, Physname=’D:\database\My_device.dat’, Vdevno=3 Size=5000
注释:逻辑名、物理名、设备虚拟号、设备大小
创建转储设备:
sp_addumpdevice{‘disk’|’tape’} Logical_Name, Physical_Name, TapeSize
2)默认设备
在没有指定设备的情况下,用户创建的任何数据对象自动存放在默认设备上。
初始安装后,系统的主设备 master 被预指定为默认设备,因此要尽快创建自己的默认设备。确保以下
设备不是默认设备:系统主设备、指定仅被日志使用的设备。
Sp_diskdefault 设备名[,DefaultOn|DefaultOff]
3)磁盘镜像
磁盘镜像是出于数据库安全性的考虑,当介质失败时,磁盘镜像能提供不间断恢复。磁盘镜像是磁盘
上的数据的绝对拷贝。如果某一硬盘事故发生,则该被损坏的拷贝就自动变成离线状态,因而所有的读写
都被引向未被损坏的拷贝。
Sybase 的磁盘镜像是在设备级上进行的,因此磁盘镜像实质上是设备镜像。当对某一设备进行镜像操
作时,Sybase 自动创建一个附加设备,由镜像处理程序将原设备上的所有数据拷贝到镜像设备上。
镜像命令语法:
Disk Mirror Name=’device_name’, Mirror=’physical_name’ [,writes=serial|noserial]
// ’device_name’为被镜像的设备
4) sp_dropdevice logical_name[,delfile]
含有数据库的设备不允许删除。
5)创建与使用段
段(Segment)是数据库设备上磁盘空间的逻辑组合,它可以看作是指向一个或多个数据库设备的标签。
利用段可以控制数据库对象的存放位置,可以将数据库对象分类存放到不同的段上。
设备与段之间的关系:多对多关系。一个设备上可以创建多个段,一个段也可以覆盖多个设备。
使用段的优点
a. 控制空间的使用:放在一个段上的数据库对象不会在段外增长;
b. 提高性能:处于不同磁盘设备上的段可以并行地读写;
c. 处理大表:利用段,可以将一个大表分段放在独立的物理设备上,如将一个表的文本或图象数据存
储另外的一个段上。
创建段
sp_addsegment 段名,数据库名,设备名
说明:在指定设备上为某个数据库创建一个段。
●两个数据库放在同一设备的不同段上,它们不会相互影响;
●当数据库增加空间时,增加的空间会自动分配到它的每一个段上;
3.更改数据库
1)改变数据库属主
通常用户数据库有系统管理员创建,它的默认属主是 dbo。系统过程 sp_changeddbowner 可改变数据库的
属主关系,它必须由数据库管理员在要改变属主关系的数据库中执行。语法如下:
sp_changeddbowner login_name[,True]
其中参数 True 用于将权限一半传递给新属主。
2)扩展数据库
a.)扩展数据库空间
alter database 数据库名
on 设备名=扩展空间 //单位:M
如果扩展的设备对于数据库是新的,System 和 Default 段会自动扩展到该设备上。
b.)8
第三讲 数据库与事务日志
一、创建用户数据库
Create Database 数据库名
On 设备_1=Size_1,//单位:M
设备_2=Size_2,
??
log on 日志设备=Log_Size
[With Override]//在同一设备上创建数据库和事务日志时使用该选项
[For Load] //禁止用户访问直到数据库的装入或恢复操作完成为止
举例:
Create Database test_db
On data_dev=100,//单位:M
Index_dev=50
Log on log_dev=30
说明:
(1)将日志放在单独的设备上,有利于数据库性能的提高;
(2)图示:
Data_dev Index_dev log_dev
(3)如果将数据库和日志放在同一设备上,就不能实现增量备份;
(4)通常将 System 和 Default 段缩减范围到一个设备上,如删除设备 Index_dev 上的 System 段和 Default
段,创建新的段,用来存放专门的数据库对象。
二、更改数据库
1.改变数据库属主
通常用户数据库有系统管理员创建,它的默认属主是 dbo。系统过程 sp_changeddbowner 可改变数据库的
属主关系,它必须由数据库管理员在要改变属主关系的数据库中执行。语法如下:
sp_changeddbowner login_name[,True]
其中参数 True 用于将权限一半传递给新属主。
2.扩展数据库
(1)扩展数据库空间
alter database 数据库名
on 设备名=扩展空间 //单位:M
如果扩展的设备对于数据库是新的,System 和 Default 段会自动扩展到该设备上。
(2)扩展事务日志到新的设备上
sp_logdevice 数据库名,设备名
举例:将数据库另外扩充 5M,用于存储日志
alter database my_db
on my_dev=5
go
sp_logdevice my_db,my_dev
go
(3)删除数据库
drop database 数据库名
删除设备前必须删除其上的所有数据库,删除设备的命令是:sp_dropdevice
三、事务日志
9
3.删除数据库
drop database 数据库名
删除设备前必须删除其上的所有数据库,删除设备的命令是:sp_dropdevice
三、事务日志
日志文件是用来记录数据库每一次修改活动的文件。SQL Server 中的每一个数据库都有自己的日志文件,
即系统表 syslogs,也称为事务日志。事务日志是撤消事务和出现故障时恢复事务的依据。
在某些情况下,事务日志比数据本身更为重要。
什么是事务?
数据库的修改是以事务为单位进行的。一个事务就是一个操作序列,这些操作要么全做,要么全不做,它
是一个不可分割的工作单位。任何一个事务具备如下特征。
(1)执行的原子性(Atomic);
(2)保持数据的一致性(Consistency);
(3)彼此的隔离性(Isolation);
(4)作用的持久性(Durability)。
上述事务的四个特征被称为事务的 ACID 准则。
事务在运行过程中,SQL Server 把事务开始、事务结束以及对数据库的插入、删除和更新等每一个操作作
为一个日志记录存放到事务日志中。事务中的更新操作首先在数据库缓冲区(内存)中进行,缓冲区分别
有用来记录操作活动的数据页(data page)和日志页(log page)。当运行到 commit tran 时,日志页首
先从缓冲区写到磁盘上,而后数据页从缓冲区写到磁盘上,即遵循“先与日志(write_ahead log)”的原
则,这样保证出现故障的情况下,通过日志能够得到最大限度的恢复。恢复必须撤消发生故障时还未提交
的事务,已完成的事务若仍有未从缓冲区写到数据库设备中,还要重新运行该事务。
附:创建与装载数据库实例
use master
declare @vdevno int
select @vdevno=max(convert(tinyint,substring(convert(binary(4),d.low),v.low,1)))+1
from master.dbo.sysdevices d,master.dbo.spt_values v
where v.type=’E’and v.number=3
declare @v_str char(2)
select @v_str=convert(char(2),@vdevno)
print @v_str
disk init
name=”YDDATA”,
physname=”D:\Syb_Data\YDDATA.dat”,
vdevno=@vdevno+1,
size=153600
disk init
name=”YDINDEX”,
physname=”D:\Syb_Data\YDINDEX.dat”,
vdevno=@vdevno+2,
size=102400
disk init
name=”YDLOG”, physname=”D:\Syb_Data\YDLOG.dat”,
vdevno=@vdevno+3,
size=76800
create database YDMISDB
on YDDATA=300,YDINDEX=200
log on YDLOG=150
use YDMISDB
execute sp_addsegment indexdev,YTMISDB,YTINDEX
execute sp_dropsegment “default”,YTMISDB,YTINDEX
execute sp_dropsegment system,YTMISDB,YTINDEX
use master
load database YDMISDB from ‘d:\yd_dump\ydmis_backup.dmp’
online database YDMISDB
2012.7.7
第六讲 数据库与T-SQL 语言
一、关系模型的基本概念
关系(Relation)是一个由行和列组成的二维表格,表中的每一行是一条记录(Record),每一列是记录
的一个字段(Field)。表中的每一条记录必须是互斥的,字段的值必须具有原子性。
二、SQL 语言概述
SQL(结构化查询语言)是关系数据库语言的一种国际标准,它是一种非过程化的语言。通过编写 SQL,
我们可以实现对关系数据库的全部操作。
●数据定义语言(DDL)——建立和管理数据库对象
●数据操纵语言(DML)——用来查询与更新数据
●数据控制语言(DCL)——控制数据的安全性
T-SQL 语言是 Sybase 对 SQL92 标准的一种扩展,主要在它的基础上增加了三个方面的功能:自己的数据类
型/特有的 SQL 函数/流程控制功能
T-SQL 中的标识符使用说明:
(1)标识符由 1-30 个字符或数字构成,但首字符必须为字母。临时表的表名以#开头,长度不能超过 13
个字符。
(2)数据库对象的标识方法举例
database.owner.tablename.columnname
执行远程存储过程:
EXEC server.db.owner.proc_name
当执行语句在批处理的句首时,EXEC 可以省略。
三、Sybase 的数据类型
在创建表或声明局部变量时,必须使用 Sybase 系统预定义类型。
1.字符类型
Char(n) VarChar(n)
2.数值类型
整数类型——Integer SmallInt TinyInt
浮点类型——Real Float Number[P,S] Decimal[P,S]
货币类型——Money SmallMoney
3.日期/时间类型
Datetime SmallDatetime
两者时间部分的精度不同,前者精确到分,后者精确到 1/30 秒。
4.文本和图像类型
Text Image
5.二进制数据类型
Binary(n) VarBinary(n)
四、数据定义语言
用来定义数据库对象。数据库对象是 Sybase 用来存储数据的逻辑实体,主要有:
表(Table)、视图(View)、临时表(Temp Table);
主键(Primary Key)、外键(Foreign Key)、索引(Index)、规则(Rule)、默认值(Default);
存储过程(Stored Procedure)、触发器(Trigger)
●基本语法
下面给出创建主要数据库对象的语法:
1.表
创建表的基本语法是:
Create table[database.[owner].]table_name
(column_name datatype [default {constant_expression|user|null}]
{[{identity|null|not null}]|[[constraint constraint_name]
16
{{unique|primary key}[clustered|nonclustered]
[with{fillfactor|max_rows_per_page}=x]
[on segment_name]
|references[[database.]owner.]ref_table
[(ref_column)]
|check(search_condition)}]}?
在建立大型的数据库时,可以考虑将创建表乃至其它数据库对象的过程写到一个文本里,当数据库系统出
现问题时,在最坏的情况下,重建过程可以得到简化,也能比较好的对数据库的建设过程进行监视。
创建表的过程完成下列活动:
·定义表的每一列;
·定义列名和列的数据类型并指定列是否处理空值;
·指定列是否具有 IDENTITY 属性;
·定义列级的完整性约束和表级的完整性约束
上述过程可见,创建表的过程可以设定填充因子,将列置于段上,设计索引,外键等等。
2.索引
索引对查询性能的影响很大,要引起重视。
索引加速了数据检索,Adaptive Server 有三类索引:
·复合索引——索引包含多列;当两列或多列由于它们的逻辑关系而作为整体被查询时可建立这种索引;
·唯一索引——索引列的值不允许重复;
·簇聚索引和非簇聚索引——簇聚索引强迫 Server 不断地对表中数据排序或重排序以保证表中数据的物
理顺序和逻辑顺序的一致性,簇聚索引对范围查询性能影响极大;非簇索引没有这样的要求,非簇聚索引
对修改操作有利。
何时建索引?
·如果手动插入 identity 列,则创建唯一索引以保证不插入已经存在的值;
·经常被排序访问的列,即被列在 order by 子句中的列,最好对其建立索引以便 Adaptive Server 能充分
利用索引顺序的优点;
·如果列经常用手连接,则可对列建立索引,这样系统能更快地执行连接;
·包含主键的列一般都有簇聚索引,尤其是当它频繁地和其它表的列相关联;
·经常被范围查询的列最好为其建立簇聚索引,一旦查询范围内的第一个值被发现,则随后的值在物理上
一定相近。簇聚索引对单值查询并没有什么优点。
创建索引的基本语法:
Create [unique][clustered|nonclustered]index index_name
On [[database.]owner.]table_name
(column_name[,column_name]?)
[on segment_name][with consumers=x]
上述语法包含了这样的暗示:将簇聚索引和它的基表分离在不同的段上;段是逻辑概念,但段可以位于不
同的物理设备上,也即将簇聚索引和基表物理上分开。 这是不允许的,我们将在后面讨论设备、数据库、
段、表分区时作详细讨论。
3.键(key)
理解键是理解关联的关键。
键和索引往往是一回事。键的意义在概念上,键用于参照完整性约束。
主键是表的单值列的集合,主键通过在放置它们的表上创建一个单值索引来实现其单值性的。实际上主键
是作为标志表的标志符而存在的,一旦主键确定,则由该主键就确定了的表也就确定了。
外键是和其它表中的主键相关的列,主键和外键的关系确定了外键的值域,该值域即为相应主键的取值范
围。这样就从理论上强制实现了表与表之间的参照完整性。
前面创建表的语法里包含了创建键的成分。也可以通过其它途径创建主键和外键。
◇Unique 约束和 Primary key 约束的区别
Unique 约束和 Primary key 约束用来保证同一表中指定的列上没有重复值,这两个约束都产生唯一索引确
保数据一致性,默认情况下,Unique 约束产生唯一的非聚集索引,Primary key 约束产生唯一的聚集索引。
Primary key 约束比 Unique 约束严格:Primary key 列不允许有空值,Unique 列允许有空值。
4.视图
视图是查看多表中数据的方法,视图从基表派生,它并非物理存在,而是逻辑表;视图也系统提供管理表
的一种安全机制。视图使得用户集中精力在感兴趣的数据集上。
创建视图的语法:
create view [[database.]owner.]view_name
[(column_name[,column_name]?)]
as select [distinct] select_statement
[with check option]
有 distinct 关键字的视图不能更新。当视图涉及关联时,定义视图要小心,这时是对多表操作,完整性显
得很重要。
五、数据操纵语言
1.Select 语句
基本语法:
SELECT[all|distinct]字段列表
[into 表名]
[from 表名]
[where 条件表达式]
[group by [all]字段列表]
[having 筛选表达式]
[order by 字段列表[asc|desc]]
[compute 聚集函数列表[by 字段列表]]
注意:Select 语句中的子句必须按照上述顺序使用。也就是说,若该语句包括一个 group by 子句和一个
order by 子句 where,group by 子句必须放在 order by 子句之前。
Having 子句类似于 where 子句,不同之处有两点:
(1)Having 子句必须结合 group by 子句使用;
(2)where 子句不能用聚集函数,而 Having 子句可以。
第七讲 数据库编程基础
二、流程控制语言
1.变量声明与赋值
全局变量由系统预定义,以符号@@打头。
局部变量声明使用 Declare 语句,这个变量必须以符号@开头,后跟一个标识符。
Declare @变量名 数据类型[,@变量名 数据类型,??]
变量赋值使用 Select 语句,未赋值的变量其值为 Null。
举例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL 语句块
Begin
Statement Block/*多个顺序执行的 SQL 语句*/
End
21
6.系统函数
db_name([数据库 ID])
host_name()
isnull(表达式 1,表达式 2)
??
七、数据控制语言
用来控制数据的安全性,如权限控制语句 GRANT 和 REVOKE 等。
第七讲 数据库编程基础
一、批处理
SQL Server 可以处理作为一批而提交的多个 SQL 语句,既可以是交互式的,也可以是一个文件。批处理 SQL
语句由批结束标志终止,该标志指示 SQL Server 从前面开始执行该批处理语句,对于独立的 SQL 实用程序
isql 而言,其批结束标志为单独占一行的“go”。
举例:选择表 title 及表 authors 的行数
select count(*) from titles
select count(*) from authors
go
二、流程控制语言
1.变量声明与赋值
全局变量由系统预定义,以符号@@打头。
局部变量声明使用 Declare 语句,这个变量必须以符号@开头,后跟一个标识符。
Declare @变量名 数据类型[,@变量名 数据类型,??]
变量赋值使用 Select 语句,未赋值的变量其值为 Null。
举例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL 语句块
Begin
Statement Block/*多个顺序执行的 SQL 语句*/
End
3.条件语句
If 条件表达式
语句(块)
Else
语句(块)
举例:
if(select max(id) from sysobjects)<50
print ‘数据库里没有用户创建的对象‘
else
select name,type,id from sysobjects where id>50
4.循环语句
While 条件表达式
语句(块)
●两个特殊的循环控制语句:
Continue 执行下一次循环
Break 退出当前循环
举例:
While(select avg(price) from titles)>$20
Begin
Update titles set price=price/2
If(select avg(price) from titles)<$40
Break
Else
Continue
End
5.其它控制语句
◇Return 语句——无条件结束当前过程,并可返回给调用者的一个状态值:Return[整数表达式]
◇Print 语句
◇RaiseError 语句
◇Waitfor 语句
三、存储过程
存储过程是存储在服务器端的一类数据库对象,它实质上是一段用 SQL 语言编写的程序,它在服务器端
预先经过编译,并确定出执行计划,因此与同样功能的批处理语句相比,它的执行速度较快。
基本语法:
Create Procedure[owner.]过程名
[@参数名 数据类型[=默认值][Output]]
[,@参数名 数据类型[=默认值][Output]]
[??]
AS
Begin
SQL 语句(块)
End
24
报告某数据库的用户、分组或别名等。这类过程有 sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser
等。
b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本 SQL Server 的远程服务器;增加能从远
程服务器上存取本 SQL Server 的用户名。这类过程有:sp_addremotelogin,sp_addserver,sp_dropserver
等。
c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或报告主码、外码
和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有:sp_bindfault, sp_bindrule, sp_help,
sp_helpdb, sp_foreignkey, sp_helptext 等。
d. 系统管理。这类存储过程用于:增加、删除或报告数据库及转储设备;报告锁;设置的数据库选择及用
户正进行的进程;修改及报告配置变量;监控 SQL Server 的活动。这类过程有:sp_addumpdevice,
sp_dropdevice, sp_helpdevice 等。
四、触发器
触发器是一种用来保障参照完整性的特殊的存储过程,它维护不同表中数据间关系的有关规则。当对指定
的表进行某种特定操作(如:Insert,Delete 或 Update)时,触发器产生作用。触发器可以调用存储过程。
创建触发器的语法:
Create Trigger[owner.]触发器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL 语句(块)
End
定义一个好的触发器对简化数据的管理,保证数据库的安全都有重要的影响。触发器是针对表一级的,这
就意味着,只有表的所有者有权创建表的触发器。
举例:
插入一个新行,必须保证外键与主键相匹配,触发器应该首先检查被插入行与主键表的连接。
以下的触发器对 inserted 表和 titles 表的 title_id 进行比较,这里假设正在给外键输入数据,没有插入
空值,若连接失败,事务被回退。insert,update,delete
Create trigger forinsertrigl
On salesdetail
For insert
As
If(select count(*)
From title,inserted
Where titles.title_id=inserted.title_id)!=@@rowcount
Begin
Rollback transaction
Print “No,some title_id does not exist in titles.”
End
Else
Print “Added! All the title_id is exist in titles.”
在本例中,@@rowcount 代表添加到 salesdetail 表的行数,这也是添加到 inserted 表中的行数。通过连
接表 titles 和表 inserted 来检测所有添加到 salesdetail 的 title_id 是否在 titles 中存在。若所连接
25
的行数(count(*))与@@rowcount 不同,由有一个或多个插入不正确,整个事务被取消。
触发器的限制:
●一个表最多只能有三个触发器,insert,update,delete
●每个触发器只能用于一个表
●不能对视图、临时表创建触发器
●Truncate table 能删除表,但不能触发触发器
●不能将触发器用于系统表
合理地使用触发器对性能的影响是正面的。在设计和使用触发器时,经常地用 sp_depends 命令了解对象所
关联的触发器是有好处的,该命令能列出触发器影响的所有对象、表和视等。
在定义几类数据库对象的时候,对存储过程、索引和触发器要给予特别的注意,尤其存储过程,它设计的
好坏对数据库性能的影响很大。
说明:Sybase 触发器使用的两个测试表:Deleted 表和 Inserted 表,它们都是临时表,其结构与触发器的
基表结构相同,用来存放与修改相关的数据行。
五、游标
1.游标的概念
游标是指向查询结果集的一个指针,它是一个通过定义语句与一条 Select 语句相关联的一组 SQL 语句。游
标包含两方面的内容:
●游标结果集:执行其中的 Select 语句所得到的结果集;
●游标位置:一个指向游标结果集内的某一条记录的指针
利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,
其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。
2.使用游标
一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概
念。
无论使用哪一种游标,都需要经过如下几个步骤:
●定义游标
●打开游标
●从游标中操作数据
●关闭游标
下面讲述的是后端(服务器)游标。
(1)定义游标
在使用游标之前必须声明它。声明指定定义游标结果集的查询。通过使用 for update 或 for read only 关
键词将游标显式定义成可更新的或只读的。
Declare cursor 语法为:
For select_statement
[for{read only|update[of colum_name_list]}]
举例:
declare pubs_crsr cursor
for select pub_name,city,state
from publishers
for update of city,state
(2)打开游标
open 的语法为:
open 游标名
在声明游标后,必须打开它以便用 fetch,update,delete 读取、修改、删除行。在打开一个游标后,它将
被放在游标结果集的首行前,必须用 fetch 语句访问该首行。
(3)从游标中读取数据
在声明并打开一个游标后,可用 fetch 命令从游标结果集中获取数据行。
Fetch 的语法为:
Fetch 游标名[into 变量列表]
举例:fetch pub_crsr into @name,@city,@state
SQL Server 在每次读取后返回一个状态值。可用@@sqlstatus 访问该值,下表给出了可能的@@sqlstatus
值及其意义。
值意 义
0Fetch 语句成功
1Fetch 语句导致一错误
2 结果集没有更多的数据,当前位置位于结果集最后一行,而客户对该游标仍发出 Fetch 语句时。
若游标是可更新的,可用 update 和 delete 语句来更新和删除行。
删除游标当前行的语法为:
delete[from]表名
where current of 游标名
举例:delete from authors where current of authors_crsr
当游标删除一行后,SQL Server 将游标置于被删除行的前一行上。
更新游标当前行的语法为:
update 表名
set column_name1={expression1|NULL|(select_statement)}
[,column_name2={expression2|NULL|(select_statement)}
[??]
where current of 游标名
举例:
update publishers
set city=”Pasadena”,state=”CA”
where current of pubs_crsr
(4)关闭游标
当结束一个游标结果集时,可用 close 关闭。该语法为:
close 游标名
关闭游标并不改变其定义,可用 open 再次打开。若想放弃游标,必须使用 deallocate 释放它,deallocater
的语法为:
deallocater cursor 游标名
deallocater 语句通知 SQL Server 释放 Declare 语句使用的共享内存,不再允许另一进程在其上执行 Open
操作。
2012.7.5 Thursday
第一讲 Sybase基础知识
一、Sybase SQL Server是一个多库结构的RDBMS,体系结构大致如下:
1.系统数据库
Sybase 在安装时,自动创建了四个系统数据库:
master、model、tempdb、sybsystemprocs
(1)master 数据库
它是管理和控制用户数据库以及维护服务器正常运行的核心数据库,它保存了大量的系统信息,如服
务器配置、用户、设备等。
在 master 数据库中不允许普通用户在其中创建数据库对象,否则会使得 master 数据库的事务日志很
快变满。如果事务日志用尽,就无法使用 dump transaction 命令释放 master 数据库中的空间。
(2)model 数据库
它是为创建用户数据库而提供的模板。每当创建新的数据库时,SQL Server 自动建立 model 数据库的
一份拷贝,并把它扩充到用户所要求的大小,以此作为新用户数据库。
Model 数据库中包含每个用户数据库所要求的系统表。Model 数据库可以被修改以便定制新创建的。
(3)tempdb 数据库
它是个临时数据库,为服务器运行与处理提供一个共享的存储区域,如 group by 和 order by 的中间
结果就存放在这里。Tempdb 的空间为服务器中所有数据库的所有用户所共享。
每次重启 SQL Server,服务器的一个自动进程都拷贝 model 数据库到 tempdb 数据库,并清除 tempdb
中原来的内容。因此 tempdb 中的用户表都是临时的。临时表分为两类:可共享的和不可共享的。不可共享
的临时表在由 create table 中将符号#置于表名之前创立;可共享的临时表通过 create table 中指定表名
前缀 tempdb..而创立。不可共享的临时表 SQL Server 自动为其添加数字后缀名,且它只存在于当前会话
中。
(4)sybsystemprocs 数据库
它是专门用来保存系统命令(存储过程)的数据库,如 sp_help、sp_configure、sp_helpdevice 等。
当任一数据库用户运行以 sp_开头的存储过程时,SQL Server 按照以下顺序查找:当前数据库、
sybsystemprocs 数据库、master 数据库。
2.用户数据库
用户数据库是我们使用 Sybase 服务器的真正目的。要管理用户数据,必须在 Sybase 中创建自己的数
据库,它是指用 create database 命令创建的数据库。不能存取 master 数据库的用户是无权创建新的数据
库的。
数据库中的主要内容——数据库对象:
表、视图、临时表
索引、主键、外键
缺省值、规则
存储过程、触发器等
二、Sybase 的安装与配置
1. 安装建立 SQL Server 以后,要建立放置数据库、日志和索引的逻辑磁盘设备。数据库、日志和索引的
配置应注意以下原则;
a.不要把任何用户对象安装在 master 数据库中。
b.日志应该保存在与数据库分离的磁盘上。
c.可以通过跨越多个设备分配工作优化 I/O 性能。
2.创建用户数据库
以下通过一个建立数据库的脚本说明建立数据库的过程:
//创建数据库设备,设备大小以页(2K)为单位
disk init name=”test_dbdev”, physname=”c:\test\test_dbdev.dat”, vdevno=10, size=10240
go
disk init name=”test_logdev”, phyname=”c:\test\test_logdev.dat”, vdevno=11, size=5120
go
//创建数据库 TEST_DB,其大小为 20M,日志大小为 10M
create database TEST_DB on test_dbdev=20 log on test_logdev=10
go
//打开数据库
use TEST_DB
go
3.SQL Server 的配置参数
服务器配置是系统管理员的职责,正确的配置对系统性能有重大的影响。有两个系统表存储配置信息:
sysconfigures 和 syscurconfigs;sysconfigures 是永久性的,一旦系统运行,sysconfigures 的信息就
拷贝到 syscurconfigs 中。显示配置和改变配置使用系统过程 sp_configure。
有两种配置值:动态的和静态的,动态值一旦改变立即生效,静态值要在系统重启动后才起作用。
第二讲 数据库设备与存储空间管理
1. 磁盘读写速度是 I/O 操作的瓶颈,正确地把数据库对象放置到物理设备上有利于改进性能;
把日志和数据库对象置于单独的设备上可以提高系统性能;
把表放在一个硬盘上而把索引放在另一个硬盘上,由于把工作分置于两个硬盘驱动器上,所以可以确
保物理读写速度加快;
磁盘镜像会降低磁盘写的速度。
2.设备
Sybase 将数据库中的所有数据存放在设备上。
设备是 Sybase 预先配置的专门存放数据库的一块连续的磁盘空间,并且它被映射到一操作系统文件或
一原始磁盘分区上。它有两个对应的名称:逻辑名和物理名。NT 仅支持设备映射到文件。
设备与数据库之间的关系:多对多关系。一个数据库可以被创建或扩充到多个设备上,一个设备也可
以被用来存放多个数据库。不同的设备操作系统可以对其并行地读写,因此我们可以人为地将一个数据库
放置到多个数据库设备上。
设备的分类:Database Device 和 Dump Device。数据库设备存放数据库和事务日志,转储设备用来存
放数据库或日志的备份。
1)设备的创建
DISK INIT Name=’device_name’, Physname=’physical_name’, Vdevno=virtual_device_number
Size=number_of_pages
[......]
举例说明:
DISK INIT Name=’My_Device’, Physname=’D:\database\My_device.dat’, Vdevno=3 Size=5000
注释:逻辑名、物理名、设备虚拟号、设备大小
创建转储设备:
sp_addumpdevice{‘disk’|’tape’} Logical_Name, Physical_Name, TapeSize
2)默认设备
在没有指定设备的情况下,用户创建的任何数据对象自动存放在默认设备上。
初始安装后,系统的主设备 master 被预指定为默认设备,因此要尽快创建自己的默认设备。确保以下
设备不是默认设备:系统主设备、指定仅被日志使用的设备。
Sp_diskdefault 设备名[,DefaultOn|DefaultOff]
3)磁盘镜像
磁盘镜像是出于数据库安全性的考虑,当介质失败时,磁盘镜像能提供不间断恢复。磁盘镜像是磁盘
上的数据的绝对拷贝。如果某一硬盘事故发生,则该被损坏的拷贝就自动变成离线状态,因而所有的读写
都被引向未被损坏的拷贝。
Sybase 的磁盘镜像是在设备级上进行的,因此磁盘镜像实质上是设备镜像。当对某一设备进行镜像操
作时,Sybase 自动创建一个附加设备,由镜像处理程序将原设备上的所有数据拷贝到镜像设备上。
镜像命令语法:
Disk Mirror Name=’device_name’, Mirror=’physical_name’ [,writes=serial|noserial]
// ’device_name’为被镜像的设备
4) sp_dropdevice logical_name[,delfile]
含有数据库的设备不允许删除。
5)创建与使用段
段(Segment)是数据库设备上磁盘空间的逻辑组合,它可以看作是指向一个或多个数据库设备的标签。
利用段可以控制数据库对象的存放位置,可以将数据库对象分类存放到不同的段上。
设备与段之间的关系:多对多关系。一个设备上可以创建多个段,一个段也可以覆盖多个设备。
使用段的优点
a. 控制空间的使用:放在一个段上的数据库对象不会在段外增长;
b. 提高性能:处于不同磁盘设备上的段可以并行地读写;
c. 处理大表:利用段,可以将一个大表分段放在独立的物理设备上,如将一个表的文本或图象数据存
储另外的一个段上。
创建段
sp_addsegment 段名,数据库名,设备名
说明:在指定设备上为某个数据库创建一个段。
●两个数据库放在同一设备的不同段上,它们不会相互影响;
●当数据库增加空间时,增加的空间会自动分配到它的每一个段上;
3.更改数据库
1)改变数据库属主
通常用户数据库有系统管理员创建,它的默认属主是 dbo。系统过程 sp_changeddbowner 可改变数据库的
属主关系,它必须由数据库管理员在要改变属主关系的数据库中执行。语法如下:
sp_changeddbowner login_name[,True]
其中参数 True 用于将权限一半传递给新属主。
2)扩展数据库
a.)扩展数据库空间
alter database 数据库名
on 设备名=扩展空间 //单位:M
如果扩展的设备对于数据库是新的,System 和 Default 段会自动扩展到该设备上。
b.)8
第三讲 数据库与事务日志
一、创建用户数据库
Create Database 数据库名
On 设备_1=Size_1,//单位:M
设备_2=Size_2,
??
log on 日志设备=Log_Size
[With Override]//在同一设备上创建数据库和事务日志时使用该选项
[For Load] //禁止用户访问直到数据库的装入或恢复操作完成为止
举例:
Create Database test_db
On data_dev=100,//单位:M
Index_dev=50
Log on log_dev=30
说明:
(1)将日志放在单独的设备上,有利于数据库性能的提高;
(2)图示:
Data_dev Index_dev log_dev
(3)如果将数据库和日志放在同一设备上,就不能实现增量备份;
(4)通常将 System 和 Default 段缩减范围到一个设备上,如删除设备 Index_dev 上的 System 段和 Default
段,创建新的段,用来存放专门的数据库对象。
二、更改数据库
1.改变数据库属主
通常用户数据库有系统管理员创建,它的默认属主是 dbo。系统过程 sp_changeddbowner 可改变数据库的
属主关系,它必须由数据库管理员在要改变属主关系的数据库中执行。语法如下:
sp_changeddbowner login_name[,True]
其中参数 True 用于将权限一半传递给新属主。
2.扩展数据库
(1)扩展数据库空间
alter database 数据库名
on 设备名=扩展空间 //单位:M
如果扩展的设备对于数据库是新的,System 和 Default 段会自动扩展到该设备上。
(2)扩展事务日志到新的设备上
sp_logdevice 数据库名,设备名
举例:将数据库另外扩充 5M,用于存储日志
alter database my_db
on my_dev=5
go
sp_logdevice my_db,my_dev
go
(3)删除数据库
drop database 数据库名
删除设备前必须删除其上的所有数据库,删除设备的命令是:sp_dropdevice
三、事务日志
9
3.删除数据库
drop database 数据库名
删除设备前必须删除其上的所有数据库,删除设备的命令是:sp_dropdevice
三、事务日志
日志文件是用来记录数据库每一次修改活动的文件。SQL Server 中的每一个数据库都有自己的日志文件,
即系统表 syslogs,也称为事务日志。事务日志是撤消事务和出现故障时恢复事务的依据。
在某些情况下,事务日志比数据本身更为重要。
什么是事务?
数据库的修改是以事务为单位进行的。一个事务就是一个操作序列,这些操作要么全做,要么全不做,它
是一个不可分割的工作单位。任何一个事务具备如下特征。
(1)执行的原子性(Atomic);
(2)保持数据的一致性(Consistency);
(3)彼此的隔离性(Isolation);
(4)作用的持久性(Durability)。
上述事务的四个特征被称为事务的 ACID 准则。
事务在运行过程中,SQL Server 把事务开始、事务结束以及对数据库的插入、删除和更新等每一个操作作
为一个日志记录存放到事务日志中。事务中的更新操作首先在数据库缓冲区(内存)中进行,缓冲区分别
有用来记录操作活动的数据页(data page)和日志页(log page)。当运行到 commit tran 时,日志页首
先从缓冲区写到磁盘上,而后数据页从缓冲区写到磁盘上,即遵循“先与日志(write_ahead log)”的原
则,这样保证出现故障的情况下,通过日志能够得到最大限度的恢复。恢复必须撤消发生故障时还未提交
的事务,已完成的事务若仍有未从缓冲区写到数据库设备中,还要重新运行该事务。
附:创建与装载数据库实例
use master
declare @vdevno int
select @vdevno=max(convert(tinyint,substring(convert(binary(4),d.low),v.low,1)))+1
from master.dbo.sysdevices d,master.dbo.spt_values v
where v.type=’E’and v.number=3
declare @v_str char(2)
select @v_str=convert(char(2),@vdevno)
print @v_str
disk init
name=”YDDATA”,
physname=”D:\Syb_Data\YDDATA.dat”,
vdevno=@vdevno+1,
size=153600
disk init
name=”YDINDEX”,
physname=”D:\Syb_Data\YDINDEX.dat”,
vdevno=@vdevno+2,
size=102400
disk init
name=”YDLOG”, physname=”D:\Syb_Data\YDLOG.dat”,
vdevno=@vdevno+3,
size=76800
create database YDMISDB
on YDDATA=300,YDINDEX=200
log on YDLOG=150
use YDMISDB
execute sp_addsegment indexdev,YTMISDB,YTINDEX
execute sp_dropsegment “default”,YTMISDB,YTINDEX
execute sp_dropsegment system,YTMISDB,YTINDEX
use master
load database YDMISDB from ‘d:\yd_dump\ydmis_backup.dmp’
online database YDMISDB
2012.7.7
第六讲 数据库与T-SQL 语言
一、关系模型的基本概念
关系(Relation)是一个由行和列组成的二维表格,表中的每一行是一条记录(Record),每一列是记录
的一个字段(Field)。表中的每一条记录必须是互斥的,字段的值必须具有原子性。
二、SQL 语言概述
SQL(结构化查询语言)是关系数据库语言的一种国际标准,它是一种非过程化的语言。通过编写 SQL,
我们可以实现对关系数据库的全部操作。
●数据定义语言(DDL)——建立和管理数据库对象
●数据操纵语言(DML)——用来查询与更新数据
●数据控制语言(DCL)——控制数据的安全性
T-SQL 语言是 Sybase 对 SQL92 标准的一种扩展,主要在它的基础上增加了三个方面的功能:自己的数据类
型/特有的 SQL 函数/流程控制功能
T-SQL 中的标识符使用说明:
(1)标识符由 1-30 个字符或数字构成,但首字符必须为字母。临时表的表名以#开头,长度不能超过 13
个字符。
(2)数据库对象的标识方法举例
database.owner.tablename.columnname
执行远程存储过程:
EXEC server.db.owner.proc_name
当执行语句在批处理的句首时,EXEC 可以省略。
三、Sybase 的数据类型
在创建表或声明局部变量时,必须使用 Sybase 系统预定义类型。
1.字符类型
Char(n) VarChar(n)
2.数值类型
整数类型——Integer SmallInt TinyInt
浮点类型——Real Float Number[P,S] Decimal[P,S]
货币类型——Money SmallMoney
3.日期/时间类型
Datetime SmallDatetime
两者时间部分的精度不同,前者精确到分,后者精确到 1/30 秒。
4.文本和图像类型
Text Image
5.二进制数据类型
Binary(n) VarBinary(n)
四、数据定义语言
用来定义数据库对象。数据库对象是 Sybase 用来存储数据的逻辑实体,主要有:
表(Table)、视图(View)、临时表(Temp Table);
主键(Primary Key)、外键(Foreign Key)、索引(Index)、规则(Rule)、默认值(Default);
存储过程(Stored Procedure)、触发器(Trigger)
●基本语法
下面给出创建主要数据库对象的语法:
1.表
创建表的基本语法是:
Create table[database.[owner].]table_name
(column_name datatype [default {constant_expression|user|null}]
{[{identity|null|not null}]|[[constraint constraint_name]
16
{{unique|primary key}[clustered|nonclustered]
[with{fillfactor|max_rows_per_page}=x]
[on segment_name]
|references[[database.]owner.]ref_table
[(ref_column)]
|check(search_condition)}]}?
在建立大型的数据库时,可以考虑将创建表乃至其它数据库对象的过程写到一个文本里,当数据库系统出
现问题时,在最坏的情况下,重建过程可以得到简化,也能比较好的对数据库的建设过程进行监视。
创建表的过程完成下列活动:
·定义表的每一列;
·定义列名和列的数据类型并指定列是否处理空值;
·指定列是否具有 IDENTITY 属性;
·定义列级的完整性约束和表级的完整性约束
上述过程可见,创建表的过程可以设定填充因子,将列置于段上,设计索引,外键等等。
2.索引
索引对查询性能的影响很大,要引起重视。
索引加速了数据检索,Adaptive Server 有三类索引:
·复合索引——索引包含多列;当两列或多列由于它们的逻辑关系而作为整体被查询时可建立这种索引;
·唯一索引——索引列的值不允许重复;
·簇聚索引和非簇聚索引——簇聚索引强迫 Server 不断地对表中数据排序或重排序以保证表中数据的物
理顺序和逻辑顺序的一致性,簇聚索引对范围查询性能影响极大;非簇索引没有这样的要求,非簇聚索引
对修改操作有利。
何时建索引?
·如果手动插入 identity 列,则创建唯一索引以保证不插入已经存在的值;
·经常被排序访问的列,即被列在 order by 子句中的列,最好对其建立索引以便 Adaptive Server 能充分
利用索引顺序的优点;
·如果列经常用手连接,则可对列建立索引,这样系统能更快地执行连接;
·包含主键的列一般都有簇聚索引,尤其是当它频繁地和其它表的列相关联;
·经常被范围查询的列最好为其建立簇聚索引,一旦查询范围内的第一个值被发现,则随后的值在物理上
一定相近。簇聚索引对单值查询并没有什么优点。
创建索引的基本语法:
Create [unique][clustered|nonclustered]index index_name
On [[database.]owner.]table_name
(column_name[,column_name]?)
[on segment_name][with consumers=x]
上述语法包含了这样的暗示:将簇聚索引和它的基表分离在不同的段上;段是逻辑概念,但段可以位于不
同的物理设备上,也即将簇聚索引和基表物理上分开。 这是不允许的,我们将在后面讨论设备、数据库、
段、表分区时作详细讨论。
3.键(key)
理解键是理解关联的关键。
键和索引往往是一回事。键的意义在概念上,键用于参照完整性约束。
主键是表的单值列的集合,主键通过在放置它们的表上创建一个单值索引来实现其单值性的。实际上主键
是作为标志表的标志符而存在的,一旦主键确定,则由该主键就确定了的表也就确定了。
外键是和其它表中的主键相关的列,主键和外键的关系确定了外键的值域,该值域即为相应主键的取值范
围。这样就从理论上强制实现了表与表之间的参照完整性。
前面创建表的语法里包含了创建键的成分。也可以通过其它途径创建主键和外键。
◇Unique 约束和 Primary key 约束的区别
Unique 约束和 Primary key 约束用来保证同一表中指定的列上没有重复值,这两个约束都产生唯一索引确
保数据一致性,默认情况下,Unique 约束产生唯一的非聚集索引,Primary key 约束产生唯一的聚集索引。
Primary key 约束比 Unique 约束严格:Primary key 列不允许有空值,Unique 列允许有空值。
4.视图
视图是查看多表中数据的方法,视图从基表派生,它并非物理存在,而是逻辑表;视图也系统提供管理表
的一种安全机制。视图使得用户集中精力在感兴趣的数据集上。
创建视图的语法:
create view [[database.]owner.]view_name
[(column_name[,column_name]?)]
as select [distinct] select_statement
[with check option]
有 distinct 关键字的视图不能更新。当视图涉及关联时,定义视图要小心,这时是对多表操作,完整性显
得很重要。
五、数据操纵语言
1.Select 语句
基本语法:
SELECT[all|distinct]字段列表
[into 表名]
[from 表名]
[where 条件表达式]
[group by [all]字段列表]
[having 筛选表达式]
[order by 字段列表[asc|desc]]
[compute 聚集函数列表[by 字段列表]]
注意:Select 语句中的子句必须按照上述顺序使用。也就是说,若该语句包括一个 group by 子句和一个
order by 子句 where,group by 子句必须放在 order by 子句之前。
Having 子句类似于 where 子句,不同之处有两点:
(1)Having 子句必须结合 group by 子句使用;
(2)where 子句不能用聚集函数,而 Having 子句可以。
第七讲 数据库编程基础
二、流程控制语言
1.变量声明与赋值
全局变量由系统预定义,以符号@@打头。
局部变量声明使用 Declare 语句,这个变量必须以符号@开头,后跟一个标识符。
Declare @变量名 数据类型[,@变量名 数据类型,??]
变量赋值使用 Select 语句,未赋值的变量其值为 Null。
举例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL 语句块
Begin
Statement Block/*多个顺序执行的 SQL 语句*/
End
21
6.系统函数
db_name([数据库 ID])
host_name()
isnull(表达式 1,表达式 2)
??
七、数据控制语言
用来控制数据的安全性,如权限控制语句 GRANT 和 REVOKE 等。
第七讲 数据库编程基础
一、批处理
SQL Server 可以处理作为一批而提交的多个 SQL 语句,既可以是交互式的,也可以是一个文件。批处理 SQL
语句由批结束标志终止,该标志指示 SQL Server 从前面开始执行该批处理语句,对于独立的 SQL 实用程序
isql 而言,其批结束标志为单独占一行的“go”。
举例:选择表 title 及表 authors 的行数
select count(*) from titles
select count(*) from authors
go
二、流程控制语言
1.变量声明与赋值
全局变量由系统预定义,以符号@@打头。
局部变量声明使用 Declare 语句,这个变量必须以符号@开头,后跟一个标识符。
Declare @变量名 数据类型[,@变量名 数据类型,??]
变量赋值使用 Select 语句,未赋值的变量其值为 Null。
举例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL 语句块
Begin
Statement Block/*多个顺序执行的 SQL 语句*/
End
3.条件语句
If 条件表达式
语句(块)
Else
语句(块)
举例:
if(select max(id) from sysobjects)<50
print ‘数据库里没有用户创建的对象‘
else
select name,type,id from sysobjects where id>50
4.循环语句
While 条件表达式
语句(块)
●两个特殊的循环控制语句:
Continue 执行下一次循环
Break 退出当前循环
举例:
While(select avg(price) from titles)>$20
Begin
Update titles set price=price/2
If(select avg(price) from titles)<$40
Break
Else
Continue
End
5.其它控制语句
◇Return 语句——无条件结束当前过程,并可返回给调用者的一个状态值:Return[整数表达式]
◇Print 语句
◇RaiseError 语句
◇Waitfor 语句
三、存储过程
存储过程是存储在服务器端的一类数据库对象,它实质上是一段用 SQL 语言编写的程序,它在服务器端
预先经过编译,并确定出执行计划,因此与同样功能的批处理语句相比,它的执行速度较快。
基本语法:
Create Procedure[owner.]过程名
[@参数名 数据类型[=默认值][Output]]
[,@参数名 数据类型[=默认值][Output]]
[??]
AS
Begin
SQL 语句(块)
End
24
报告某数据库的用户、分组或别名等。这类过程有 sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser
等。
b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本 SQL Server 的远程服务器;增加能从远
程服务器上存取本 SQL Server 的用户名。这类过程有:sp_addremotelogin,sp_addserver,sp_dropserver
等。
c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或报告主码、外码
和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有:sp_bindfault, sp_bindrule, sp_help,
sp_helpdb, sp_foreignkey, sp_helptext 等。
d. 系统管理。这类存储过程用于:增加、删除或报告数据库及转储设备;报告锁;设置的数据库选择及用
户正进行的进程;修改及报告配置变量;监控 SQL Server 的活动。这类过程有:sp_addumpdevice,
sp_dropdevice, sp_helpdevice 等。
四、触发器
触发器是一种用来保障参照完整性的特殊的存储过程,它维护不同表中数据间关系的有关规则。当对指定
的表进行某种特定操作(如:Insert,Delete 或 Update)时,触发器产生作用。触发器可以调用存储过程。
创建触发器的语法:
Create Trigger[owner.]触发器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL 语句(块)
End
定义一个好的触发器对简化数据的管理,保证数据库的安全都有重要的影响。触发器是针对表一级的,这
就意味着,只有表的所有者有权创建表的触发器。
举例:
插入一个新行,必须保证外键与主键相匹配,触发器应该首先检查被插入行与主键表的连接。
以下的触发器对 inserted 表和 titles 表的 title_id 进行比较,这里假设正在给外键输入数据,没有插入
空值,若连接失败,事务被回退。insert,update,delete
Create trigger forinsertrigl
On salesdetail
For insert
As
If(select count(*)
From title,inserted
Where titles.title_id=inserted.title_id)!=@@rowcount
Begin
Rollback transaction
Print “No,some title_id does not exist in titles.”
End
Else
Print “Added! All the title_id is exist in titles.”
在本例中,@@rowcount 代表添加到 salesdetail 表的行数,这也是添加到 inserted 表中的行数。通过连
接表 titles 和表 inserted 来检测所有添加到 salesdetail 的 title_id 是否在 titles 中存在。若所连接
25
的行数(count(*))与@@rowcount 不同,由有一个或多个插入不正确,整个事务被取消。
触发器的限制:
●一个表最多只能有三个触发器,insert,update,delete
●每个触发器只能用于一个表
●不能对视图、临时表创建触发器
●Truncate table 能删除表,但不能触发触发器
●不能将触发器用于系统表
合理地使用触发器对性能的影响是正面的。在设计和使用触发器时,经常地用 sp_depends 命令了解对象所
关联的触发器是有好处的,该命令能列出触发器影响的所有对象、表和视等。
在定义几类数据库对象的时候,对存储过程、索引和触发器要给予特别的注意,尤其存储过程,它设计的
好坏对数据库性能的影响很大。
说明:Sybase 触发器使用的两个测试表:Deleted 表和 Inserted 表,它们都是临时表,其结构与触发器的
基表结构相同,用来存放与修改相关的数据行。
五、游标
1.游标的概念
游标是指向查询结果集的一个指针,它是一个通过定义语句与一条 Select 语句相关联的一组 SQL 语句。游
标包含两方面的内容:
●游标结果集:执行其中的 Select 语句所得到的结果集;
●游标位置:一个指向游标结果集内的某一条记录的指针
利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,
其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。
2.使用游标
一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概
念。
无论使用哪一种游标,都需要经过如下几个步骤:
●定义游标
●打开游标
●从游标中操作数据
●关闭游标
下面讲述的是后端(服务器)游标。
(1)定义游标
在使用游标之前必须声明它。声明指定定义游标结果集的查询。通过使用 for update 或 for read only 关
键词将游标显式定义成可更新的或只读的。
Declare cursor 语法为:
For select_statement
[for{read only|update[of colum_name_list]}]
举例:
declare pubs_crsr cursor
for select pub_name,city,state
from publishers
for update of city,state
(2)打开游标
open 的语法为:
open 游标名
在声明游标后,必须打开它以便用 fetch,update,delete 读取、修改、删除行。在打开一个游标后,它将
被放在游标结果集的首行前,必须用 fetch 语句访问该首行。
(3)从游标中读取数据
在声明并打开一个游标后,可用 fetch 命令从游标结果集中获取数据行。
Fetch 的语法为:
Fetch 游标名[into 变量列表]
举例:fetch pub_crsr into @name,@city,@state
SQL Server 在每次读取后返回一个状态值。可用@@sqlstatus 访问该值,下表给出了可能的@@sqlstatus
值及其意义。
值意 义
0Fetch 语句成功
1Fetch 语句导致一错误
2 结果集没有更多的数据,当前位置位于结果集最后一行,而客户对该游标仍发出 Fetch 语句时。
若游标是可更新的,可用 update 和 delete 语句来更新和删除行。
删除游标当前行的语法为:
delete[from]表名
where current of 游标名
举例:delete from authors where current of authors_crsr
当游标删除一行后,SQL Server 将游标置于被删除行的前一行上。
更新游标当前行的语法为:
update 表名
set column_name1={expression1|NULL|(select_statement)}
[,column_name2={expression2|NULL|(select_statement)}
[??]
where current of 游标名
举例:
update publishers
set city=”Pasadena”,state=”CA”
where current of pubs_crsr
(4)关闭游标
当结束一个游标结果集时,可用 close 关闭。该语法为:
close 游标名
关闭游标并不改变其定义,可用 open 再次打开。若想放弃游标,必须使用 deallocate 释放它,deallocater
的语法为:
deallocater cursor 游标名
deallocater 语句通知 SQL Server 释放 Declare 语句使用的共享内存,不再允许另一进程在其上执行 Open
操作。