友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第54部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
输入
1》 declare @team_id int; @player_name char(30); @max_avg float
2》 select @team_id = TEAM_ID from TEAMS where CITY = 〃Portland〃
3》 select @max_avg = max(AVERAGE) from BATTERS where TEAM = @team_id
4》 select @player_name = NAME from BATTERS where AVERAGE = @max_avg
5》 if (@max_avg 》 。300)
6》 begin
7》 print @player_name
8》 print 〃Give this guy a raise!〃
9》 end
10》 else if (@max_avg 》 。275)
11》 begin
12》 print @player_name
13》 print 〃Not bad。 Here's a bonus!〃
14》 end
15》 else
16》 begin
17》 print @player_name
18》 print 〃e back when you're hitting better!〃
19》 end
20》 go
TRANSACT…SQL 也可以让你对 IF 所使用的条件进行检查 这一功能可以对特定的条
件值进行测试 如果测试的条件为真 那么 IF 分支就会被执行 否则的话如果有 ELSE 部
分就执行 ELSE 部分 就像你在上边的例子中看到的一样
422
…………………………………………………………Page 423……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
EXIST 条件
EXIST 命令可以确保从 SELECT 语句中返回数值 如果返回了数值 那么 IF 语句就
会被执行 例 19。5 给出了示例
例 19。5
在本例就 EXIST 关键字对 IF 的条件进行了测试 该条件是由 SELECT 语句所指定的
输入
1》 if exists (select * from TEAMS where TEAM_ID 》 5)
2》 begin
3》 print 〃IT EXISTS!!〃
4》 end
5》 else
6》 begin
7》 print 〃NO ESTA AQUI!〃
8》 end
测试查询的结果
IF 语句也可以对 SELECT 语句返回的查询结果进行测试 例 19。6 给出的这样的例子
它是对平均打点最高的选手进行测试
例 19。6
本例所 19。5 的例子类似 也是使用 SELECT 语句来定义条件 但是这一回我们使用大
于号来进行检查
输入
1》 if (select max(AVG) from BATTERS) 》 。400
2》 begin
3》 print 〃UNBELIEVABLE!!〃
4》 end
5》 else
6》 print 〃TED WILLIAMS IS GETTING LONELY!〃
423
…………………………………………………………Page 424……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
7》 end
我们推荐你在你的解释器中对 IF 语句进行试验 如果对于 BASEBALL 数据库你有多
个条件要进行测试 那么你可以像在本次的应用中那样在 IF 语句中使用查询
WHILE 循环
为 TRANSACT…SQL 所运行的另一种流行的编程结构是 WHILE 循环 该命令的语法
如下
语法
WHILE logical_expression
statement(s)
例 19。7
WHILE 将一直循环到所给出的逻辑表达式值为假时为止 本例中使用了一个简单的
WHILE 循环来增加一个名字为 COUNT 的局部变量
输入
1》 declare @COUNT int
2》 select @COUNT = 1
3》 while (@COUNT 《 10)
4》 begin
5》 select @COUNT = @COUNT + 1
6》 print 〃LOOP AGAIN!〃
7》 end
8》 print 〃LOOP FINISHED!〃
注 上例实际上是一个简单的 FOR 循环 在一些其它的解释器如 ORACLE 的 PL/SQL 中
确实提供一名称为 FOR 的循环方式 你应该检查你的系统看它是否支持这种循环方式
BREAK 命令
注意 BREAK 语句应该在 IF 条件语句中出现
424
…………………………………………………………Page 425……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
1》 declare @COUNT int
2》 select @COUNT = 1
3》 while (@COUNT 《 10)
4》 begin
5》 select @COUNT = @COUNT + 1
6》 if (@COUNT = 8)
7》 begin
8》 break
9》 end
10》 else
11》 begin
12》 print 〃LOOP AGAIN!〃
13》 end
14》 end
15》 print 〃LOOP FINISHED!〃
分析
在这个例子中当 COUNT 的值为 8 时 BREAK 将导致循环的退出
COUNTINUE 命令
COUNTINUE 命令也是一个可以在 WHILE 循环中执行的特殊命令 它会令循环立即
从 BEGIN 处开始 也就是说这时 WHILE 将不再执行其模块中余下的部分而是立即从开始
执行了 也 BREAK 命令一样 COUNTINUE 也应该在 IF 条件语句中出现 如例 19。9 所
示
例 19。9
注意 这里的 COUNTINUE 也是放在 IF 之中的
输入
425
…………………………………………………………Page 426……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
1》 declare @COUNT int
2》 select @COUNT = 1
3》 while (@COUNT 《 10)
4》 begin
5》 select @COUNT = @COUNT + 1
6》 if (@COUNT = 8)
7》 begin
8》 continue
9》 end
10》 else
11》 begin
12》 print 〃LOOP AGAIN!〃
13》 end
14》 end
15》 print 〃LOOP FINISHED!〃
分析
除了用 COUNTINUE 替换了 BREAK 以外 例 19。9 与 19。8 是一样的 与当 COUNT=8
时即出循环不同 本例只是跳到的循环的起使部分继续执行
使用 WHILE 循环在表中翻阅
SQL SERVER 与与其它的数据库系统都有一个特殊类型的对象— — 游标 它可以让你
一次一行地翻阅表中的记录 参见第 13 天 但是 有一些数据库系统 包括 SQL SERVER
PER…SYSTEM 10 都不支持翻阅游标的使用 在例 19。10 中我们给出了如果系统不支持游
标是如何使用 WHILE 循环来实现简单的游标功能
例 19。10
你可以使用 WHILE 循环来一次一个地翻阅表中的记录 TRANSACT…SQL 所存储的
ROWCOUNT 数值可以告诉 SQL SERVER 一次从查询中返回一条记录 如果你使用的是其
它的数据库产品 那么你需要确认一下该产品是否有与之类似的设置 通过设置
426
…………………………………………………………Page 427……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
ROWCOUNT 的值为 1 默认值为 0 也就是不受限制 SQL SERVER 可以一次只从查询
中返回一条记录 你可以使用这条记录来进行你想要的任何操作 当将一个表的内容存入
临时表然后将其删除时 你就可以一次选择一行 在你工作结束后将它删除 当表中的所
有行都被选择出以后 你就将表中的所有行都删除了 所以我们说它只实现了非常简单的
游标功能 现在让我们来运行一个这个例子
输入
1》 set rowcount 1
2》 declare @PLAYER char(30)
3》 create table temp_BATTERS (
4》 NAME char(30);
5》 TEAM int;
6》 AVERAGE float;
7》 HOMERUNS int;
8》 RBIS int)
9》 insert temp_BATTERS
10》 select * from BATTERS
11》 while exists (select * from temp_BATTERS)
12》 begin
13》 select @PLAYER = NAME from temp_BATTERS
14》 print @PLAYER
15》 delete from temp_BATTERS where NAME = @PLAYER
16》 end
17》 print 〃LOOP IS DONE!〃
分析
注意 当你设置了 ROWCOUNT 的数值以后 你只是改变了从 SELECT 语句中返回的
行数 如果 DELETE 命令的 WHERE 子句返回了 5 条记录的话 那么 5 行都将被删除 同
时也要注意 ROWCOUNT 也可以在循环重设 因此 在这个循环中 你可以通过重新设置
ROWCOUNT 的值来查询数据库中的一些其它的信息
427
…………………………………………………………Page 428……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
TRANSACT…SQL 中的通配符
在 SQL 中使用通配符的内容是在第 3 天的 表达式 条件与操作 中介绍的 LIKE
可以让你在 SQL 语句中使用通配符 通配符的使用增加了灵活性 在 TRANSACT…SQL 中
可供使用的通配符如下
l 下划线可以代表任何单个的字符 例如 _MITH 就是查询 5 个字符并且是以 MITH
结尾的
l 百分号可以代表一个或多个字符 例如 WILL%通配符可以返回 WILLIAMS 和
WILL
l 中括号可以匹配在括号内的字符 例如 'ABC'可以查询包括 A B C 的字符串
l 如果在中括号中使用了脱字符^ 那就是说匹配所有的字符但不包括中括号中给出
的 例如 '^ABC'表示查询所有的字符 除了 A B C
使用 PUTE 来生成摘要报告
TRANSACT…SQL 也具有生成摘要报告的能力 其命令为 PUTE 它的语法与它
在 SQL*PLUS 的语法极为相似 见第 20 天的 SQL*PULS
下边的查询将会产生关于所有击球手的报告 包括每个击球手的本垒数和所有击球手
总的本垒数
输入
select name; homeruns from batters pute sum(homeruns)
分析
在上一个例子中 PUTE 独自对报告进行了估算 然而 PUTE BY 则可以对
整个报告进行分组评估 如下例所示
语法
PUTE FUNCTION(expression) 'BY expression'
where the FUNCTION might include SUM; MAX; MIN; etc。 and
EXPRESSION is usually a column name or alias。
428
…………………………………………………………Page 429……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
日期转换
SYBASE 与 MICROSOFT SQL SERVER 可以向表中插入不同格式的日期 它们也可以
用不同的格式来表达日期 在这一部分将告诉你如何使用 SQL SERVER 的 CONVERT 来
实现多种形式的日期显示方法
语法
CONVERT (datatype '(length)'; expression; format)
在 SQL SERVER 中使用 CONVERT 时有下列日期格式是可用的
Format code Format picture
100 mon dd yyyy hh:miAM/PM
101 mm/dd/yy
102 yy。mm。dd
103 dd/mm/yy
104 dd。mm。yy
105 dd…mm…yy
106 dd mon yy
107 mon dd; yy
108 hh:mi:ss
109 mon dd; yyyy hh:mi:ss:mmmAM/PM
110 mm…dd…yy
111 yy/mm/dd
112 yymmdd
输入
select 〃PayDate〃 = convert(char(15); paydate; 107) from payment_table where customer_id = 012845
输出
PayDate
May 1; 1997
分析
在上例中使用的 CONVERT 转换格式中的 107 从上表中可以知道 107 将以 MON
DD YY 的形式显示日期
SQL SERVER 的诊断工具— — SET 命令
TRANSACT…SQL 提供了一系列的 SET 命令可以让你打开不同的选项以帮助分析
TRANSACT…SQL 的语句 这里给出了一些常见的 SET 命令
l SET STATISTICS IO ON 可以让服务器返回请示的物理和逻辑页数
429
…………………………………………………………Page 430……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
l SET STATISTICS TIME O 可以让服务器返回语句的运行时间
l SET SHOWPLAN ON 可以让服务器返回当前正在运行的计划中的查询
l SET NOEXEC ON 可以让服务器编译设计过的查询但不运行
l SET PARSONLY ON 可以让服务器对所设计的查询进行语法检查 但并不运行
TRANSACT…SQL 也提供下边的命令来帮助你对输出的显示进行控制
l SET ROWCOUNT N 可以让服务器只返回查询中的前 N 行
l SET NOCOUNT ON 不必报告查询所返回的行数
注 如果你对 TRANSACT…SQL 的语句调整比较关心 SQL 那么请参见第 15 天的 对 SQL
语句的优化以提高性能
总结
今天所讨论的主题增加了你对使用 SQL 编程的一些知识 关于基本的 SQL 内容你已
经在前些天学习过了 它为你进行数据库编程打下了一个良好的基础 但是 这些内容只
是基本的东西 SQL 过程语言的概念已经在昨天解释过了 今天你又学习了一种基本的
SQL 这对于你— — 数据库程序员 — — 在访问数据库时提供了强大的功能
在 SYBASE 和 MICROSOFT 的 SQL SERVER 中的 TRANSACT…SQL 提供了许多你可
以在第三代编程语言和第四代编程语言中可以找到的编程结构 这包括 IF 条件与 WHILE
循环以及局部和全局变量的定义能力
需要明白的是今天所介绍的内容只是 TRANSACT…SQL 的基本特性和技术 并对所有
你可用的工具有了一个感性的认识 对于它的更详细的内容你需要参见 MICROSOFT SQL
SERVER 的 TRANSACT…SQL 文档
问与答
问 在 SQL 中是否提供了 FOR 循环
答 像 FOR 循环 WHILE 循环以及 CASE 分支等都是对 ANSI 标准的 SQL 的扩展 所以
对于不同的数据库系统它们的使用方法有很大的不同 例如 在 ORACLE 中提供了 FOR
循环 而在 TRANSACT…SQL 中就没有提供 当然 可以在 WHILE 循环都使用一个变
量来模拟 FOR 循环
430
…………………………………………………………Page 431……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
问 如果我写一个 GUI 风格的 WINDOWS 或 MACINTOSH 应用程序 其中有对话框
之类的元素 这时我是否可以使用 PRINT 语句来向用户输出信息
答 SQL 与平台是完全独立的 所以 PRINT 语句不能将信息输出至对话框中 如果你想输
出信息给用户 你的 SQL 过程将会返回一个预定义的值来表示成功或失败 而用户则
可以从查询的状态中得到通知 PRINT 命令在调试时最有用 因为在存储过程中的
PRINT 命令将不会总是向屏幕输出
校练场
问 在 ORACLE 的 PL/SQL 中与在 TRANSACT…SQL 中 SQL 字的使用方法与 ANSI 标准
的 SQL 是完全相同的 对不对
问 静态的 SQL 比动态的 SQL 灵活性差 尽管它的性能要比动态的好 对不对
练习
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!