友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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 灵活性差  尽管它的性能要比动态的好  对不对 



练习 
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!