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、游标相关推荐

  1. 【数据库原理与SQL Server应用】Part13——数据库设计

    [数据库原理与SQL Server应用]Part13--数据库设计 一.关系规范化理论的引入 1.1 问题的提出 1.2 从数据依赖到函数依赖 1.2.1 数据依赖(Data Dependency) ...

  2. 数据库原理概论Ⅱ-SQL

    数据库原理概论Ⅱ-SQL 结构化查询语言(Structured Query Language)是关系数据库的一种通用语言. SQL是在关系代数更高级的抽象,可以用比较类似英文的语法实现我们要查询的数据 ...

  3. 【数据库原理与SQL Server应用】Part03——T-SQL语言

    [数据库原理与应用]Part03--T-SQL语言 一.SQL语言基本概念 1.1 T-SQL语言简介 T-SQL语言的特点: 核心SQL语言的4个部分: 1.2 T-SQL语言的语法约定 1.3 标 ...

  4. MySQL数据库原理习题---SQL复杂查询

    SQL复杂查询 对各表中的数据进行不同条件的连接查询和嵌套查询 1)查询每个学生及其选课情况: Select student.sno,sname,age,sex,sdept,course.cno,cn ...

  5. 【数据库原理与SQL Server应用】Part02——数据模型

    [数据库技术与应用]Part02--数据模型 一.信息的三种世界 1.1 现实世界 1.2 信息世界 1.3 计算机世界 1.4 三种世界的相互转换 二.概念模型 2.1 概念模型的基本概念 2.2 ...

  6. 数据库原理与应用(SQL Server)笔记 第十一章 游标

    目录 前言 一.游标的定义 二.游标的声明 三.游标的打开 四.游标的使用 五.游标的关闭 六.游标的删除 七.静态游标和动态游标 结语 前言 本章内容将从六个方面介绍关于游标的知识,分别是其定义.声 ...

  7. SQL游标原理和使用方法(转)

    SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...

  8. 【SQL语言】数据库原理与设计

    目录 第五章 SQL语言 5.3 简单查询(对一个表) 5.4 连接查询 5.5 聚集函数 5.6 嵌套查询 5.7 集合运算 5.8 视图的创建和使用 5.9 更新操作 第六章 高级SQL语言 6. ...

  9. MS SQL Server数据库原理

    MS SQL Server数据库原理 一. 数据库基本概念 数据库系统(DBS):采用数据库技术的计算机系统,由数据库(数据).数据库管理系统(软件).数据库管理员(人员).硬件平台(硬件)和软件平台 ...

最新文章

  1. 一文看尽目标检测:从YOLO v1到v3的进化之路
  2. STM32之ADC实例(基于DMA方式)
  3. 计算机科学与技术的知识要求,0812计算机科学与技术基本要求.doc
  4. 生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...
  5. 利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型...
  6. java 元胞自动机_元胞自动机 Java实现
  7. h3csnmp管理命令_华为H3C交换机SNMP配置命令
  8. 智能优化算法:蝗虫优化算法-附代码
  9. 如果你觉得自己对 CSS 变量不熟悉,那么可以补充这个!
  10. 汉诺塔问题(非常简单明了的解析)
  11. 篮球记分牌c语言程序和报告,跪求:设计一款篮球记分牌,包括C语言程序和proteus的仿真图,最好附带设计报告.。邮箱liuzhonghuaol@126.com。...
  12. Least Crucial Node UVALive - 7456
  13. CE修改器入门:精确数值扫描
  14. 视频会议室需要什么设备可以实现高清视频会议?
  15. java删除奇数文件_java,奇数性的问题
  16. Android 学习第10课,Android的布局
  17. 波特(Baud)与比特(bit)换算详解
  18. 科目二很难考吗?经验全在这里!
  19. 信息检索与利用(第三版)第六章 搜索引擎
  20. 现实中如何评判路遥《人生》中的高加林?

热门文章

  1. 一篇文章扫盲手机SIM卡相关知识
  2. 你的PC机或者终端,是怎么上网的?怎么连接到网络的?无线网怎么接入Internet,如何访问网络资源?
  3. 【java毕业设计】基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)——俄罗斯方块游戏
  4. aardio - 调用Python库下载蓝奏盘文件
  5. 基于最大熵Maxent-ArcGis地理分布预测教程
  6. SQL SERVER中的汉字转拼音-实现根据拼音搜索汉字
  7. Charles抓包工具使用介绍
  8. 中国人民大学与加拿大女王大学金融硕士宋会芝:只要开始就不晚
  9. 解决 configure.ac: error: possibly undefined macro: AC_PROG_LIBTOOL
  10. dq坐标系下无功功率表达式_基于瞬时电流分解的谐波电流检测方法研究