按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
当 CODE 为 B 时其值为 20 当 CODE 既不是 A 也不是 B 时激活一个名字叫
UnknownCode 的异常 表中的内容只有一行
409
…………………………………………………………Page 410……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第 19 天 TRANSACT…SQL 简介
目标
与 TRANSACT…SQL 是对标准 SQL 的补充一样 今天的内容是对前几天内容的补充
今天的目标是
l 知道一种对 SQL 的流行的扩展
l 知道 TRANSACT…SQL 的主要特性
l 给出一些特殊的例子让你知道如何去使用 TRANSACT…SQL
TRANSACT…SQL 概貌
在第 13 天的 高级 SQL 中我们简要地提到过静态 SQL 在第 13 天的例子中我们也
描述了如何在第三代编程语言如 C 中写内嵌的 SQL 语句的方法 由于采用这种方法时嵌
入的 SQL 语句是无法改变的所以它的灵活性就受到了限制 而如果我们采用动态的 SQL
语言编程来完成相同的工作时 就允许 SQL 代码的条件在运行时改变
在本书中我们其实已经讨论过了相关的每一个主题 几乎每一个数据库供应商都在它
的语言进行了相应的扩展 TRANSACT…SQL 是 SYBASE 和 MICROSOFT SQL SERVER 的
产品 而 ORACLE 的产品是 PL/SQL 这里的每一种语言可以完成全部的到目前为止我们
所讨论的每一件事 此外 每一种产品都对标准的 SQL 进行了相应的扩展
对 ANSI SQL 的扩展
为了演示使用这些扩展来创建实际的程序 我们使用了 SYBASE 和 MICROSOFT SQL
SERVER 的 TRANSACT…SQL 它具有大多数的在第三代编程语言中具有的结构 对于针
对 SQL…SERVER 的特性它也提供了许多便利的工具用以进行数据库编程 在其它的数据库
供应商中也提供了与之类似和更多的特性
410
…………………………………………………………Page 411……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
谁需要使用 TRANSACT…SQL
任何一个读过本书的人都会使用 TRANSACT…SQL 如果是一个程序员它偶尔会用它
来写一个查询 如果是开发员则可以用它写应用程序以创建对象如触发机制和存贮过程等
注 SYBASE 和 MICROSOFT SQL SERVER 的用户如果想开发实际上的关系数据库应用程
序就必须使用 TRANSACZT…SQL 的特性
TRANSACT…SQL 的基本组件
对 SQL 的扩展已经超过了 SQL 作为一种过程型语言的限制 例如 TRANSACT…SQL
可以让你对数据库的事务进行紧密的控制并且可以写出数据库过程程序以把编程人员从冗
重的代码中解放出来
l 在第 19 天我们主要会提到 TRANSACT…SQL 的以下主要特性
l 提供了更大范围的数据类型以优化数据的存贮
l 程序流控制命令如 IF…THEN 和 LOOP 语句
l 在 SQL 语句中使用变量
l 使用 PUTATION 生成摘要报告
l 对 SQL 语句的诊断和分析特性
l 对标准的 SQL 语句提供了许多其它的选项
数据类型
在第 9 天的 创建和操作表 中我们讨论过数据类型 当使用 SQL 创建表时 我们必
须为每一列指定数据类型
注 在不同的 SQL 解释器中数据的类型是不同的 因为每一种数据库服务存储数据的方法
都是各不相同的 举例来说 ORACLE 有它自己选定的数据类型 而 SYBASE 和
MICROSOFT SQL SERVER 则有他们自己的数据类型
SYBASE 和 MICROSOFT SQL SERVER 支持下列数据类型
411
…………………………………………………………Page 412……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
字符串
char 用以存储长度固定的字符串 例如 STATE 的缩写— — 你知道这一列只有两个字符
Varchar 用以存储长度可变的字符串 如人名 它是无法对其长度进行预先指定的 例
如 AL RAY 与 WILLIAM STEPHENSON
Text 存贮的字符长度几乎是不受限制的例如一种服务的备注和描述字段
数字类型
int 存储的整型数值范围为…2;147;483;647 到+2;147;483;647
Smallint 存储的整型数值的范围为…32;768 到 32;767
Tinyint 存储的整型数值的范围为 0 到 255
Float 可以存储有精度要求的浮点数 数值范围为+2。23E…308 和+1。79E308
Real 可以存储的数据的精度为 1。18E…38 to +3。40E38
日期类型
datetime 可以存储的数值从 Jan 1; 1753 到 Dec 31; 9999
Smalldatetime 可以存储的数值从 Jan 1; 1900 到 Jun 6; 2079
货币类型
money 的存储数值上限为+922;337;203;685;477。5808
smallmoney 的存储数值上限为+214;748。3647
在向表中输入 MONEY 数值类型时要使用美元符号 例如
insert payment_tbl (customer_id; paydate; pay_amt)
values (012845; 〃May 1; 1997〃; 2099。99)
二进制串
binary 存储着长度固定的二进制串
412
…………………………………………………………Page 413……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Varbinary 存储着长度可变的二进制串
Image 则用于存储非常大的二进串类型 例如图形和图像
位 逻辑数据类型
bit 数据类型经常用在表中对某行数据进行标识 存储在 bit 数据类型中的数据只有 0
和 1 例如 如果 1 代表符合某个条件 那么 0 就表示不符合这个条件 在下例中使用了 bit
数据类型来创建了一个包括个人测试成绩的表格
create table test_flag
( ind_id int not null;
test_results int not null;
result_flag bit not null)
分析
在这里 result_flag 列被定义为 bit 类型 因为这时只需要返回是及格还是不及格 如
果及格就为 1 否则为 0
在今天的余下的时间里 你应该注意在确定的表格中数据类型的使用以及如果写
TRANSACT…SQL 代码
注 在今天的例子中的代码既可以是大写也可以是小写 尽管在大多数的 SQL 解释器中 SQL
的关键字大小写是不敏感的 但是你还是应该检查你的解释器以进行最终的确定
使用 TRANSACT…SQL 来访问数据库
好了 说得够多了 如果你想运行今天的实例 你需要在名字为 BASEBALL 的数据
库中创建下边的表
BASEBALL 数据库
BASEBALL 数据库使用了三个表来对 BASEBALL 的信息进行追踪 这三个表分别是
BATTER PITCHERS 和 TEAM 表 在今天的剩余时间中我们将一直使用这个例子
413
…………………………………………………………Page 414……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
BASEBALL 表
NAME char(30)
TEAM int
AVERAGE float
HOMERUNS int
RBIS int
这个表可以使用下边的 TRANSACT…SQL 语句来创建
输入
1》 create database BASEBALL on default
2》 go
1》 use BASEBALL
2》 go
1》 create table BATTERS (
2》 NAME char(30);
3》 TEAM int;
4》 AVERAGE float;
5》 HOMERUNS int;
6》 RBIS int)
7》 go
分析
在第 1 行创建了数据库 你创建了名字为 BASEBALL 的数据库 然后在它的下面用
创建了一个 BASEBALL 的表
向表中输入下表的数据
注 在上例中的每个 TRANSACT…SQL 语句之后的 GO 命令并不是 TRANSACT…SQL 的组
成部分 它只是将 SQL 语句从前端送到的服务上
Name Team Average Homeruns RBIs
Billy Brewster 1 0。275 14 46
John Jackson 1 0。293 2 29
Phil Hartman 1 0。221 13 21
Jim Gehardy 2 0。316 29 84
414
…………………………………………………………Page 415……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Tom Trawick 2 0。258 3 51
Eric Redstone 2 0。305 0 28
PITCHERS 表
可以用下边的 TRANSACT…SQL 语句来创建 PITCHERS 表
INPUT:
1》 use BASEBALL
2》 go
1》 create table PITCHERS (
2》 NAME char(30);
3》 TEAM int;
4》 WON int;
5》 LOST int;
6》 ERA float)