好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第十章TSQL程序设计ppt课件.ppt

67页
  • 卖家[上传人]:pu****.1
  • 文档编号:589863761
  • 上传时间:2024-09-11
  • 文档格式:PPT
  • 文档大小:665KB
  • / 67 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第十章第十章 T-SQL T-SQL程序设计程序设计1 本章主题本章主题v将两个或更多的表联接起来以看到更多的结果信息v获取一种经过变量以暂时保管信息的方法v如何将行信息保管到非永久的表中v如何聚合值v组织输出数据到相关的信息分组中v前往独一和独特的值v错误处置:如何创建他本人的错误,捕捉错误,并让代码更平安 T-SQLT-SQL程序设计程序设计3 T-SQL T-SQL的目的在于为处置大量数据提供必要的构造化处置才的目的在于为处置大量数据提供必要的构造化处置才干前面的章节中曾经引见了一些处置简单查询的干前面的章节中曾经引见了一些处置简单查询的T-SQLT-SQL语句,但是语句,但是当面对更为复杂的运用时,前面所学的知识就远远不够了因此,当面对更为复杂的运用时,前面所学的知识就远远不够了因此,在本章中将主要讨论如何运用在本章中将主要讨论如何运用T-SQLT-SQL提供的丰富编程构造,编写出复提供的丰富编程构造,编写出复杂的例行程序杂的例行程序 第一节第一节 T-SQL T-SQL简介简介4 T-SQL T-SQL是是Microsoft SQL ServerMicrosoft SQL Server提供的查询言语,它是提供的查询言语,它是MicrosoftMicrosoft公司对于公司对于ANSI SQLANSI SQL的一个扩展,它不仅提供了对的一个扩展,它不仅提供了对SQLSQL规范的支持,另外还提规范的支持,另外还提供了类似于供了类似于C C等编程言语的根本功能。

      等编程言语的根本功能T-SQLT-SQL的目的在于为事务型数据库开的目的在于为事务型数据库开发提供一套过程化的开发工具发提供一套过程化的开发工具 T-SQL T-SQL对于运用对于运用SQL ServerSQL Server非常重要,它是非常重要,它是SQL ServerSQL Server功能的中心,运功能的中心,运用用T-SQLT-SQL编写程序可以完成一切的数据库管理任务,与编写程序可以完成一切的数据库管理任务,与SQL ServerSQL Server通讯的一通讯的一切程序都经过向数据库效力器发送切程序都经过向数据库效力器发送T-SQLT-SQL语句来进展通讯,而与运用程序的语句来进展通讯,而与运用程序的用户界面是什么方式无关用户界面是什么方式无关 第二节第二节 T-SQL T-SQL编程根底编程根底512345部分变量注释批处置全局变量运算符 ( (一一) ) 注释注释6 T-SQL T-SQL中的注中的注释语释语句,也称句,也称为为注解,注注解,注释释内容通常是一些内容通常是一些阐阐明性文明性文字,字,对对程序的构造及功能程序的构造及功能给给出出简简要的解要的解释释。

      注注释语释语句不是可句不是可执执行行语语句,不被句,不被系系统编译统编译,也不被程序,也不被程序执执行运用注行运用注释语释语句的目的是句的目的是为为了使程序代了使程序代码码易易读读易易分析,也便于日后的管理和分析,也便于日后的管理和维护维护 SQL Server SQL Server支持两种方式的程序注支持两种方式的程序注释语释语句:句:1 1..单单行注行注释语释语句:运用句:运用ANSIANSI规规范的注范的注释释符符 “-- “--〞,注〞,注释语释语句写在句写在“--“--〞的〞的后面,只能后面,只能书书写写单单行2 2.多行注.多行注释语释语句:运用与句:运用与C C言言语语一一样样的程序注的程序注释释符符“/* */“/* */〞,注〞,注释语释语句写句写在在“/*“/*〞和〞和“*/“*/〞之〞之间间,可以延,可以延续书续书写多行例例10-110-1:合法的注:合法的注释语释语句翻开翻开StudentStudent数据数据库库USE Student USE Student GO GO /*/*查询查询ClassesClasses表中一切表中一切记录记录的的Class_id, Class_nameClass_id, Class_name以及以及 Class_departmentClass_department三个字段的内容三个字段的内容*/*/ 7注释注释SELECT Class_id, Class_name, Class_department FROM Classes GO 当然,延续多行注释也可以运用注释符“--〞,只需每行注释开头都加上注释符“--〞。

      单行注释语句也可以运用注释符“/* */〞,只需将注释语句写在“/*〞和“*/〞之间例如上面的例子中注释语句也可以写成:/*翻开Student数据库*/USE StudentGO--本条SQL语句用来查询Classes表中一切记录的Class_id, Class_name, -- Class_department三个字段的内容SELECT Class_id, Class_name, Class_departmentFROM ClassesGO ( (二二) ) 批处置批处置8 所谓批是指从客户机传送到效力器上的一组完好数据和所谓批是指从客户机传送到效力器上的一组完好数据和SQLSQL指令,批指令,批中的一切中的一切SQLSQL语句做为一个整体编译成一个执行单元后从运用程序一次性地发语句做为一个整体编译成一个执行单元后从运用程序一次性地发送到送到SQL ServerSQL Server效力器进展执行,称之为批处置效力器进展执行,称之为批处置 一切的批处置命令都运用一切的批处置命令都运用GOGO作为终了标志,当作为终了标志,当T-SQLT-SQL的编译器扫描到某行的编译器扫描到某行的前两个字符是的前两个字符是GOGO的时候,它会把的时候,它会把GOGO前面的一切语句作为一个批处置送往效力前面的一切语句作为一个批处置送往效力器。

      器 由于批处置中的一切语句被当作是一个整体,因此假设其中一个语句出现由于批处置中的一切语句被当作是一个整体,因此假设其中一个语句出现了编译错误,那么该批处置内一切语句的执行都将被取消了编译错误,那么该批处置内一切语句的执行都将被取消例例10-210-2:正确的批处置正确的批处置第一个批处置翻开第一个批处置翻开StudentStudent数据库数据库USE Student USE Student GO GO ----第二个批处置在第二个批处置在TeachersTeachers表中查询姓王的教师的记录表中查询姓王的教师的记录SELECT * FROM Teachers SELECT * FROM Teachers WHERE SUBSTRING(Teacher_name,1,1)= 'WHERE SUBSTRING(Teacher_name,1,1)= '王王' 'GOGO ( (三三) ) 部分变量部分变量9 变量是量是执行程序中必不可少的部分,它主要是用来在程序运行程序中必不可少的部分,它主要是用来在程序运转过程中存程中存储和和传送数据。

      送数据变量其量其实就是内存中的一个存就是内存中的一个存储区域,存区域,存储在在这个区域中的数据就是个区域中的数据就是变量的量的值在T-SQLT-SQL语句中句中变量有两种,部分量有两种,部分变量与全局量与全局变量这两种两种变量在运用方法和量在运用方法和详细意意义上均不一上均不一样,本部分主要,本部分主要引引见部分部分变量 部分部分变量是作用域局限在一定范量是作用域局限在一定范围内的内的变量,是用量,是用户自定自定义的的变量普通来量普通来说,部分,部分变量的量的运用范运用范围局限于定局限于定义它的批它的批处置内定义它的批它的批处置中的置中的SQLSQL语句可以援用句可以援用这个部分个部分变量,直到量,直到批批处置置终了,了,这个部分个部分变量的生命周期也就量的生命周期也就终了了1 1.部分.部分变量的声明量的声明在运用一个部分在运用一个部分变量之前,必需先声明量之前,必需先声明该变量声明一个部分量声明一个部分变量的量的语法格式如下:法格式如下:DECLARE DECLARE 变量名量名 变量量类型型 [ [,,变量名量名 变量量类型型] …… ……] …… ……声明声明语句中的各部分句中的各部分阐明如下:明如下:部分部分变量名的命名必需遵照量名的命名必需遵照SQL ServerSQL Server的的标识符命名符命名规那么,并且必需以字符那么,并且必需以字符““〞开〞开头。

      部分部分变量的量的类型可以是系型可以是系统数据数据类型,也可以是用型,也可以是用户自定自定义的数据的数据类型DECLAREDECLARE语句可以声明一个或多个部分句可以声明一个或多个部分变量,量,变量被声明以后初量被声明以后初值都是都是NULLNULL 如如语句句DECLARE MyScore INTDECLARE MyScore INT声明了一个整型部分声明了一个整型部分变量量MyScore MyScore 也可以在同一也可以在同一语句中声句中声明多个部分明多个部分变量,例如:量,例如:DECLARE Student_Name VARCHAR(20), Student_Address VARCHAR (60)DECLARE Student_Name VARCHAR(20), Student_Address VARCHAR (60) 102.部分变量的赋值 部分变量被创建之后,系统将其初始值设为NULL假设要改动部分变量的值,可以运用SET语句或SELECT语句给部分变量重新赋值SELECT语句的语法格式为:SELECT 变量名 = 表达式 [,变量名 = 表达式] …… ……SET语句的语法格式为:SET 变量名 = 表达式赋值语句中的各部分阐明如下:变量名是预备为其赋值的部分变量。

      表达式是有效的SQL Server表达式,且其类型应与部分变量的数据类型相匹配从语法格式中可看出,SELECT语句和SET语句的区别在于运用SET语句一次只能给一个变量赋值,而在SELECT语句中可以一次给多个变量赋值部分变量部分变量 11部分变量部分变量例10-3:部分变量的赋值USE StudentGO--声明部分变量DECLARE sname VARCHAR(30), sclassid VARCHAR(30)--运用SET语句给部分变量赋值SET sname = '李佳佳'SET sclassid = '2019011'--根据部分变量的值查询符合条件的记录的姓名和性别SELECT Student_name,Student_sex, Student_classidFROM Students WHERE Student_name =sname OR Student_classid =sclassid--将Student_id为'11001'的记录的姓名和班级赋值给部分变量SELECT sname =Student_name, sclassid =Student_classidFROM Students WHERE Student_id='11001'--输出变量sname和sclassid的值SELECT sname AS sname, sclassid AS sclassidGO 12部分变量部分变量 本例主要完成了两个操作,一是根据部分变量的初值在本例主要完成了两个操作,一是根据部分变量的初值在StudentsStudents表中查询符合条件的记录,二是将指定记录的姓名及班级号表中查询符合条件的记录,二是将指定记录的姓名及班级号的值赋给部分变量,改动部分变量原来的值并输出其新值。

      程序的运的值赋给部分变量,改动部分变量原来的值并输出其新值程序的运转结果如图转结果如图10.110.1所示图10.1 例10-3执行结果 13部分变量部分变量3.部分变量的输出 例10-3中运用了SELECT语句来输出部分变量的值,除此之外部分变量的输出还可以运用PRINT语句PRINT语句的语法格式如下:PRINT 部分变量名 如例10-3中最后的输出语句SELECT sname AS sname, sclassid AS sclassid也可以改写成如下的两条PRINT语句:PRINT snamePRINT sclassid ( (四四) ) 全局变量全局变量14 全局全局变量是以量是以““〞开〞开头,由系,由系统预先定先定义并担任并担任维护的的变量,也可以把全局量,也可以把全局变量看成是量看成是一种特殊方式的函数全局一种特殊方式的函数全局变量不可以由用量不可以由用户随意建立和修正,作用范随意建立和修正,作用范围也并不局限于某个程也并不局限于某个程序,而是任何程序均可序,而是任何程序均可调用常用的全局用常用的全局变量有三十多个,通常用来存量有三十多个,通常用来存储一些一些SQL ServerSQL Server的配的配置置值和效能和效能统计数字,用数字,用户可以可以经过查询全局全局变量来量来检测系系统的参数的参数值或者或者执行行查询命令后的命令后的形状形状值。

      在全局在全局变量的运用量的运用过程中要留意,全局程中要留意,全局变量是由量是由SQL ServerSQL Server效力器定效力器定义的,不是用的,不是用户自定自定义的,用的,用户只能运用只能运用预先定先定义的全局的全局变量,且在援用全局量,且在援用全局变量量时,必需以,必需以““〞开〞开头另外,部分另外,部分变量的称号不能与全局量的称号不能与全局变量的称号一量的称号一样,否那么就会在运用程序中出,否那么就会在运用程序中出错表表10-110-1中列出了中列出了SQL ServerSQL Server的几个常用全局的几个常用全局变量及其含量及其含义,,对于其他全局于其他全局变量,量,读者可者可经过自自行行查阅SQL Server 2019SQL Server 2019联机机丛书进展学展学习全局变量名称全局变量含义CONNECTIONS返回 SQL Server 自上次启动以来所有针对此服务器的尝试的连接数,无论连接是成功还是失败ERROR返回执行的上一个 T-SQL 语句的错误号IDENTITY返回最后插入的标识列的列值NESTLEVEL返回对本地服务器上执行的当前存储过程的嵌套级别(初始值为 0)SERVERNAME返回运行SQL Server的本地服务器名称SPID返回当前用户进程的会话 IDVERSION返回当前SQL Server 的安装版本、处理器体系结构、生成日期和操作系统表10-1 SQL Server的常用全局变量 15全局变量全局变量例10-4:全局变量ERROR的运用。

      USE StudentGO--在Teachers表中插入一条新记录INSERT INTO Teachers (Teacher_id, Teacher_name ,Teacher_department) VALUES ('JS006', '张海涛', '002')--运用全局变量ERROR输出错误代码的值SELECT ERROR AS 错误GO图10.2例10-4执行结果 ( (五五) ) 运算符运算符16 运用运用T-SQLT-SQL来编写例行程序时,不可防止的要运用到运算符运算来编写例行程序时,不可防止的要运用到运算符运算符用来完成一个或多个表达式中指定的操作,符用来完成一个或多个表达式中指定的操作,SQL ServerSQL Server中的运算符包中的运算符包括有:算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、括有:算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、衔接运算符衔接运算符1 1.算术运算符.算术运算符算术运算符用来执行算术运算,算术运算符用来执行算术运算,T-SQLT-SQL中的算术运算符包括:中的算术运算符包括:+ +〔加法运算符〕〔加法运算符〕- -〔减法运算符〕〔减法运算符〕* *〔乘法运算符〕〔乘法运算符〕/ /〔除法运算符〕〔除法运算符〕% %〔模运算符或取余运算符,前往一个除法的整数余数,要求数据类型为〔模运算符或取余运算符,前往一个除法的整数余数,要求数据类型为INTINT、、SMALLINTSMALLINT和和TINYINTTINYINT〕〕 17运算符运算符例10-5:计算算术表达式的值。

      DECLARE Value NUMERICSET Value =132%7PRINT Value 程序的运转结果如图10.3所示2.赋值运算符 T-SQL中的赋值运算符只需一个,就是“=〞〔等号〕和其它言语中的赋值运算符一样,T-SQL中的赋值运算符的作用就是将数据值指派给特定的对象此外,也可以运用赋值运算符在列标题和列定义值的表达式之间建立关系图图10.3 10.3 例例10-510-5执行结执行结果果 18运算符运算符例10-6:查询经济信息系一切教师的信息,要求输出时的列标题为:教师号、教师姓名、教师所在系,且要求教师所在系名显示为“信息系〞USE StudentGOSELECT 教师号= Teachers.Teacher_id,教师姓名= Teachers.Teacher_name,教师所在系=SUBSTRING(Departments.Department_name,3,3) FROM Teachers INNER JOIN DepartmentsON Teachers.Teacher_department= Departments.Department_idWHERE Departments. Department_name ='经济信息系'GO图10.4例10-6执行结果 19运算符运算符3.比较运算符 比较运算符用于比较两个表达式的大小,T-SQL中的比较运算符包括:>〔大于〕、>=〔大于等于〕、<〔小于〕、<=〔小于等于〕、=〔等于〕、!=,<>〔不等于〕、!>〔不大于〕、!<〔不小于〕。

      比较运算符的运算结果是布尔数据类型,它有三种能够的结果:TRUE、FALSE以及UNKNOWN例10-7:查询Student_course表中成果的70%依然大于60分的学生学号和原来的成果USE StudentGOSELECT Student_id,Student_gradeFROM Student_courseWHERE Student_grade*0.7>60 ORDER BY Student_id ASCGO图10.5 例10-7执行结果 20运算符运算符4.逻辑运算符 逻辑运算符用来测试某些条件能否成立,T-SQL中的逻辑运算符包括:NOT〔非运算符〕AND〔与运算符〕OR〔或运算符〕 非运算符,用于表示对条件的否认与运算符用于衔接查询条件,只需AND两边的条件的值都为真时,其结果值才为真或运算符用于衔接查询条件,只需OR两边的条件中有一个为真,其结果值就为真 逻辑运算符和比较运算符一样,运算结果是布尔数据类型那些前往布尔数据类型的表达式称为布尔表达式,T-SQL中的布尔表达式有三种能够的值,分别是TRUE、FALSE以及UNKNOWN,其中UNKNOWN是由值为NULL的数据参与运算得到的结果。

      表10-2、表10-3、表10-4列出了进展各种逻辑运算时不同情况得到的结果 21运算符运算符NOT运算运算结果TRUEFALSEUNKNOWNUNKNOWNFALSETRUEAND运算TRUEUNKNOWNFALSETRUETRUEUNKNOWNFALSEUNKNOWNUNKNOWNUNKNOWNFALSEFALSEFALSEFALSEFALSEOR运算TRUEUNKNOWNFALSETRUETRUETRUETRUEUNKNOWNTRUEUNKNOWNUNKNOWNFALSETRUEUNKNOWNFALSE表10-2 NOT运算的各种结果表10-3 AND运算的各种结果表10-4 OR运算的各种结果 22运算符运算符例10-8:请查询出一切家庭所在地为山西的男同窗USE StudentGOSELECT Student_id, Student_name, Student_sex, Student_homeFROM Students WHERE Student_home= '山西' AND Student_sex='男'GO图10.6 例10-8执行结果 23运算符运算符5.位运算符位运算符用来对两个表达式进展位操作,位运算符的操作数允许是整型数据或者二进制数据〔但image数据类型除外〕。

      此外,位运算还要求两个操作数不能同时是二进制数据T-SQL中的位运算符包括:&〔按位与〕|〔按位或〕^〔按位异或〕~〔按位取反〕例10-9:计算位运算表达式的值SELECT 15&16 AS 按位与, 15|16 AS 按位或,15^16 AS 按位异或, ~15 AS 按位取反图10.7 例10-9执行结果 24运算符运算符6.衔接运算符 T-SQL中的衔接运算符“+〞用于衔接字符串或二进制数据串、列名或列的混合体,其本质就是将一个串参与到另一个串的尾部例10-10:在输出Classes表中班级称号时前面加上班级所在系别,如“经济信息系电子商务1班〞USE StudentGOSELECT Classes.Class_id,Departments.Department_name+Classes.Class_nameFROM Classes INNER JOIN Departments ON Classes. Class_department = Departments.Department_id GO图10.8 例10-10执行结果 25运算符运算符7.运算符的优先级T-SQL中的运算符的处置顺序如表10-5所示。

      优先级运算符含义1( )括号2~按位取反3*乘法运算符/除法运算符%模运算符4+加法运算符、连接运算符-减法运算符&按位与运算符5= > < >= <= <> != !> !<比较运算符6^按位或运算符|按位异或运算符7NOT逻辑非运算符8AND逻辑与运算符9OR逻辑或运算符10=赋值运算符表10-5 T-SQL运算符优先级 第三节第三节 函数函数26 为了让用户更方便的对数据库进展操作,为了让用户更方便的对数据库进展操作,SQL Server 2019SQL Server 2019在在T-SQLT-SQL中提中提供了许多内置函数函数其实就是一段程序代码,用户可以经过调用内置函数并供了许多内置函数函数其实就是一段程序代码,用户可以经过调用内置函数并为其提供所需的参数来执行一些特殊的运算或完成复杂的操作为其提供所需的参数来执行一些特殊的运算或完成复杂的操作T-SQLT-SQL提供的函提供的函数有系统函数、字符串函数、日期和时间函数、数学函数、转换函数等数有系统函数、字符串函数、日期和时间函数、数学函数、转换函数等转换函数系统函数用户自定义函数日期和时间函数数学函数字符串函数函数 ( (一一) ) 系统函数系统函数27 系统函数可以前往有关当前环境的信息,例如有关效力器、用系统函数可以前往有关当前环境的信息,例如有关效力器、用户、数据库对象的系统信息。

      常用的系统函数及其功能如表户、数据库对象的系统信息常用的系统函数及其功能如表10-610-6所示函数名参数函数功能COL_LENGTH( 'table' , 'column' )返回指定表的指定列的长度COL_NAME( table_id , column_id )返回指定表中指定字段(列)的名称DB_ID( [ 'database_name' ] )用于返回对应的数据库 ID DB_NAME( [ database_id ] )根据数据库ID返回数据库的名字HOST_ID ()返回服务器端计算机的ID号HOST_NAME()返回服务器端计算机的名称INDEX_COL('table',index_id,key_id )返回指定表上指定索引的列名OBJECT_ID ('object ')返回指定数据库对象的IDOBJECT_NAME ( object_id )根据数据库对象ID返回数据库对象的名称SUSER_SID ( [ 'login' ] )返回用户的登录标识号SUSER_NAME ( [ server_user_id ] )返回用户的登录标识名USER_ID ( [ 'user' ] )返回数据库用户的标识号表10-6 常用系统函数 28系统函数系统函数例10-11:系统函数的运用。

      SELECT 用户名=USER_NAME(),登陆名= SUSER_SID(),任务站名=HOST_NAME()该语句的运转结果如图10.9所示例10-12:运用系统函数查询指定表的第一列的长度USE StudentGODECLARE col_name VARCHAR(30)SELECT col_name=COL_NAME(OBJECT_ID('Students'),1)SELECT COL_LENGTH('Students', col_name) AS 第一列长度GO图10.9例10-11执行结果图10.10例10-12执行结果 ( (二二) ) 字符串函数字符串函数29 字符串函数主要是为了方便用户对二进制数据、字符串和表达式进字符串函数主要是为了方便用户对二进制数据、字符串和表达式进展操作常用的字符串函数及其功能如表展操作常用的字符串函数及其功能如表10-710-7所示函数名参数函数功能CHARINDEX(expression1,expression2[,start_location ] )从指定位置开始,在表达式2中查找表达式1,若找到则返回表达式1在表达式2中的开始位置LEFT(character_expression,integer_expression )返回字符串中从左边开始指定个数的字符LEN( string_expression )返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格LOWER( character_expression )把给定的字符串变成小写字母LTRIM( character_expression )返回删除了前导空格之后的字符表达式PATINDEX ('%pattern%',expression )返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零REPLACE('string_expression1','string_expression2' , 'string_expression3' )用第三个表达式替换第一个字符串表达式中出现的所有第二个指定字符串表达式的匹配项REPLICATE(char_exprssion,integer_exprssion)以指定的次数重复字符表达式RIGHT(character_expression,integer_expression )返回字符串中从右边开始指定个数的字符RTRIM( character_expression )去掉字符串后面的空格SUBSTRING(expression,start, length )返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分STUFF(character_expression1,start, length ,character_expression 2)将表达式1从开始位置删除指定长度的字符,并在指定的起点处插入表达式2UPPER( character_expression )把给定的字符串变成大写字母 30字符串函数例题字符串函数例题例10-13:在Students表中查询一切2019级学生的学号、姓名、性别、出生日期及所在班级号。

      USE StudentGOSELECT Student_id,Student_name,Student_sex,Student_birthday,Student_classidFROM StudentsWHERE SUBSTRING(Student_classid,1,4) ='2019'GO图10.11例10-13执行结果 31字符串函数例题字符串函数例题例10-14:在Users表中运用CHARINDEX()函数查询一切User_name中包含了字符串“ia〞的记录的User_idUSE StudentGOSELECT User_id,User_nameFROM UsersWHERE CHARINDEX('ia', User_name)<>0GO程序的运转结果如图10.12所示例10-15:在Users表中运用PATINDEX()函数查询一切User_name中包含了字符串“ia〞的记录的User_idUSE StudentGOSELECT User_id,User_nameFROM UsersWHERE PATINDEX ('%_ia_%', User_name)<>0GO程序的运转结果如图10.13所示。

      例10-14和例10-15可以反映PATINDEX()和CHARINDEX()的不同之处,虽然都是查找User_name中包含了字符串“ia〞的记录的User_id,但是PATINDEX()函数中包含了指定字符串的格式,所以查找的结果就不一样图图10.1210.12例例10-1410-14执行结执行结果果图图10.1310.13例例10-1510-15执行结执行结果果 ( (三三) ) 日期和时间函数日期和时间函数32 日期和时间函数用于对日期和时间数据进展运算和操作,其前往值为字符串、数日期和时间函数用于对日期和时间数据进展运算和操作,其前往值为字符串、数字值或日期和时间值常用的日期和时间函数及其功能如表字值或日期和时间值常用的日期和时间函数及其功能如表10-810-8所示 表表10-810-8中出现的参数中出现的参数datepart datepart ,是指定要前往的日期部分的参数下表列出了,是指定要前往的日期部分的参数下表列出了SQL SQL Server 2019 Server 2019 可识别的日期部分及其缩写可识别的日期部分及其缩写。

      表表10-910-9中的中的weekday (dw) weekday (dw) 日期部分前往星期几〔如星期日、星期一等〕日期部分前往星期几〔如星期日、星期一等〕 函数名函数名参数参数函数功能函数功能DATEADD(datepart , number, date )以datepart指定的方式,返回date加上number之和DATEDIFF(datepart,datel,date2)以datepart指定的方式,返回date2与datel之差DATENAME( datepart ,date )返回日期date中datepart指定部分所对应的字符串DAY(date)返回指定日期的day 部分的数值GETDATE( )以 datetime 值的 SQL Server 2019 标准内部格式返回当前系统日期和时间MONTH( date )返回指定日期的month 部分的数值YEAR( date )返回指定日期的year部分的数值日期部分日期部分 缩写缩写 日期部分日期部分 缩缩写写 yearyy, yyyyweekdaydwquarter, qhourhhmonthmm, mminutemi, ndayofyeardy, ysecondss, sdaydd, dmillisecondmsweekwk, ww 表10-8 常用日期时间函数表10-9 日期部分及缩写 33日期和时间函数例题日期和时间函数例题例10-16:前往系统时间。

      SELECT GETDATE() AS 系统时间该语句的运转结果如图10.14所示例10-17:运用DATEDIFF()函数查询Students表中一切学生的年龄USE StudentGOSELECT Student_name,Student_sex,DATEDIFF(year, Student_birthday, GETDATE()) AS Student_ageFROM StudentsGO程序的运转结果如图10.15所示图10.14例10-16执行结果图10.15 例10-17执行结果 ( (四四) ) 数学函数数学函数34 数学函数可以对数字型表达式进展数学运算,然后将结果或结果集前往给用数学函数可以对数字型表达式进展数学运算,然后将结果或结果集前往给用户可以在数学函数中运用的数据类型有户可以在数学函数中运用的数据类型有decimaldecimal、、integerinteger、、floatfloat、、realreal、、moneymoney、、smallnoneysmallnoney、、smallintsmallint和和tinyinttinyint。

      常用的数学函数及其功能如表常用的数学函数及其功能如表10-1010-10所示例例10-1810-18:运用:运用SIN()SIN()函数和函数和PI()PI()函数SELECT SIN(28.62) AS 'SIN(28.62)SELECT SIN(28.62) AS 'SIN(28.62)的值的值',',PI() AS 'PI()PI() AS 'PI()的值的值' ' 该语句的运转结果如图该语句的运转结果如图10.1610.16所示函数名函数名参数参数函数功能函数功能ABS( numeric_expression )返回指定数值表达式的绝对值EXP( float_expression )返回指定的 float 表达式的指数值LOG( float_expression )返回指定 float 表达式的自然对数PI ( )返回值为πPOWER( numeric_expression , y )返回指定表达式的指定幂的值ROUND(numeric_expression,length [ ,function ] )返回一个舍入到指定的长度或精度的数值表达式SIN ( float_expression )以近似数字 (float) 表达式返回指定角度(以弧度为单位)的三角正弦值SQRT( float_expression )返回指定表达式的平方根表10-10 常用数学函数图10.16 例10-18执行结果 ( (五五) ) 转换函数转换函数35 普通情况下,将数据从一种数据类型转换为另一种数据类型的任务是由普通情况下,将数据从一种数据类型转换为另一种数据类型的任务是由SQL ServerSQL Server自动完成自动完成的,这种转换称为隐性转换或自动转换。

      但也有的,这种转换称为隐性转换或自动转换但也有SQL ServerSQL Server无法自动完成的转换,这时可以运用转换无法自动完成的转换,这时可以运用转换函数进展显式的转换显式转换函数及其功能如表函数进展显式的转换显式转换函数及其功能如表10-1110-11所示 CAST() CAST()函数和函数和 CONVERT() CONVERT()函数都可以将一种数据类型的数据强迫的转换为另一种数据类型,但是函数都可以将一种数据类型的数据强迫的转换为另一种数据类型,但是两者也有差别两者也有差别CAST()CAST()函数不是运用逗号,而是运用函数不是运用逗号,而是运用ASAS来分隔两个参数而来分隔两个参数而CONVERT()CONVERT()函数的功能比函数的功能比CASTCAST()()函数更为细化,它可以按照参数函数更为细化,它可以按照参数stylestyle指定的格式将日期型数据转换成不同的款式,参数指定的格式将日期型数据转换成不同的款式,参数stylestyle可以可以运用的日期款式读者可自行查阅运用的日期款式读者可自行查阅SQL Server 2019SQL Server 2019联机丛书。

      联机丛书例例10-1910-19:查询:查询StudentsStudents表中表中6 6月出生的学生信息月出生的学生信息USE StudentUSE StudentGOGOSELECT Student_id,Student_name,Student_birthdaySELECT Student_id,Student_name,Student_birthdayFROM Students FROM Students WHERE CONVERT(char(30), Student_birthday,101) LIKE '06%'WHERE CONVERT(char(30), Student_birthday,101) LIKE '06%'GOGO程序的运转结果如图程序的运转结果如图10.1710.17所示函数名参数函数功能CAST(expression  AS  data_type)将一种数据类型的表达式显式转换为另一种数据类型的表达式CONVERT(data_type [( length ) ] , expression [ , style ] )将一种数据类型的表达式显式转换为另一种数据类型的表达式表表10-11 10-11 数据类型转换函数数据类型转换函数图图10.17 10.17 例例10-1910-19执行结果执行结果 ( (六六) ) 用户自定义函数用户自定义函数36 在在T-SQLT-SQL中,除了可以直接运用前面引中,除了可以直接运用前面引见的系的系统函数之外,函数之外,还允允许用用户编写本人的写本人的函数,以函数,以扩展展T-SQLT-SQL的的编程才干。

      用程才干用户自行自行编写的函数称之写的函数称之为用用户自定自定义函数,和系函数,和系统内置内置函数一函数一样,用,用户自定自定义函数中可以包含零个或多个参数,并前往相函数中可以包含零个或多个参数,并前往相应的数据1 1.用.用户自定自定义函数的函数的创建建 用用户可以运用可以运用CREATE FUNCTIONCREATE FUNCTION语句来句来创建自定建自定义函数,其函数,其语法格式如下:法格式如下:CREATE FUNCTION CREATE FUNCTION 函数名函数名〔方式参数称号〔方式参数称号 AS AS 数据数据类型,型,[ [方式参数称号方式参数称号 AS AS 数据数据类型型] ],,…………〕〕RETURNS RETURNS 前往数据前往数据类型型 AS ASBEGINBEGIN函数内容函数内容RETURN RETURN 表达式表达式ENDEND格式中各部分格式中各部分阐明如下:明如下: 函数名的定函数名的定义必需遵照必需遵照SQL ServerSQL Server的的标识符命名符命名规那么 RETURNS RETURNS子句指定自定子句指定自定义函数的前往数据函数的前往数据类型。

      根据前往数据型根据前往数据类型的不同用型的不同用户自定自定义函数函数可以分可以分为三三类::标量量值用用户自定自定义函数、内函数、内联表表值用用户自定自定义函数和多函数和多语句表句表值用用户自定自定义函数假设 RETURNS RETURNS 子句指定的是一种子句指定的是一种标量数据量数据类型,那么函数型,那么函数为标量量值函数,即函数,即标量量值用用户自定自定义函数的前往函数的前往值为单个数据个数据值假设 RETURNS RETURNS 子句指定子句指定 TABLE TABLE,那么函数,那么函数为内内联表表值用用户自定自定义函数或多函数或多语句表句表值用用户自定自定义函数 BEGIN..END BEGIN..END部分部分为函数体,函数体,标量量值用用户自定自定义函数和多函数和多语句表句表值用用户自定自定义函数的函数函数的函数体都被封装在以体都被封装在以BEGINBEGIN开开场,,ENDEND终了的范了的范围内,而直接表内,而直接表值用用户自定自定义函数没有明确的函数函数没有明确的函数体,只是一个体,只是一个单个的个的SELECTSELECT语句 37用户自定义函数用户自定义函数例10-20:编写一个标量值用户自定义函数,根据输入的半径计算圆的面积。

      CREATE FUNCTION Circle_Area(Radius AS DECIMAL(5,1))RETURNS DECIMAL(13,4) ASBEGINRETURN(PI()*Radius*Radius)ENDGO例10-21:编写一个内联表值用户自定义函数,根据输入的课程号,查询该课程的根本信息USE StudentGOCREATE FUNCTION Course_Information(CourseNumber AS char(4))RETURNS TABLE ASRETURN (SELECT * FROM Courses WHERE Course_id=CourseNumber) 38用户自定义函数用户自定义函数2.用户自定义函数的调用 可以运用SELECT语句或PRINT语句调用用户自定义函数其根本语法格式为:SELECT 用户名.函数称号〔实践参数表〕或PRINT 用户名.函数称号〔实践参数表〕 假设调用的是标量值用户自定义函数,一定要在函数称号的前面加上用户名,假设是表值型用户自定义函数,那么没有这个要求例10-22:调用自定义函数Circle_Area,求给定半径的圆面积。

      SELECT dbo.Circle_Area(1) AS 圆面积程序的运转结果如图10.18所示例10-23:调用自定义函数Course_Information,输出相应班级的信息USE StudentSELECT * FROM Course_Information('4001')程序的运转结果如图10.19所示图10.18 例10-22执行结果图10.19 例10-23执行结果 39用户自定义函数用户自定义函数3.用户自定义函数的修正和删除 用户自定义函数的修正运用的是ALTER FUNCTION语句,ALTER FUNCTION语句的其他部分语法格式与CREATE FUNCTION语句一样,在此不做赘述用户自定义函数的删除运用DROP FUNCTION语句,其语法格式如下:DROP FUNCTION [用户名.]函数名4.运用Microsoft SQL Server Management Studio创建用户自定义函数 除了按照上述方法在查询文档中运用代码来创建、修正和删除用户自定义函数,还可以运用Microsoft SQL Server Management Studio直接创建、修正和删除用户自定义函数,步骤如下:〔1〕翻开Microsoft SQL Server Management Studio。

      〔2〕翻开相应的数据库前的“+〞号,再翻开“可编程性〞前的“+〞号〔3〕右击【函数】,选择【新建】命令,如图10.20所示,即可创建不同类型的用户自定义函数〔4〕要修正或删除已有自定义函数,只需在相应类型的函数下找到要修正或删除的详细函数,如图10.21所示,运用右键快捷菜单项选择择相应命令即可 40用户自定义函数用户自定义函数图10.20 创建用户自定义函数图10.21 修正、删除用户自定义函数 第四节第四节 流程控制语句流程控制语句41RETURN语句BEGIN…END语句IF…ELSE语句CASE语句WHILE…CONTINUE…BREAK语句GOTO语句WAITFOR语句 SQL Server SQL Server支持构造化的支持构造化的编编程方法,构造化程方法,构造化编编程中程序流程控制的三大构造程中程序流程控制的三大构造是是顺顺序构造、序构造、选择选择构造、循构造、循环环构造T-SQLT-SQL言言语语提供了可以提供了可以实现这实现这三种构造的流程控制三种构造的流程控制语语句,运用句,运用这这些流程控制些流程控制语语句可以控制命令的句可以控制命令的执执行行顺顺序,以便更好的序,以便更好的组织组织程序。

      程序SQL SQL ServerServer中的流程控制中的流程控制语语句有句有BEGIN…ENDBEGIN…END、、IF…ELSEIF…ELSE、、WHILE…CONTINUE…BREAKWHILE…CONTINUE…BREAK、、GOTOGOTO、、WAITFORWAITFOR、、RETURNRETURN等 ( (一一) BEGIN…END) BEGIN…END语语句句42 BEGIN…END BEGIN…END语语句相当于其他言句相当于其他言语语中的复合中的复合语语句,如句,如C C言言语语中的中的{}{}它用于将多条它用于将多条T-SQLT-SQL语语句封装句封装为为一个整体的一个整体的语语句句块块,即将,即将BEGIN…ENDBEGIN…END内的一内的一切切T-SQLT-SQL语语句句视为视为一个一个单单元元执执行在实实践运用中,践运用中,BEGIN…ENDBEGIN…END语语句普通与句普通与IF..ELSEIF..ELSE、、WHILEWHILE等等语语句句联联用,当判用,当判别别条件符合需求条件符合需求执执行两个或者多个行两个或者多个语语句句时时,就需求运用,就需求运用BEGIN…ENDBEGIN…END语语句将句将这这些些语语句封装句封装为为一个一个语语句句块块。

      BEGIN...END BEGIN...END 语语句句块块允允许许嵌套BEGIN…ENDBEGIN…END语语句的根本句的根本语语法格式法格式为为::BEGINBEGINT-SQLT-SQL命令行命令行ENDEND ( (二二) IF…ELSE) IF…ELSE语语句句43 IF…ELSE IF…ELSE语语句是条件判句是条件判别语别语句,用以句,用以实现选择实现选择构造当IFIF后的条件后的条件成立成立时时就就执执行其后的行其后的T-SQLT-SQL语语句,条件不成立句,条件不成立时执时执行行ELSEELSE后的后的T-SQLT-SQL语语句其中,中,ELSEELSE子句是可子句是可选项选项,假,假设设没有没有ELSEELSE子句,当条件不成立那么子句,当条件不成立那么执执行行IFIF语语句句后的其他后的其他语语句IF…ELSEIF…ELSE语语句的句的语语法格式法格式为为::IF IF 条件表达式条件表达式程序程序块块[ELSE[ELSE程序程序块块] ]格式中各部分格式中各部分阐阐明如下:明如下: 条件表达式是作条件表达式是作为执为执行和判行和判别别条件的布条件的布尔尔表达式,前往表达式,前往 TRUE TRUE 或或 FALSE FALSE,,假假设设布布尔尔表达式中含有表达式中含有 SELECT SELECT 语语句,必需用句,必需用圆圆括号将括号将 SELECT SELECT 语语句括起来。

      句括起来 程序程序块块是一条是一条T-SQLT-SQL语语句或者是一个句或者是一个BEGIN…ENDBEGIN…END语语句句块块 IF..ELSE IF..ELSE语语句允句允许许嵌套运用,可以在嵌套运用,可以在IFIF之后或在之后或在 ELSE ELSE 下面,嵌套另一个下面,嵌套另一个 IFIF语语句,嵌套句,嵌套级级数的限制取决于可用内存数的限制取决于可用内存 44IF…ELSEIF…ELSE语语句例句例题题例10-24:在Student_course 表中查询课程“电子商务根底〞的平均成果,并输出相应的提示信息USE StudentGO/*假设学生平均成果大于70,输出“平均成果到达普通程度〞,否那么输出“平均成果有待提高〞*/IF (SELECT AVG (Student_grade) FROM Student_courseWHERE Course_id='1001')>70BEGINPRINT '电子商务根底的平均成果到达普通程度' SELECT AVG (Student_grade) AS 平均成果 FROM Student_courseWHERE Course_id='1001'ENDELSEBEGINPRINT '电子商务根底的平均成果还有待提高' SELECT AVG (Student_grade) AS 平均成果FROM Student_courseWHERE Course_id='1001'ENDGO图10.22 例10-24执行结果 ( (三三) CASE) CASE语句语句45 CASE CASE语语句和句和IF..ELSEIF..ELSE语语句一句一样样,也用来,也用来实现选择实现选择构造。

      但是它与构造但是它与IF..ELSEIF..ELSE语语句相比,句相比,可以更方便的可以更方便的实现实现多重多重选择选择的情况,从而可以防止多重的的情况,从而可以防止多重的IF..ELSEIF..ELSE语语句的嵌套,使得程序的构句的嵌套,使得程序的构造更加造更加简练简练、明晰T-SQLT-SQL中的中的CASECASE语语句可分句可分为简单为简单CASECASE语语句和搜索句和搜索CASECASE语语句两种1 1..简单简单CASECASE语语句句简单简单CASECASE语语句的句的语语法格式法格式为为::CASE CASE 表达式表达式WHEN WHEN 表达式表达式 THEN THEN 结结果表达式果表达式…… ………… ……[ELSE [ELSE 结结果表达式果表达式] ]ENDEND格式中各部分格式中各部分阐阐明如下:明如下: CASE CASE后的表达式用于和后的表达式用于和WHENWHEN后的表达式逐个后的表达式逐个进进展比展比较较,两者数据,两者数据类类型必需一型必需一样样,或必需,或必需是可以是可以进进展展隐隐式式转换转换的数据的数据类类型 …… …… …… ……表示可以有多个表示可以有多个“WHEN “WHEN 表达式表达式THEN THEN 结结果表达式〞构造。

      果表达式〞构造 THEN THEN后面后面给给出当出当CASECASE后的表达式后的表达式值值与与WHENWHEN后的表达式相等后的表达式相等时时,要前往的,要前往的结结果表达式果表达式 简单简单CASECASE语语句的句的执执行行过过程程为为:首先:首先计计算算CASECASE后面表达式的后面表达式的值值,然后按指定,然后按指定顺顺序序对对每个每个WHENWHEN子句后的表达式子句后的表达式进进展比展比较较,当遇到与,当遇到与CASECASE后表达式后表达式值值相等的,那么相等的,那么执执行行对应对应的的THENTHEN后的后的结结果表达式,并退出果表达式,并退出CASECASE构造假设设CASECASE后的表达式后的表达式值值与一切与一切WHENWHEN后的表达式均不相等,那么前后的表达式均不相等,那么前往往ELSEELSE后的后的结结果表达式假果表达式假设设CASECASE后的表达式后的表达式值值与一切与一切WHENWHEN后的表达式均不相等,且后的表达式均不相等,且“ELSE “ELSE 结结果表达式〞部分被省略,那么前往果表达式〞部分被省略,那么前往NULLNULL值值。

      46例10-25:查询Students表中一切男生的根本情况,输出学号、姓名、性别及班级称号 USE StudentGO --运用CASE语句将学生的班级号交换为班级称号SELECT 学号=Student_id, 姓名=Student_name , 性别=Student_sex,班级名= CASE Student_classidWHEN '2019011' THEN '电子商务1班' WHEN '2019012' THEN '电子商务2班' WHEN '2019013' THEN '电子商务3班'WHEN '2019014' THEN '会计1班'WHEN '2019015' THEN '会计2班'ENDFROM StudentsWHERE Student_sex ='男'ORDER BY Student_idGOCASECASE语句例题语句例题图10.23 例10-25执行结果 47CASECASE语句语句2.搜索CASE语句搜索CASE语句的语法格式为:CASEWHEN 条件表达式 THEN 结果表达式…… ……ELSE 结果表达式 END格式中各部分阐明如下: CASE后无表达式。

      WHEN后的条件表达式是作为执行和判别条件的布尔表达式 …… ……表示可以有多个“WHEN 条件表达式 THEN 结果表达式〞构造 搜索CASE语句的执行过程为:首先测试WHEN后的条件表达式,假设为真,那么执行THEN后的结果表达式,否那么进展下一个条件表达式的测试假设一切WHEN后的条件表达式都为假,那么执行ELSE后的结果表达式假设一切WHEN后的条件表达式都为假,且“ELSE 结果表达式〞部分被省略,那么前往NULL值 48CASECASE语句例题语句例题例10-26:根据Student_course表中的学生成果,判别学生成果能否到达优秀〔85分及以上为优秀〕USE StudentSELECT 学号= Student_id,成果= Student_grade,优秀否=CASE WHEN Student_grade >=85 THEN '优秀' WHEN Student_grade <85 THEN ' ' ENDFROM Student_course GO程序的运转结果如图10.24所示 从本例中可以看出搜索CASE语句和简单CASE语句的主要区别在于,搜索CASE语句中WHEN后的表达式允许是各种的比较操作或多种条件的测试,而简单CASE语句中WHEN后的表达式只能用来和CASE后的表达式值进展相等的比较。

      图10.24 例10-26执行结果 ( (四四) WHILE…CONTINUE…BREAK) WHILE…CONTINUE…BREAK语语句句49 WHILE…CONTINUE…BREAK WHILE…CONTINUE…BREAK语语句用以句用以实现实现循循环环构造,其功能是在构造,其功能是在满满足条件的情况下会足条件的情况下会反复反复执执行行T-SQLT-SQL语语句或句或语语句句块块当WHILEWHILE后面的条件后面的条件为为真真时时,就反复,就反复执执行行BEGIN…ENDBEGIN…END之之间间的的语语句句块块WHILEWHILE语语句中的句中的CONTINUECONTINUE和和BREAKBREAK可以是可可以是可选项选项假设设有有CONTINUECONTINUE语语句,其功能是使程句,其功能是使程序跳出本次循序跳出本次循环环,开,开场执场执行下一次循行下一次循环环而执执行到行到BREAKBREAK语语句句时时,会立刻,会立刻终终止循止循环环,,终终了整了整个个WHILEWHILE语语句的句的执执行,并行,并继续执继续执行行WHILEWHILE语语句后的其他句后的其他语语句。

      句WHILE…CONTINUE…BREAKWHILE…CONTINUE…BREAK语语句的句的语语法格式法格式为为::WHILE WHILE 条件表达式条件表达式BEGINBEGIN程序程序块块[BREAK][BREAK]程序程序块块[CONTINUE][CONTINUE]程序程序块块 END END格式中各部分格式中各部分阐阐明如下:明如下: 条件表达式是作条件表达式是作为执为执行和判行和判别别条件的布条件的布尔尔表达式,前往表达式,前往 TRUE TRUE 或或 FALSE FALSE,假,假设设布布尔尔表达式表达式中含有中含有 SELECT SELECT 语语句,必需用句,必需用圆圆括号将括号将 SELECT SELECT 语语句括起来句括起来 程序程序块块是一条是一条T-SQLT-SQL语语句或者是一个句或者是一个BEGIN…ENDBEGIN…END语语句句块块 50例10-27:在查询到Student_course表中没有学生成果超越95分的情况下,将一切成果提高3%,反复执行,直到存在成果超越95分的情况下,退出循环USE StudentGOWHILE NOT EXISTS (SELECT Student_grade FROM Student_courseWHERE Student_grade >95)BEGINUPDATE Student_courseSET Student_grade= Student_grade*1.03IF (SELECT MAX(Student_grade) FROM Student_course)>95 BREAKELSE CONTINUE ENDSELECT Student_id, Student_grade FROM Student_courseGO程序的运转结果如图10.25所示。

      WHILE…CONTINUE…BREAKWHILE…CONTINUE…BREAK语语句例句例题题图10.25 例10-27执行结果 ( (五五) GOTO) GOTO语句语句51 GOTO GOTO语句用来改动程序的执行流程,使程序无条件跳转到指定的标签处语句用来改动程序的执行流程,使程序无条件跳转到指定的标签处继续执行继续执行GOTOGOTO语句可以出如今条件控制流语句、语句块或过程中,但它不能跳语句可以出如今条件控制流语句、语句块或过程中,但它不能跳转到该批以外的标签转到该批以外的标签GOTOGOTO语句的语法格式为:语句的语法格式为:GOTO GOTO 标签标签GOTOGOTO语句中的跳转目的的标签定义格式为:语句中的跳转目的的标签定义格式为:标签:标签:定义标签时,需求在标签的名字后面加上一个冒号定义标签时,需求在标签的名字后面加上一个冒号例例10-2810-28:求出:求出1~1001~100之中一切的偶数之和之中一切的偶数之和DECLARE Sum int,i intDECLARE Sum int,i intSET i = 0SET i = 0SET Sum = 0SET Sum = 0Label_1:Label_1:SET i=i+2SET i=i+2SET Sum =Sum +iSET Sum =Sum +iIF i <100 IF i <100 GOTO Label_1GOTO Label_1PRINT '1~100PRINT '1~100之中一切的偶数之和是:之中一切的偶数之和是:' +cast(Sum as varchar(50))' +cast(Sum as varchar(50))程序的运转结果如图程序的运转结果如图10.2610.26所示。

      所示图10.26 例10-28执行结果 ( (六六) WAITFOR) WAITFOR语句语句52 WAITFOR WAITFOR语句用于在到达指定时间或时间间隔之前,阻止执行批处置、语句用于在到达指定时间或时间间隔之前,阻止执行批处置、存储过程或事务,直到所设定的时间已到或等待了指定的时间间隔之后才继续存储过程或事务,直到所设定的时间已到或等待了指定的时间间隔之后才继续往下运转往下运转WAITFORWAITFOR语句的语法格式为:语句的语法格式为:WAITFOR DELAY 'WAITFOR DELAY '等待时间等待时间' | TIME '' | TIME '完成时间完成时间' ' 格式中各部分阐明如下:格式中各部分阐明如下: DELAY ' DELAY '等待时间等待时间' '是指定可以继续执行批处置、存储过程或事务之前必是指定可以继续执行批处置、存储过程或事务之前必需经过的指定时段,最长可为需经过的指定时段,最长可为24 24 小时可运用小时可运用 datetime datetime 数据可接受的格式数据可接受的格式之一指定之一指定' '等待时间等待时间' ',也可以将其指定为部分变量,但不能指定日期,因此不,也可以将其指定为部分变量,但不能指定日期,因此不允许指定允许指定 datetime datetime 值的日期部分。

      值的日期部分 TIME ' TIME '完成时间完成时间' '是指定运转批处置、存储过程或事务的详细时辰可是指定运转批处置、存储过程或事务的详细时辰可以运用以运用 datetime datetime 数据可接受的格式之一指定数据可接受的格式之一指定' '完成时间完成时间' ',也可以将其指定为,也可以将其指定为部分变量,但不能指定日期,因此不允许指定部分变量,但不能指定日期,因此不允许指定 datetime datetime 值的日期部分值的日期部分 53WAITFORWAITFOR语句例题语句例题例10-29:在晚上 10:20 (22:20) 执行存储过程 sp_update_jobUSE msdbEXECUTE sp_add_job job_name = 'TestJob'BEGINWAITFOR TIME '22:20'EXECUTE sp_update_job job_name = 'TestJob',new_name = 'UpdatedJob'ENDGO例10-30:先查询Students表中男生姓名,等待5秒后再查询男生姓名和出生日期 USE StudentGOSELECT Student_name FROM StudentsWHERE Student_sex ='男'GO--设置等待时间为5秒钟WAITFOR DELAY '00:00:05'SELECT Student_name, Student_birthday FROM StudentsWHERE Student_sex ='男'GO程序的运转结果如图10.27所示。

      运转程序时先出现男同窗姓名的查询结果,5秒钟后才出现下方的姓名和出生日期图10.27 例10-30执行结果 ( (七七) RETURN) RETURN语句语句54 RETURN RETURN语句用来从批处置、查询或存储过程中无条件退出,语句用来从批处置、查询或存储过程中无条件退出,RETURNRETURN的的执行是即时且完全的,可在任何时候用于从过程、批处置或语句块中退出位于执行是即时且完全的,可在任何时候用于从过程、批处置或语句块中退出位于RETURNRETURN语句之后的语句将不会被执行语句之后的语句将不会被执行RETURNRETURN语句的语法格式为:语句的语法格式为:RETURN [RETURN [整型表达式整型表达式] ] 运用运用RETURNRETURN语句可以前往一个整数值,普通情况下,只需存储过程〔存储过语句可以前往一个整数值,普通情况下,只需存储过程〔存储过程将在下一章中进展引见〕才会向执行调用的过程或运用程序前往一个整数值,程将在下一章中进展引见〕才会向执行调用的过程或运用程序前往一个整数值,可将可将RETURNRETURN的前往值作为程序能否胜利执行的判别标志。

      在的前往值作为程序能否胜利执行的判别标志在SQL ServerSQL Server中除非中除非另有阐明,一切系统存储过程前往另有阐明,一切系统存储过程前往0 0值,即表示调用胜利,而非零值那么表示调值,即表示调用胜利,而非零值那么表示调用失败 第五节第五节 游标游标55一.游标简介 数据库中执行的大多数SQL命令,都是用来处置行的集合的,即是针对集合内一切数据的处置但是在某些情况下,用户也需求运用代码来逐行的处置数据,为此SQL提供了可以逐行遍历记录行集合的游标 游标的本质是一种能从包括多数据记录的结果集中每次提取一条记录的机制因此,游标总是与一条SELECT语句相关联,它可以定位于SELECT结果集中的某一指定行,从而实现对该行的操作从这个角度上讲,数据库的游标是一种类似于C言语中指针的言语构造 游标在运用时首先根据SELECT语句创建结果集,然后一次从中获取一行数据游标的生命周期包含以下5个阶段:声明游标翻开游标运用游标,从游标中提取信息封锁游标释放游标 运用游标运用游标56 前面曾前面曾经提出了游提出了游标有有5 5种根本操作,即声明游种根本操作,即声明游标、翻开游、翻开游标、运用游、运用游标、、封封锁游游标和和释放游放游标,下面就来分,下面就来分别讨论一下一下这5 5种根本操作的种根本操作的详细实现。

      1 1.声明游.声明游标运用游运用游标前首先要声明游前首先要声明游标,声明游,声明游标时会会为游游标指定指定获取数据取数据时所运用的所运用的SELECTSELECT语句声明游句声明游标的的语法格式如下:法格式如下:DECLARE DECLARE 游游标名名 [INSENSITIVE] [SCROLL] CURSOR [INSENSITIVE] [SCROLL] CURSORFOR SELECT FOR SELECT 语句句[FOR READ ONLY | UPDATE [OF [FOR READ ONLY | UPDATE [OF 列名列名1 1,列名,列名2 2,列名,列名3……]]3……]]格式中各部分格式中各部分阐明如下:明如下: 游游标名的命名必需遵守名的命名必需遵守T-SQLT-SQL的的标识符命名符命名规那么 运用运用INSENSITIVEINSENSITIVE选项定定义的游的游标,会,会创建将由建将由该游游标运用的数据的运用的数据的暂时副本也就是也就是说,,该游游标运用的运用的结果集将被复制到果集将被复制到暂时数据数据库tempdbtempdb中构成一个中构成一个暂时表,表,对游游标的一切的一切恳求都从求都从 tempdb tempdb 中的中的这一一暂时表中得到表中得到应对;因此,在;因此,在对该游游标进展提取操作展提取操作时前往的数据中不反映前往的数据中不反映对根底表所做的修正,并且根底表所做的修正,并且该游游标不允不允许修正。

      修正假假设省略省略 INSENSITIVE INSENSITIVE,那么已提交的,那么已提交的对根底表的根底表的删除和更新都反映在后面的提取除和更新都反映在后面的提取中 SCROLL SCROLL选项指定一切的提取指定一切的提取选项〔〔FIRSTFIRST、、LASTLAST、、PRIORPRIOR、、NEXTNEXT、、RELATIVERELATIVE、、ABSOLUTEABSOLUTE〕均可用假〕均可用假设未指定未指定 SCROLL SCROLL,那么,那么 NEXT NEXT 是独一支持的提取是独一支持的提取选项 57运用游标运用游标各提取选项含义〔详细含义见FETCH语句阐明部分〕:FIRST:提取第一行数据;LAST:提取最后一行数据;PRIOR:提取前一行数据;NEXT:提取后一行数据;RELATIVE:按相对位置提取数据;ABSOLUTE:按绝对位置提取数据 SELECT语句是指定义游标结果集的规范SELECT 查询语句在声明游标的SELECT语句内不允许运用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO,该SELECT 查询语句所查询的表称为游标的根底表。

      READ ONLY选项表示制止经过该游标进展更新,即所声明的游标为只读在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能援用游标 UPDATE [OF 列名1,列名2,列名3……]用来定义在所声明的游标中可以更新的列假设指定了[OF 列名1,列名2,列名3……],那么只允许修正列出的列假设指定了 UPDATE,但未指定列的列表,那么可以更新一切列 58运用游标运用游标2.翻开游标 在运用游标读取数据之前,必需求翻开游标游标翻开,检索数据并填充游标,然后才可以运用游标翻开游标的语法格式如下:OPEN 游标名格式中各部分阐明如下: 游标名必需是一个曾经声明过的游标名 当执行OPEN语句时,翻开T-SQL 效力器游标,然后经过执行在 DECLARE CURSOR语句中指定的SELECT语句填充游标假设运用 INSENSITIVE 选项声明了游标,那么 OPEN将在 tempdb 中创建一个暂时表以保管结果集的副本3.运用游标提取数据 创建并翻开了一个游标之后,就可以从游标中获取数据了读取游标中某一行数据的语法格式如下:FETCH           [ [ NEXT | PRIOR | FIRST | LAST                    | ABSOLUTE { n | 变量名 }                    | RELATIVE { n | 变量名 } ]               FROM ]游标名[ INTO 变量名1,变量名2,…… ] 59运用游标运用游标格式中各部分阐明如下: NEXT选项表示前往结果集中当前行的下一行记录,并且当前行递增为前往行。

      假设 FETCH NEXT为对游标的第一次提取操作,那么前往结果集中的第一行而不是第二行NEXT 为默许的游标提取选项 PRIOR选项表示前往结果集中当前行的前一行记录,并且将当前行递减为前往行假设 FETCH PRIOR为对游标的第一次提取操作,那么没有行前往并且游标置于第一行之前 FIRST选项表示前往结果集中的第一行并将其作为当前行 LAST选项表示前往结果集中的最后一行并将其作为当前行 ABSOLUTE { n | 变量名}选项中, 变量为一部分变量假设 n 或变量为正数,那么前往从游标头开场的第 n 行,并将前往行变成新的当前行假设 n 或变量为负数,那么前往从游标末尾开场的第 n 行,并将前往行变成新的当前行假设 n 或 变量为 0,那么不前往行n 必需是整数常量,并且变量的数据类型必需为 smallint、tinyint 或 int RELATIVE { n |变量名}选项中,变量为一部分变量 假设 n 或变量为正数,那么前往从当前行开场的第 n 行,并将前往行变成新的当前行假设 n 或变量为负数,那么前往当前行之前第 n 行,并将前往行变成新的当前行假设 n 或变量为 0,那么前往当前行。

      在对游标完成第一次提取时,假设在将 n 或变量设置为负数或 0 的情况下指定 FETCH RELATIVE,那么不前往行n 必需是整数常量,变量的数据类型必需为 smallint、tinyint 或 int [ INTO 变量名1,变量名2,…… ] 选项表示允许将提取操作的列数据放到部分变量中列表中的各个变量从左到右与游标结果集中的相应列相关联各变量的数据类型必需与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换变量的数目必需与游标选择列表中的列数一致 60运用游标运用游标4.封锁游标 在游标运用终了之后,必需封锁游标游标封锁之后,SELECT语句依然保管,还可以运用OPEN命令再次翻开游标封锁游标的语法格式如下:CLOSE 游标名5.释放游标 封锁游标的操作并不会释放游标所占用的系统资源,所以为了回收游标占用的资源该当释放游标,释放相关内存释放游标的语法格式如下:DEALLOCATE 游标名6.游标运用举例 了解了游标的5种根本操作之后,下面经过实例来阐明游标的根本操作在实践中的运用例10-31: 运用游标将一切提取出的数据存放在变量中,并将其输出。

      USE StudentGO--定义存放提取出的数据的变量DECLARE S_id varchar(10),S_name varchar(30)--声明游标DECLARE Student_cur SCROLL CURSOR FOR SELECT Student_id, Student_name FROM StudentsWHERE Student_sex='女'ORDER BY Student_id--翻开游标OPEN Student_cur--第一次提取数据FETCH NEXT FROM Student_curINTO S_id, S_name--运用WHILE循环提取数据,上一次执行FETCH命令之后游标的形状作为循环条件 61运用游标运用游标WHILE FETCH_STATUS = 0BEGINPRINT '学号:'+S_id+' '+ '姓名:'+S_nameFETCH NEXT FROM Student_curINTO S_id, S_nameEND--封锁游标CLOSE Student_cur--释放游标DEALLOCATE Student_curGO程序的运转结果如图10.28所示。

      本例运用了全局变量FETCH_STATUS来构成循环条件全局变量FETCH_STATUS可以前往在最近一次执行FETCH命令之后游标的形状对于操作游标时的流程控制来说,FETCH_STATUS可以用来测试能否到达了结果集的尾部全局变量FETCH_STATUS的前往值如下表所示: 实践上,从游标提取数据的操作通常是和WHILE循环严密结合在一同的将全局变量FETCH_STATUS与WHILE命令配合来运用,可以很容易的实现对游标中的行的遍历操作返回值说明0FETCH 语句成功-1FETCH 语句失败或行不在结果集中-2提取的行不存在图10.28例10-31执行结果 第六节第六节 事务事务62 事事务是由一系列操作是由一系列操作组成的一个成的一个逻辑任任务单元这个个逻辑单元中的一切操元中的一切操作作作作为一个整体要么全部完成,要么全部失一个整体要么全部完成,要么全部失败也就是说,假,假设这些操作些操作执行的行的过程中出程中出现了了错误,那么效力器会取消整个事,那么效力器会取消整个事务所所执行的一切操作,将数据行的一切操作,将数据库恢复到恢复到操作未操作未进展前的形状,展前的形状,这种数据种数据库的恢复机制称之的恢复机制称之为回回滚。

      事事务的回的回滚可以保可以保证数数据的一致性据的一致性事事务处置涉及到的置涉及到的语句有以下四个:句有以下四个:1 1.启.启动事事务BEGIN TRANSACTION  [transaction_name]BEGIN TRANSACTION  [transaction_name]2 2..设置保管点置保管点SAVE TRANSACTION [savepoint_name]SAVE TRANSACTION [savepoint_name]3 3.回.回滚事事务ROLLBACK TRANSACTION  [transaction_name | savepoint_name]ROLLBACK TRANSACTION  [transaction_name | savepoint_name]4 4..终了事了事务COMMIT TRANSACTION [transaction_name] COMMIT TRANSACTION [transaction_name] 上述四个命令中的上述四个命令中的transaction_nametransaction_name为事事务的称号,的称号,savepoint_namesavepoint_name为保管点保管点的称号。

      事的称号事务的一系列操作被封装在的一系列操作被封装在BEGIN TRANSACTIONBEGIN TRANSACTION和和COMMIT TRANSACTIONCOMMIT TRANSACTION之之间,,错误发生生时运用运用ROLLBACK TRANSACTIONROLLBACK TRANSACTION回回滚事事务假设事事务中中设置有保管点,置有保管点,可以只回可以只回滚到保管点,即保管点到回到保管点,即保管点到回滚语句之句之间的操作被取消,其他操作依然有效的操作被取消,其他操作依然有效否那么,就会回否那么,就会回滚整个事整个事务,即回,即回滚到到BEGIN TRANSACTIONBEGIN TRANSACTION处 事务事务63例10-32:更新Departments表中记录启动事务BEGIN TRAN update_tranUSE StudentGO--更新Departments表中符合条件记录UPDATE Departments SET Department_name='信息管理系'WHERE Department_id ='001'GO--设置保管点SAVE TRAN update1--再次更新已更新过的记录UPDATE Departments SET Department_name='信息系'WHERE Department_id ='001'GO--回滚事务到保管点 ROLLBACK TRAN  update1--终了事务 COMMIT TRAN  GOSELECT * FROM DepartmentsGO 从更新的结果中可以看出,由于程序执行了事务的回滚,因此第二次更新操作被取消,只完成了第一次的更新操作,即将Departments表中Department_id 为“001〞的记录的Department_name更新为“信息管理系〞。

      图10.29 例10-32执行结果 第七节第七节 实训:实训: T-SQL T-SQL程序设计上机指程序设计上机指点点641.实训义务 编写一个T-SQL程序,用于查询经济信息系教师所教授的课程称号和班级称号2.实训指点 该程序涉及到多表的衔接查询,需求设置表与表之间的查询衔接条件3.实现步骤:〔1〕新建查询〔2〕在查询窗口输入该T-SQL程序的代码:USE StudentGOSELECT t.Teacher_name,c.Course_name,l.Class_nameFROM Teachers t INNER JOIN Teacher_course tcON t.Teacher_id=tc.Teacher_id INNER JOIN Courses cON tc.Course_id=c.Course_id INNER JOIN Classes lON tc.Class_id=l.Class_idWHERE t.Teacher_department= (SELECT Department_idFROM DepartmentsWHERE Department_name='经济信息系' )GO〔3〕选择菜单【查询】|【执行】或单击常用工具栏中的 按钮或者运用快捷键F5,执行该T-SQL程序,即可得到运转结果。

      执行结果如图10.30所示图图10.30 10.30 实训例题执行结实训例题执行结果果 本章小结本章小结65 本章引见了本章引见了T-SQLT-SQL的编程根底、常用函数、的编程根底、常用函数、T-SQLT-SQL中的流程控制语中的流程控制语句以及游标的运用方法,并经过实例引见了所涉及到的知识点的详细运用句以及游标的运用方法,并经过实例引见了所涉及到的知识点的详细运用方式经过对本章的学习,读者该当对方式经过对本章的学习,读者该当对T-SQLT-SQL的编程构造有很好的掌握,的编程构造有很好的掌握,可以利用本章所讲解的编程元素控制程序的流程,从而编写出适用的可以利用本章所讲解的编程元素控制程序的流程,从而编写出适用的T-T-SQLSQL程序 习习 题题66实际题1.什么是批处置?2.部分变量和全局变量有哪些区别?3.T-SQL的流程控制语句有哪些?功能是什么?4.什么是游标?游标的运用过程是怎样的?操作题1.编写用户自定义函数,求输入数字的平方值2.编写T-SQL程序,在Student数据库的Student_course表中查询学生的考试情况,并根据考试分数判别输出考试等级“A〞、“B〞、“C〞、“D〞、“E〞。

      90分以上为“A〞,80-89分为“B〞,70-79分为“C〞,60-69分为“D〞,60分以下为“E〞3.编写T-SQL程序,运用游标将Student数据库的Teachers表的一切数据逐一取出 本章终了本章终了67 。

      点击阅读更多内容
      相关文档
      2025国开山东开大《土质学与土力学》形成性考核123答案+终结性考核答案.docx 中学综合素质知识点梳理【中学教师资格证】.docx 2025国开山东开大《特许经营概论》形成性考核123答案+终结性考核答案.doc 2025年高考英语全国一卷真题(含答案).docx 2025国开山东《农民专业合作社创建与管理》形成性考核123答案+终结性考核答案.docx 2025国开山东开大《自然现象探秘》形成性考核123答案+终结性考核答案.docx 2025国开山东《消费心理学》形成性考核123答案+终结性考核答案.doc 2025国开山东《小微企业管理》形成性考核123答案+终结性考核答案.doc 2025国开山东开大《资本经营》形成性考核123答案+终结性考试答案.docx 2025国开山东《小学生心理健康教育》形考123答案+终结性考试答案.docx 2025国开《视频策划与制作》形考任务1-4答案.docx 2025国开《亲子关系与亲子沟通》形考任务234答案+期末大作业答案.docx 2025国开电大《煤矿地质》形成性考核123答案.docx 2025国开电大《冶金原理》形考任务1234答案.docx 2025国开《在线学习项目运营与管理》形考任务1234答案.doc 2025国开电大《在线教育的理论与实践》阶段测验1-4答案.docx 2024 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 环保工程师---2023 年注册环保工程师《专业基础考试》真题及答案解析【完整版】.docx 2025国开《液压与气压传动》形考任务一参考答案.docx 2025年春江苏开放大学教育研究方法060616计分:形成性作业2、3答案.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.