数据库原理——T-SQL、游标
T-SQL语言简介
T-SQL简介及基本语法
变量
1,局部变量:变量名前加 @\red {@}@
2,全局变量:变量名前加 @@\red {@ @}@@ 如:
变量的声明及赋值:
1,变量声明语法:
declare @varName dataType [, @varName dateType] ...
2,单个变量赋值语法:
set @varName = <expr>
3,多个变量赋值语法:
select @varName = <expr|columnName> [, @varName = <expr|columnName>] ...
T-SQL控制流程语句:
程序实例:
【例1】在ScoreDB数据库中,查询Score表中最高成绩,如果最高成绩大于95分,则显示“Pretty Good”
use ScoreDB
go
declare @maxScore numeric --定义局部变量@maxScore 类型为numeric
select @maxScore = --给变量赋值(select max(score) From Score)
if @maxScore > 95 print 'Pretty Good'
【例2】声明两个局部变量@sno 和 @ score,用于接收select语句查询结果,并显示其结果
declare @sno char(7), @score numeric -- 定义变量select @sno = b.studentNo, @score = score -- 接受查询结果
from Score a, Student b
where a.studentNo = b.studentNoand ...if @@ROWCOUNT = 0 -- @@ROWCOUNT全局变量 表示上述查询影响的行数print 'No answer'
elseselect @sno,@score -- 显示@sno 和 @score
【例3】列示成绩表Score中的所有记录,要求根据学期号的不同取值 分别 显示 开课时间 为’xx上半年‘,’xx下半年‘ 和 ‘xx小学期’;根据score 不同取值 分别 显示 等级 为优良,合格,不合格。
如:’152‘ 为 16年第二学期
select studentNo 学号, courseNo 课程号,CASE right(termNo,1) -- 取termNo 右边的一个字符when '1' then left(termNo,2)+'年下半年' -- 如果为 1 , 则值为:termNo左边两个字符 + ’年下半年‘when '2' then str((convert(tinyint, left(termNo,2))+1,2)+ '年上半年' -- 如果为 2,则表明为第二学期,第二学期在另一年的上半年,所以将termNo左两位转为数值+1 再转为字符串else str((convert(tinyint, left(termNo,2))+1,2) + '小学期'end 开课时间, -- 定义列名 为 开课时间casewhen score >= 80 then '优良'when score >= 60 then '合格'else '不及格'end 等级 -- 定义列名 为 等级from Score
游标
- 对 select 语句查询的 结果集 进行 逐行处理,需要游标(cursor)
- 游标 是系统为用户提供的一个 数据缓冲区, 用于存放SQL语言的 执行结果(元组集合)
- 用户可以使用SQL提供的语句从游标中逐一获取元组记录,并赋给主变量,交给主语言进一步处理
游标的定义与使用
- 可对游标 当前位置\red {当前位置}当前位置 进行更新、查询、删除
- 需要经历五个步骤:
- 定义游标:
- 打开游标:
(打开游标表示:系统按照 游标的定义 (定义游标时查询语句不执行)从数据库中将数据检索出来,放在内存的游标集中,并为该游标集指定一个游标(游标名即为我们定义的名字),该游标指向游标集中的第一个元组之前,fetch一次之后,游标指向第一个元组)(所以每次打开游标都会执行一次查询,并占用内存,所以需要关闭) - 获取游标中的值:
- 关闭、释放游标:
游标使用例子
【例1】创建一个游标,逐行显示 选修了《计算机原理》课程 的学生 姓名、成绩、和选课学期,最后显示该课程的平均分。
- 选取操作
declare mycur cursor forselect studentName, score, termNofrom Student a, Course b, Score cwhere a.studentNo = b.studentNo and b.courseNo = c.courseNoand courseName = '计算机原理'order by studentName -- 可能有同学 重修情况
- 要获得平均分,必须首先计算选课人数 和 总分,即,声明一个计数变量@countScore 和一个 累加变量@sumScore,初始值为0
declare @countScore int, @sumScore int
set @countScore = 0
set @sumScore = 0
- 声明三个变量 @sName @score @termNo,接收游标集中当前游标的值
declare @sName varchar(10), @score int, @termNo char(3)
- 因为Fetch 命令一次仅从游标集中提取一条记录,并将游标移到下一条记录上。所以必须通过循环来重复提取。(@@FETCH_STATUS=0\red {@@ FETCH\_STATUS = 0 }@@FETCH_STATUS=0 表 示 正确提取)
-- 逐行处理记录,统计总分和总人数
open mycur
fetch mycur into @sName, @score, @termNowhile (@@FETCH_STATUS = 0)beginprint convert(char(10), @sName) + convert(char(10), @score) + convert(char(10), @termNo)set @sumScore = @sumScore + @scoreset @countScore = @countScore + 1fetch mycur into @sName, @score, @termNoend
-- 如果人数为0, 则显示0.00
if @countScore > 0print @sumScore / @countScore
elseprint 0.00
- 处理完全部游标记录后,必须关闭和释放游标
close mycur
deallocate mycur
当前游标集的修改与删除
- 对游标当前行的修改和删除,都会转化为对基本表的更新\red {对游标当前行的修改和删除,都会转化为对基本表的更新}对游标当前行的修改和删除,都会转化为对基本表的更新
- 删除游标集中的当前行
(删除一行后,游标定位于被删除行的下一行)
DELETE FROM <tableName> WHERE CURRENT OF <cursorName>
- 修改游标集中的当前行
update <tableName>
set <columnName> = <expr> [, <columnName> = <expr2>...]
where current of <cursorName>
【例1】将选修了《高等数学》课程且成绩不及格的学生选课记录显示出来,并从数据库中删除该选课记录。
(思路:因为需要显示出来,所以可以选择使用游标,显示后删除,可以直接对游标集进行删除操作)
- 定义游标:
-- 定义游标
declare mycur cursor forselect studentName, scorefrom Student a, Course b, Score cwhere a.studentNo = c.studentNoand b.courseNo = c.courseNoand courseName = '高等数学'and score < 60
-- 定义变量接收值
declare @sName varchar(10), @score int-- 打开游标
open mycur
-- 此时游标指向游标集中第一个元组之前
-- fetch 获取值
fetch mycur into @sName, @score
-- 此时 游标指向游标集中第一个元组
while(@@FETCH_STATUS = 0)BEGIN-- 显示变量 @sName 和 变量@score的值SELECT @sName, @score-- 删除当前游标所指的选课记录delete from Score where current of mycur-- 此时游标指向下一条元组之前,同open游标时情况相同,等待fetchfetch mycur into @sName, @score-- 此时游标指向被删除的元组的下一条记录END
close mycur
deallocate mycur
- 注意游标指向的变化,关于open,fetch,delete对于游标指向的问题有各种说法,上述过程逻辑合理。
数据库原理——T-SQL、游标相关推荐
- 【数据库原理与SQL Server应用】Part13——数据库设计
[数据库原理与SQL Server应用]Part13--数据库设计 一.关系规范化理论的引入 1.1 问题的提出 1.2 从数据依赖到函数依赖 1.2.1 数据依赖(Data Dependency) ...
- 数据库原理概论Ⅱ-SQL
数据库原理概论Ⅱ-SQL 结构化查询语言(Structured Query Language)是关系数据库的一种通用语言. SQL是在关系代数更高级的抽象,可以用比较类似英文的语法实现我们要查询的数据 ...
- 【数据库原理与SQL Server应用】Part03——T-SQL语言
[数据库原理与应用]Part03--T-SQL语言 一.SQL语言基本概念 1.1 T-SQL语言简介 T-SQL语言的特点: 核心SQL语言的4个部分: 1.2 T-SQL语言的语法约定 1.3 标 ...
- MySQL数据库原理习题---SQL复杂查询
SQL复杂查询 对各表中的数据进行不同条件的连接查询和嵌套查询 1)查询每个学生及其选课情况: Select student.sno,sname,age,sex,sdept,course.cno,cn ...
- 【数据库原理与SQL Server应用】Part02——数据模型
[数据库技术与应用]Part02--数据模型 一.信息的三种世界 1.1 现实世界 1.2 信息世界 1.3 计算机世界 1.4 三种世界的相互转换 二.概念模型 2.1 概念模型的基本概念 2.2 ...
- 数据库原理与应用(SQL Server)笔记 第十一章 游标
目录 前言 一.游标的定义 二.游标的声明 三.游标的打开 四.游标的使用 五.游标的关闭 六.游标的删除 七.静态游标和动态游标 结语 前言 本章内容将从六个方面介绍关于游标的知识,分别是其定义.声 ...
- SQL游标原理和使用方法(转)
SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...
- 【SQL语言】数据库原理与设计
目录 第五章 SQL语言 5.3 简单查询(对一个表) 5.4 连接查询 5.5 聚集函数 5.6 嵌套查询 5.7 集合运算 5.8 视图的创建和使用 5.9 更新操作 第六章 高级SQL语言 6. ...
- MS SQL Server数据库原理
MS SQL Server数据库原理 一. 数据库基本概念 数据库系统(DBS):采用数据库技术的计算机系统,由数据库(数据).数据库管理系统(软件).数据库管理员(人员).硬件平台(硬件)和软件平台 ...
最新文章
- 一文看尽目标检测:从YOLO v1到v3的进化之路
- STM32之ADC实例(基于DMA方式)
- 计算机科学与技术的知识要求,0812计算机科学与技术基本要求.doc
- 生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...
- 利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型...
- java 元胞自动机_元胞自动机 Java实现
- h3csnmp管理命令_华为H3C交换机SNMP配置命令
- 智能优化算法:蝗虫优化算法-附代码
- 如果你觉得自己对 CSS 变量不熟悉,那么可以补充这个!
- 汉诺塔问题(非常简单明了的解析)
- 篮球记分牌c语言程序和报告,跪求:设计一款篮球记分牌,包括C语言程序和proteus的仿真图,最好附带设计报告.。邮箱liuzhonghuaol@126.com。...
- Least Crucial Node UVALive - 7456
- CE修改器入门:精确数值扫描
- 视频会议室需要什么设备可以实现高清视频会议?
- java删除奇数文件_java,奇数性的问题
- Android 学习第10课,Android的布局
- 波特(Baud)与比特(bit)换算详解
- 科目二很难考吗?经验全在这里!
- 信息检索与利用(第三版)第六章 搜索引擎
- 现实中如何评判路遥《人生》中的高加林?
热门文章
- 一篇文章扫盲手机SIM卡相关知识
- 你的PC机或者终端,是怎么上网的?怎么连接到网络的?无线网怎么接入Internet,如何访问网络资源?
- 【java毕业设计】基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)——俄罗斯方块游戏
- aardio - 调用Python库下载蓝奏盘文件
- 基于最大熵Maxent-ArcGis地理分布预测教程
- SQL SERVER中的汉字转拼音-实现根据拼音搜索汉字
- Charles抓包工具使用介绍
- 中国人民大学与加拿大女王大学金融硕士宋会芝:只要开始就不晚
- 解决 configure.ac: error: possibly undefined macro: AC_PROG_LIBTOOL
- dq坐标系下无功功率表达式_基于瞬时电流分解的谐波电流检测方法研究