SQL Server:流程控制语言详解

在这里插入图片描述
在这里插入图片描述

文章目录

  • 一、批处理、脚本和变量
    • 局部变量和全局变量
      • 1、局部变量
      • 2、全局变量
  • 二、顺序、分支和循环结构语句
    • 1、程序注释语句
    • 2、BEGIN┅END语句块
    • 3、IF┅ELSE语句
    • 4、CASE语句
    • 5、WHILE语句
    • 6、BREAK和CONTINUE语句
      • BREAK语句
      • CONTINUE语句
  • 三、程序返回、屏幕显示等语句
    • 1、RETURN语句
    • 2、PRINT和RAISERROR语句
    • 3、WAITFOR语句
  • 四、游标概念及使用
    • 1、 游标的概念
    • 2、游标的使用

一、批处理、脚本和变量

局部变量和全局变量

1、局部变量

局部变量是以@开头的用户定义的变量,用declare语句声明

(1)局部变量的命名

DECLARE  <局部变量名1><数据类型1> [ , <局部变量名2><数据类型2>,]

(2)局部变量的赋值

SET  <局部变量名>= <表达式>

例1:在同一批中先声明二个变量,并为它们赋值,然后将它们用到SELECT语句的WHERE子句中。

Use  teaching
GO
- - 声明二个局部变量
DECLARE @student_name  varchar(20) , @student_birthday  datetime
-- 对二个局部变量赋值
SET  @student_name = '杨涛'
SET  @student_birthday =2001-01-01'
-- 根据这二个局部变量的值进行查询
SELECT  sno, sname, birthday
FROM  student
WHERE  sname=@student_name  or birthday=@student_birthday
GO

2、全局变量

全局变量是以@@开头的SQL Server系统提供并赋值的变量

【注】

  1. 用户不能建立全局变量
  2. 也不能用SET语句来修改全局变量的值
  3. 但可以将全局变量的值赋给局部变量,以便保存和处理

例2:应用三个全局变量的例子

 /* 第一类全局变量 */
-- @@rowcount表示最近一个语句影响的行数
PRINT  @@rowcount
-- @@error保存最近执行操作的错误状态
PRINT  @@error
/* 第二类全局变量 */
-- @@version表示SQL Server的版本信息
PRINT @@version

例3:将全局变量的值赋给局部变量,请读者利用在线帮助来理解@@MAX_PRECISION的含义

DECLARE  @max_p   tinyint
SET @max_p = @@MAX_PRECISION
PRINT @max_p

二、顺序、分支和循环结构语句

1、程序注释语句

① 注释语句的作用

(1)说明代码的含义;

(2)注释掉程序中暂时不用的语句;

② 注释语句的种类

(1)- -(两个减号):用于注释单行;

(2)/……/:用于注释多行;

2、BEGIN┅END语句块

BEGIN<T-SQL语句序列>
END

3、IF┅ELSE语句

IF  <逻辑表达式><T-SQL语句序列1>
[ELSE<T-SQL语句序列2>]

例4:请读者仔细阅读下列程序,并理解其含义。

Use  teachingGOIF EXISTS (select *  from student_course  where cno='10101' )BEGIN PRINT  '存在选修10101号课程的选课记录!'select  cno, avg(grade)  from student_course  where cno='10101'    group by cnoENDELSEPRINT  '不存在选修10101号课程的选课记录!'GOIF(select avg(grade)from student_course where cno='10101')>80BEGIN PRINT  '选修10101号课程学生的平均成绩大于80分!'Select s.sno,sname from student s,student_course scWhere  s.sno=sc.sno and cno='10101' and grade>=85ENDELSEPRINT  '选修10101号课程学生的平均成绩小于等于80分!'GO

4、CASE语句

【语句格式1】:根据多个选择来确定执行的内容 —— 类似于C语言中的switch...case

CASE  <条件判断表达式>WHEN <比较表达式1> THEN <结果表达式1>[WHEN <比较表达式2> THEN <结果表达式2> ………WHEN <比较表达式n> THEN <结果表达式n>] [ELSE  <结果表达式q>] 
END

例5:使用CASE语句格式1的例子

Use Teaching
GO
Select  Sno  as  '学号' , sname  as  '姓名' ,CASE  dept	-- 根据属性进行划分WHEN '电子系' THEN '是来自电子系学生’WHEN '计算机系' THEN '是来自计算机系学生'WHEN '信息系' THEN '是来自信息系学生'WHEN '机械系' THEN '是来自机械系学生'ELSE '是来自其它系的学生'END   as  '系名'
From student
Order  by  dept
GO

【语句格式2】:依次判断where后的<逻辑表达式1>是否为TRUE,若是的话则执行后面的 结果表达式

CASEWHEN <逻辑表达式1> THEN <结果表达式1>
[WHEN <逻辑表达式2> THEN <结果表达式2> ………WHEN <逻辑表达式n> THEN <结果表达式n>] [ELSE  <结果表达式q>] 
END

例6:使用CASE语句格式2的例子

Use Teaching
GO
Select sc.sno  as  '学号', sname  as  '姓名' ,sc.cno  as  '课程号', cname  as  '课程名',CASE WHEN  grade>=90  THEN  '优秀'WHEN  grade>=80  THEN  '良好'WHEN  grade>=70  THEN  '中等'WHEN  grade>=60  THEN  '及格' ELSE  '不及格'END  as  '成绩'
from student  s, student_course  sc, course  c
where  s.sno=sc.sno  and  sc.cno=c.cno
order by  s.sno
go

5、WHILE语句

使用WHILE可以在条件成立的时候重复执行一条或多条T-SQL语句

WHILE <逻辑表达式><T-SQL语句序列>  

注:与IF…ELSE语句一样,WHILE语句只能执行一条T-SQL语句,如果希望包含多条T-SQL语句,就应该使用BEGIN…ENG结构

例7:计算s = 1+2+3+…+99+100的和

  DECLARE  @x  int , @s  intSET @s=0SET @x=1WHILE @x<=100BEGINSET @s=@s+@xSET @x=@x+1ENDPRINT  'S='+convert(char(4) , @s )GO
-- 其中convert (char(4) , @s )为转换数据类型的函数

6、BREAK和CONTINUE语句

BREAK语句

BREAK语句用于退出最内层的WHILE循环

WHILE <逻辑表达式><T-SQL语句序列1>BREAK<T-SQL语句序列2>

例8:利用BREAK语句跳出循环的例子

  DECLARE @x int , @s intSET @s=0SET @x=1WHILE  @x<=100BEGINSET @s=@s+@xIF @s>2000BREAKSET @x=@x+1ENDPRINT 'x='+convert (char(3), @x )PRINT 'S='+convert (char(4), @s )GO

CONTINUE语句

CONTINUE语句用于重新开始一次WHILE循环

WHILE <逻辑表达式><T-SQL语句序列1>CONTINUE<T-SQL语句序列2>

例9:使用CONTINUE语句的例子

  DECLARE @x int , @s intSET @s=0SET @x=1WHILE @x<=100BEGINSET @s=@s+@xSET @x=@x+1IF @x<=50CONTINUEELSEBREAKENDSET @x=@x-1PRINT 'x='+convert (char(3) , @x )PRINT 'S='+convert (char(4) , @s )GO

三、程序返回、屏幕显示等语句

1、RETURN语句

RETURN语句可以在过程、批和语句块中的任何位置使用

语法格式如下:

RETURN  [<整数表达式>]

例10:使用RETURN语句返回整数的例子

use teaching
go
create  procedure  checkstate  @param  char(7)
as
if (select  dept  from  student where  sno =@param) = '电子系'RETURN  1
else RETURN  2
go
declare  @return_status  int
exec  @return_status=checkstate @param='0012301'
select  @return_status  as  'Return Status'
go

2、PRINT和RAISERROR语句

(1)PRINT语句

PRINT语句的作用是在屏幕上显示用户消息

PRINT  <字符串>|局部变量|全局变量

(2)RAISERROR语句

RAISERROR语句的作用是将错误信息显示在屏幕上,同时也可以记录在NT日志中

3、WAITFOR语句

WAITFOR语句可以将它之后的语句在一个指定的时间间隔之后执行,或在未来的某一指定时间执行

WAITFOR { DELAY ‘time1’ | TIME ‘time2’}

例11:使用WAITFOR语句的例子

-- 以下代码指示SQL Server等待两秒后查询student表
WAITFOR  DELAY  '00:00:02'
Select  *  from  teaching.dbo.student
GO
/*以下代码指示SQL Server等待到当天上午09:15:10,才执行查询操作*/
Use  teaching
GO
WAITFOR  TIME  '09:15:10'
Select  *  from  student
GO

四、游标概念及使用

1、 游标的概念

游标提供了一种在服务器内部处理结果集的方法,它可以识别一个数据集合内部指定的工作行,从而可以有选择地按行进行操作

无需借助于高级语言来实现,导致不必要的数据传输,从而延长执行的时间

1)声明游标

DECLARE  <游标名>  [ INSENSITIVE ] [ SCROLL ] CURSOR   FOR  <SELECT语句>[ FOR  { READ ONLY | UPDATE [ OF <列名1> [ , <列名2>] ] } ]

有关参数的说明:

① < 游标名 >是为声明的游标所取的名字

② 使用insensitive关键字定义的游标会将提取出来的数据放在一个Tempdb的数据库创建的临时表中,如若不选用insensitive关键字,则用户对基本表所做的任何改动都将在游标中得到体现

③ 使用 SCROOL 关键字定义的游标,包括如下6种取数功能

  • FIRST —— 表示取第一行数据
  • LAST —— 表示取最后一行数据
  • PRIOR —— 表示取前一行数据
  • NEXT —— 表示取后一行数据(默认)
  • RELATIVE —— 表示按相对位置取数据
  • ABSOLUTE —— 表示按绝对位置取数据

④ < SELECT 语句 > 主要用来定义游标所要进行处理的结果集,在声明游标的SELECT语句中不允许使用 computecompute byinto关键字

⑤ READ ONLY 表示声明只读游标,不允许通过只读游标进行数据的更新

⑥ UPDATE [ OF <列名1> [ , <列名2>… ] ] 表示定义在这个游标里的可更新列

例12:先定义一个可在student表中所有行上进行操作的游标,再定义一个可对游标处理的结果集进行筛选和排序的只读游标

use  teaching
go
-- 定义可在student表中所有行上进行操作的游标
DECLARE  student_ cursor1  CURSOR
FOR   select * from  student
go
/*定义可对游标处理的结果集进行筛选和排序的只读游标 */
DECLARE student_cursor2  CURSOR
FOR  select  sno , sname  from  studentwhere  dept = '计算机系' order by sno
FOR  READ ONLY
go

2)打开游标

在使用游标之前,必须先打开游标

OPEN  <游标名>	

3)关闭游标

不使用游标时应关闭游标,以通知服务器释放游标所占用的资源

CLOSE  <游标名>

4)释放游标

游标结构本身也会占用一定的计算机资源,所以在使用完游标后应该回收被游标占用的资源和空间,彻底将游标释放

DEALLOCATE  <游标名>

例13:说明游标的定义、打开、关闭和释放的过程。

use teaching
go 
DECLARE  student_course_cursor  CURSORFOR  select  *  from  student_coursewhere  cno='10106'
SELECT  @@CURSOR_ROWS  
/* 返回值为0,表示游标还没被打开 */
open  student_course_cursor
fetch  next  from  student_course_cursor  
/* 返回满足条件的第一个记录 */
select  @@CURSOR_ROWS  
/* 返回值为-1,表示游标是动态的 */
close  student_course_cursor
deallocate  student_course_cursor
go

2、游标的使用

1)使用游标取数

打开游标后,就可以利用游标提取数据了

FETCH  [ [ NEXT | PRIOR | FIRST | LAST| ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar }] FROM ] <游标名>[ INTO  <局部变量1> [ , <局部变量2>,]]
-- 在使用INTO子句对局部变量赋值时,局部变量必须和声明游标时使用的select语句中引用到的数据列在数量、顺序和数据类型上保持一致,否则服务器返回提示错误

例14:使用游标取数的操作与循环语句相结合的例子。

use  teaching 
go
-- 定义局部变量
DECLARE @sno  char(7) , @sname  varchar(20)
-- 声明游标
DECLARE  student_cursor1  CURSORFOR  select sno , sname  from  studentwhere  spec= '计算机' order  by  sno
-- 打开游标
OPEN  student_cursor1
-- 执行第一次取操作数并对局部变量赋值
FETCH   NEXT   FROM   student_cursor1  INTO  @sno , @sname
/* 检查上一次操作的执行状态,若@@FETCH_STATUS为0,则表示成功,可以打印并继续取数,否则停止取数 */
WHILE  @@FETCH_STATUS = 0BEGINPRINT '学号:'+@sno+'姓名:'+@snameFETCH  NEXT  FROM  student_cursor1 INTO  @sno , @snameEND
-- 关闭游标
CLOSE  student_cursor1
-- 释放游标
DEALLOCATE  student_cursor1
GO

例15:定义一个滚动游标,以实现更灵活的数据提取

Use teaching 
GO
-- 首先执行一遍查询语句以提供滚动游标操作成功与否的对比
select  sno, sname  FROM  student
Where  birthday between '1996-01-01' and '1997-12-31'
Order  by  sno
-- 定义滚动游标
DECLARE  student_cursor2  SCROLL  CURSORFOR  select  sno , sname  FROM  studentwhere  birthday between  '1996-01-01'  and  '1997-12-31'order   by   sno
-- 打开游标           
OPEN  student_cursor2
-- 提取数据集中的最后一行
FETCH  LAST  FROM  student_cursor2
-- 提起当前游标所在行的上一行
FETCH  PRIOR  FROM  student_cursor2
-- 提取当前数据集中的第5行
FETCH  ABSOLUTE  5  FROM   student_cursor2
-- 提取当前行的前2行
FETCH  RELATIVE -2  FROM   student_cursor2
-- 关闭游标
CLOSE  student_cursor2
-- 释放游标
DEALLOCATE  student_cursor2
GO

2)利用游标修改数据

要使用游标进行数据的修改,其前提条件是该游标必须被声明为可更新的游标。在进行游标声明时,没有带READONLY关键字的游标都是可更新的游标

UPDATE <表名>
SET <列名1>=<表达式l>[,<列名2>=<表达式2>,…]
WHERE   CURRENT  OF  <游标名>
-- 其中CURRENT OF <游标名>表示当前游标的当前数据行。CURRENT OF子句只能使用在UPDATE和DELETE操作的语句中

使用游标还可以进行数据的删除,其方法与上雷同,下面仅给出它的语法结构,其语句格式如下

DELETE FROM <表名> WHERE  CURRENT  OF <游标名>

注:在使用游标进行数据的更新或删除之前,用户必须事先获得相应数据库对象的更新或删除的权力,这是进行这类操作的必要前提。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python continue的用法详解与转义字符及用法

Python continue的用法详解 continue 的功能和 break 有点类似&#xff0c;区别是 continue 只是忽略当次循环的剩下语句&#xff0c;接着开始下一次循环&#xff0c;并不会中止循环&#xff1b;而 break 则是完全中止循环本身。 如下程序示范了continue 的用法&#xff1a; # …

工程数学笔记 | 傅里叶级数/变换的本质理解

以下内容纯属个人学习记录&#xff0c;难免有误&#xff0c;欢迎指正~ 引子 虽已工作数宰&#xff0c;但当因为工作的需要再次碰到傅里叶级数/变换相关的知识时是还是难免汗流浃背&#xff0c;读书时的痛苦的回忆涌上心头&#xff0c;果然曾经欠下的总归是要偿还的&#xff0c…

Python基础语法之学习print()函数

Python基础语法之学习print函数 1、代码2、效果 1、代码 print("Hello World") print("Hello World1","Hello World2") print("Hello World1\n","Hello World2") print("Hello World",end" 默认结束符是行号…

传输层协议[精选]

网络: 跨主机通信. 互联网通信: 两点之间的通信路径有无数条. 集线器: 把一根网线差出来两根,但是同一时刻只能有一根线跑.交换机: 组建局域网.路由器: 本质就是将两个局域网连接起来 交换机和路由器之间的区别越来越模糊. 调制解调器: 使用电话线上网的时候,需要将电话线的模…

c++容器详解Vector、deque、list、set、multiset、map、multimap、queue、stcak、Array

容器 数据结构描述实现头文件向量(vector)连续存储的元素<vector>列表(list)由节点组成的双向链表,每个结点包含着一个元素<list>双向队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>集合(set)由节点组成的红黑树,每个节点都包含着一个元素,…

C++:对象模型和this指针

对象模型&#xff1a; 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间&#xff1a; 1字节 C编译器会给每个空对象也分配一个字节空间&#xff0c;是为了区分空对象占内存的位置 每个…

根据密码构成规则检测密码字符串

从键盘输入密码字符串&#xff0c;程序根据给定密码构成规则检测并给出对应提示。 (笔记模板由python脚本于2023年11月27日 19:27:47创建&#xff0c;本篇笔记适合熟悉Python字符串str对象的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.…

Android12之logcat日志显示颜色和时间(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Android 12 打开网络ADB并禁用USB连接ADB

平台 RK3588 Android 12 Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&am…

ABAP: JSON 报文解析——/ui2/cl_json

1、JSON数组 报文格式如下&#xff0c;是JSON 数组类型的。 [{"I_TYPE":"V","I_BUSINESSSCOPE":"1001"},{"I_TYPE":"V","I_BUSINESSSCOPE":"1002"} ] json转换为SAP内表&#xff1a; TYP…

Redis入门保姆级教程

1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网:https://redis.io 中文网:https://www.redis.net.cn/ key-value结构存储&#xff1a; 主要特点&#xff1a; 基于内存存储&#xff0c;读写…

五周年活动周历!AutoGen解析·技术畅聊·3大城市工坊本周启动!

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。 飞…

计算机毕业设计|基于SpringBoot+MyBatis框架的仿天猫商城购物系统设计与实现

计算机毕业设计|基于SpringBootMyBatis框架的仿天猫商城购物系统设计与实现 迷你仿天猫商城是一个基于SSM框架的综合性B2C电商平台&#xff0c;需求设计主要参考天猫商城的购物流程&#xff1a;用户从注册开始&#xff0c;到完成登录&#xff0c;浏览商品&#xff0c;加入购物…

linux查看emmc分区信息(10种方法 )

目录 ## 1 emmc ## 2 uboot查看 ## 3 kernel查看 方法1 方法2 方法3 方法4 方法5 方法6 方法7 方法8 方法9 方法10 ## 1 emmc 我们要说的是&#xff0c;User Data Partition中的再分区 可简化为 ## 2 uboot查看 u-boot> mmc partPartition Map for MMC device…

C++值常用集合算法

C值常用集合算法 set_intersection #include<iostream> using namespace std; #include<vector> #include<numeric> #include<algorithm>class MyPrint { public:void operator()(int val){cout << val<<" ";} };void test() {v…

nodejs+vue+mysql皮具行李箱包包网上商城购物网站

本系统可分为两个大的模块&#xff0c;即前台用户模块和后台管理员模块&#xff0c;前台用户模块用户可以进行浏览查询皮具的各种信息&#xff0c;添加购物车&#xff0c;下订单等各种操作。后台管理员模块管理员可以进行皮具的处理&#xff0c;还有处理订单&#xff0c;皮具分…

人工智能学习2(python数据清洗)

编译工具&#xff1a;PyCharm 一.数据清洗 转化数据类型、处理重复数据、处理缺失数据 import pandas as pddf pd.read_csv("/data.csv") df.sample(10) # 用于随机获取数据并返回结果 df.head(10) # 查看前十条数据 df.tail(10) # 查看后十条数据 df.shape …

通过亚马逊云科技云存储服务探索云原生应用的威力

文章作者&#xff1a;Libai 欢迎来到我们关于“使用亚马逊云科技云存储服务构建云原生应用”的文章的第一部分。在本文中&#xff0c;我们将深入探讨云原生应用的世界&#xff0c;并探索亚马逊云科技云存储服务在构建和扩展这些应用中的关键作用。 亚马逊云科技开发者社区为开发…

机器学习的复习笔记4-岭回归与多项式回归

一、岭回归 在简单的线性回归中&#xff0c;一味追求平方误差最小化&#xff0c;R2值尽可能大&#xff0c;可能会受到噪声的严重干扰。噪声&#xff0c;即偶发的错误的值。 如图&#xff0c;若为满足所有点的拟合&#xff08;虚线&#xff09;&#xff0c;表面上看R2值小&…

深度学习回顾:七种网络

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO &#xff0c;以及transformer和humg-face— 编码和创新之路。对于此类编程的短小示例&#xff0c;用于对照观察&#xff0c;或做学习实验。 二、CNN网络示例 2.1 CNN用mnist数据集 CNN 专为图像处理而设计&#xff0c;包…