和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。

基本概念

在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行:

使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构:

流程控制语句的使用范围和GO关键字

流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存储过程。

因为这里重点讲到T-SQL查询语句,所以这里只讲批处理段(Batch).

一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。在这个批处理范围内,局部变量是互相可见的。

而想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。所以不在同一个批处理内局部变量不可见,也不可对跨批处理的语句使用流程控制语句.

在同一个批处理中局部变量互相可见:

在不同批处理中局部变量不可见:

在不同批处理中,流程控制语句不能跨批处理:

T-SQL中的8个流程控制语句关键字

在T-SQL中,与流程控制语句相关的关键字有8个:

BEGIN...END

BREAK

GOTO

CONTINUE

IF...ELSE

WHILE

RETURN

WAITFOR

下面对上述关键字进行挨个讲解

BEGIN…END关键字

BEGIN…END关键字也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成类C语言中的花括号(“{}"“)

WHILE/BREAK/CONTINUE关键字

在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。

WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。

CONTINUE关键字用于结束本次循环,直接开始下一次循环。

BREAK关键字用于直接跳出WHILE循环语句。

这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。

一个简单的例子如下:从1循环到10,当循环到7时,结束本次循环并继续,当循环到8时,跳出循环

IF..ELSE关键字

IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法,这里就不再讲述了,例子参看上图。

还有要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在,比如:

我想查询员工中没有上级的人,如果有这个人,则输出“XXX is our boss”,如果没有,则输出"There is no infomation about our boss”

GOTO关键字

GOTO关键字因为能打乱程序的整个流程而在高级语言中臭名卓著。GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上,比如:

RETURN关键字

Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),批处理有关概念请参考前面GO关键字那一节.

简单的Return概念如下例子:

在存储过程中,Return语句后面可以返回数字用于返回执行状态或者错误代码。

很多人会把Return语句和RAISERROR函数搞混,区别在于RAISERROR函数会引发错误,并且程序依然会往下执行:

WAITFOR关键字

WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行。

推迟等待和在特定时间执行的语法分别是WAITFOR DELAY ‘需要等待的执行时间',WAITFOR TIME ‘需要执行程序的精确时间’

简单的语法例子如下:

WAITFOR的功能可以实现更为复杂的业务逻辑,比如:

我想开始一项促销活动,在当前时间10小时后开始,为8折,20小时后结束,变为9折:

总结

本篇文章从T-SQL查询的角度讲解了流程控制语句的8个关键字。利用好这些关键字是掌握复杂T-SQL查询的必要条件。

T-SQL查询进阶--流程控制语句相关推荐

  1. bs架构与cs架构的区别_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明...

    概述 之前分享的主要是Oracle上的一些内容,那么mysql又有哪些地方不一样呢?下面从MySQL总体架构.sql查询执行流程和语句执行顺序来看一下.. 01 架构总览 下面看一下mysql的架构图 ...

  2. oracle和mysql文件怎么打开_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明-sql文件怎么打开...

    概述 之前分享的主要是Oracle上的一些内容,那么mysql又有哪些地方不一样呢?下面从MySQL总体架构.sql查询执行流程和语句执行顺序来看一下.. 01 架构总览 下面看一下mysql的架构图 ...

  3. Mysql---基础查询进阶、流程控制语句

    一 基础查询进阶 什么是函数:MySQL服务内置的命令 函数的格式  函数名() 通常使用的方法      函数名(表头名) 也可以单独使用      函数名() 或者 函数里嵌套函数 函数(函数() ...

  4. 数据库原理与应用(SQL Server)笔记 第七章 流程控制语句、系统内置函数

    目录 一.流程控制语句 (一)BEGIN...END语句块 (二)条件语句 (三)循环语句 1.WHILE语句 2.BREAK语句和CONTINUE语句 (四)无条件转移语句 (五)返回语句 (六)等 ...

  5. PL/SQL编程---流程控制语句

    --流程控制语句--条件表达式符号>.<.>.<=.>=.<>.!=IS NULL / IS NOT NULLBETWEEN ... AND ...--条件连 ...

  6. SQL 流程控制语句 之五 RETURN语句介绍

    SQL 流程控制语句 之五 RETURN语句介绍 一.RETURN语句例子: WAITFOR delay '00:00:01' Select * from titles return select * ...

  7. 【Sql Server】Database-sql语言的流程控制语句

    流程控制语句 If  else语句 If (表.列) {语句|语句块begin,,,end} Else {语句|语句块begin,,,end }   If else 语句嵌套 If Begin If ...

  8. PL/SQL流程控制语句

    介绍PL/SQL的流程控制语句, 包括如下三类: l 控制语句: IF 语句 l 循环语句: LOOP语句, EXIT语句 l 顺序语句: GOTO语句, NULL语句 1 条件语句 IF <布 ...

  9. oracle学习笔记5:pl/sql流程控制语句

    pl/sql编程中的流程控制语句主要有if语句,case语句以及循环语句 下面将逐个介绍这几个语句 1.if语句 -- 根据员工工资来判断奖金的多少,工资在5000以上的奖金500,工资在3000-5 ...

最新文章

  1. 浅谈UWB(超宽带)室内定位技术(转载)
  2. 程序员假冒AI,印度公司竟骗取2亿元投资
  3. 计算几个数相加和为16
  4. [CF407B] Long Path
  5. 计算机网络知识点3——数据交换(报文交换、分组交换)
  6. ASP.NET Core 2.0 配置NLog日志组件
  7. c++计算eigen随笔(9)-数组、矩阵、向量(2)
  8. npm publish 发布一个 Angular 库的时候报错以及解决方法
  9. 世界大百科全书!耶鲁大学教授再出神作!用1000幅图片,讲明白45亿年历史......
  10. 计算机软件性能测试的过程,性能测试过程的规范
  11. highgui java opencv_OpenCV在C Qt应用程序中的highgui
  12. 博士招生 | 北京大学和中山大学博士申请考核还有名额,门槛不高,速来
  13. 浅谈防勒索病毒方案之主机加固
  14. win7计算机的蓝牙,手机蓝牙如何与win7电脑连接?win7电脑蓝牙连接手机的方法
  15. matlab求解平面度,基于MATLAB的平面度评定
  16. 数据结构与算法 入门 与 排序
  17. oracle导入DMP文件数据
  18. 研究生要不要出去实习
  19. Word控件Spire.Doc 【书签】教程(5): 使如何在word文档的书签处插入图片
  20. Python学习:线程池原理及实现

热门文章

  1. 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
  2. 【IntelliJ IDEA】导出可执行 JAR 包
  3. 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )
  4. 【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )
  5. 【鸿蒙 HarmonyOS】创建 Java 语言 HarmonyOS 手机应用 ( 首次进入 DevEco Studio 配置环境 | 创建 Java 手机工程 | 鸿蒙工程代码目录简介 )
  6. 【约束布局】ConstraintLayout 偏移 ( Bias ) 计算方式详解 ( 缝隙比例 | 计算公式 | 图解 | 测量图 + 公式 )
  7. 上下文 及 执行上下文
  8. 2019年六月刷题列表
  9. CPU调度(CPU Scheduling)
  10. centos7 源码编译安装mysql 5.7.21