T-SQL编程

  金牌会员 | 2025-1-16 05:49:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

目录
1、T-SQL的元素
1.1 标识符
1. 通例标识符
2. 分隔标识符
1.2 变量
1. 全局变量
2. 局部变量
1.3 运算符
1. 算数运算符
2. 赋值运算符
3. 位运算符
4. 比较运算符
5. 逻辑运算符
6. 字符勾通接运算符
7. 一元运算符
8. 运算符的优先级和联合性
1.4 批处理
1.5 注释
2、流程控制语句
2.1 BEGIN…AND
2.2 IF…ELSE
2.3 CASE
2.4 WHILE…CONTINUE…BREAK
2.5 RETURN
2.6 RAISERROR
3、函数
3.1 体系内置函数
3.2 用户自定义函数
1. 标量值函数
2. 内联表值函数
3. 多语句表值函数
4、游标
4.1 游标的概述
4.2 游标的类型
1. 只进游标
2. 静态游标
3. 键集游标
4. 动态游标
4.3 游标的使用
1. 声明游标
2. 打开游标
3. 提取数据
4. 关闭游标
5. 释放游标
4.4 定位修改游标
4.5 定位删除游标


T-SQL的语法约定
数据库的概念和操作-CSDN博客
1、T-SQL的元素

1.1 标识符

1. 通例标识符

1. 必须以汉字字母下划线_@#开头后续字符可以是数字汉字字母下划线_@#组合
2. 不能是SQL Server 的关键字
3. 不能凌驾128个字符。
2. 分隔标识符

需要使用分隔标识符的情况:放在方括号[ ]双引号" "
1. 标识符的命名不符合通例标识符格式的规则。
2. 使用关键字作为对象名对象名的一部分
1.2 变量

1. 全局变量

体系提供预先声明,全局变量名由“@@”符号开始
用户只能使用全局变量,不能举行修改
作用域整个SQL Server 体系,任何程序都可以随时调用它们。
2. 局部变量

一样寻常在批处理(go),过程(procedure)中可见。
定义(DECLARE):局部变量名由“@”符号开始。一定要先定义再使用。
  1. DECLARE {@local_variable data_type}[,...n]
复制代码
赋值(SET|SELECT):
  1. -- 只能对单个变量赋值
  2. SET {@local_variable = expression}
  3. --可对多个变量赋值
  4. SELECT {@local_variable = expression}[,...n]
复制代码
输出(PRINT|SELECT):
  1. -- 只能单个字符串|局部变量|字符串表达式
  2. PRINT {msg_str|@local_variable|string_expr}
  3. -- 可以多个局部变量的值
  4. SELECT {@local_variable}[,...n]
复制代码
局部变量的作用域:批处理(go),过程(procedure)中。
例:
  1. DECLARE @myvar char(20),@i  int
  2. SET @myvar = 'This is a test'
  3. SET @i=20
  4. SELECT @myvar  as  a ,@i  as  b
  5. GO
复制代码

1.3 运算符

1. 算数运算符

加(+),减(-),乘(*),除(/),取模(%)。
留意:取模(%),只能是inttinyintsmallint
2. 赋值运算符

T-SQL中只有一个赋值运算符,即等号(=)。
3. 位运算符

按位与(&),按位或(|),按位异或(^)。
留意:两个数据可以是整型数据二进制数据,但不能同时是二进制数据
4. 比较运算符

=><>=<=<>(!=)。
运算结果为逻辑值:TRUE,FALSE,UNKNOWN(当NULL参与时)。
5. 逻辑运算符

返回值为TRUE或FALSE或UNKNOWN(当NULL参与时)。
ALL:假如一组的比较都为TRUE,那么就为,TRUE。
AND:假如两个布尔表达式都为TRUE,那么就,为 TRUE。
ANY:假如一组的比较中任何一个为TRUE,那,么就为TRUE。
BETWEEN:假如操作数在某个范围之内,那么就为,TRUE。
EXISTS:假如子查询包罗一些行,那么就为TRUE。
IN:假如操作数便是表达式列表中的一个,那么就为TRUE。
LIKE:假如操作数与一种模式相匹配,那么就为,TRUE。
NOT:对任何其他布尔运算符的值取反。
OR:假如两个布尔表达式中的一个为TRUE,那么就为TRUE。
SOME:假如在一组比较中,有些为TRUE,那么就为TRUE。
6. 字符勾通接运算符

+
7. 一元运算符

+”,正,“-”,负,“~”,按位取反(只能是整数数据类型)。
8. 运算符的优先级和联合性

级别运算符 1
~(按位取反)2*(乘)、/(除)、%(取模)3+(正)、-(负)、+(加)、+(串联)、-(减)、&(位与)、^(位异或)、|(位或)4=、>、<、>=、<=、<>(!=)、!>、!<5NOT6AND7 ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
8=(赋值) 1.4 批处理

批处理是包罗一个或多个T-SQL语句集合,从应用程序一次性地发送到SQL Server2014举行实行,一次可以节省体系开销。SQL Server将批处理的语句编译为一个可实行单元,称之为实行计划,批处理的结束符为“GO”。
编译错误(如:语法错误)可使实行计划无法编译。因此未实行批处理中的任何语句
运行时错误(如:算术溢出或违反束缚)会产生以下两种影响之一:
1. 大多数运行时错误,将制止实行批处理中,当前语句及背面的语句
2. 某些运行时错误(如:违反束缚)仅制止实行当前语句,而继承实行批处理中的其他语句
1.5 注释

--” 或 “/*……*/
2、流程控制语句

2.1 BEGIN…AND

  1. BEGIN
  2. {sql_statement|statement_block}
  3. END
复制代码
sql_statement|statement_block:T-SQL语句|语句块。
BEGIN…END主要用于下列情况
WHILECASEIF…ELSE
BEGIN…END可以嵌套
2.2 IF…ELSE

  1. IF Boolean_expression
  2. {sql_statement|statement_block}
  3. [ELSE {sql_statement|statement_block}]
复制代码
IF…ELSE语句可以嵌套。 
假如Boolean_expression中有SELECT语句,要加()
例:假如,学号“20160211”的学生选修的,课程号为“0101”的课程成绩>=90,“成绩精良”,否则“成绩一样寻常”。
  1. USE teaching
  2. GO
  3. IF ( SELECT score FROM  sc  WHERE sno='20160211'  and cno=’0101’) >=90
  4.   PRINT '成绩优秀'
  5. ELSE
  6.   PRINT '成绩一般'
复制代码
2.3 CASE

简单CASE格式:(CASE背面)某个表达式与(WHEN背面)一组简单表达式或常量举行比较,以确定结果。
搜索CASE格式:计算(WHEN背面)一组布尔表达式,以确定结果。
例:查询全部学生的测验等级,包括学号,课程号,成绩等级(精良,精良,中等,合格,不合格)
简单CASE: 整数/整数 = 整数
  1. use teaching
  2. select sno as 学号,cno as 课程号,
  3. CASE score/10
  4. when 10 then '优秀'
  5. when 9 then '优秀'
  6. when 8 then '良好'
  7. when 7 then '中等'
  8. when 6 then '及格'
  9. else '不及格'
  10. END
  11. from sc
复制代码
搜索CASE(保举):
  1. use teaching
  2. select 学号=sno,课程号=cno,成绩等级=
  3. CASE
  4. when score>=90 then '优秀'
  5. when score>=80 then '良好'
  6. when score>=70 then '中等'
  7. when score>=60 then '及格'
  8. else '不及格'
  9. END
  10. from sc
复制代码
2.4 WHILE…CONTINUE…BREAK

  1. WHILE Boolean_expressionession
  2. [BEGIN]
  3. sql_statement|statement_block [BREAK|CONTINUE]
  4. [END]
复制代码
 例:求1到100的累加,并输出。
  1. DECLARE @i int,@sum int
  2. SELECT @i = 1,@sum = 0
  3. WHILE @i <= 100
  4.   BEGIN
  5.     SET @sum = @sum+@i
  6.     SET @i = @i+1
  7.   END
  8. SELECT @sum as 'sum',@i as 'i'
复制代码

2.5 RETURN

可以从查询或过程中无条件退出。
2.6 RAISERROR

RAISERROR:将错误信息显示在屏幕上,同时也可以记录在NT日记中。
  1. RAISERROR{{msg_id|msg_str},severity,state}
复制代码
msg_id|msg_str:错误信息。
severity:错误的严峻级别。
state:发生错误时的状态信息。
如:
  1. RAISERROR('NO !',16,1)
复制代码
3、函数

3.1 体系内置函数

聚合函数,数学函数,日期和时间函数,字符串函数。
强制类型转换函数
CAST( expression AS data_type[(length)] )
如:把int类型的@age强制转换为char(2)类型
  1. CAST(@age as char(2))
复制代码
CONVERT(data_type[(length),expression[,style])
3.2 用户自定义函数

1. 标量值函数

一样寻常需要declare变量
  1. CREATE FUNCTION [schema_name.]function_name
  2. ([{@parameter_name parameter_data_type [= default_expression]}[,...n]])
  3. RETURNS return_data_type
  4. [AS] -- 一般不省略
  5.   BEGIN
  6.     function_body
  7.         RETURN expression
  8.   END
  9. GO
复制代码
留意:调用标量值函数,需要指定架构名默认dbo
 例:创建一个标量值函数,接受学号,返回该学号的平均成绩。
  1. use teaching
  2. go
  3. create function avgscore(@sno char(8))
  4. returns tinyint
  5. as
  6. begin
  7.   declare @avgscore tinyint
  8.   select @avgscore=avg(score)
  9.   from sc
  10.   where sno = @sno
  11.   return @avgscore
  12. end
  13. go
  14. -- 调用标量值函数,需要指定架构名,默认为dbo
  15. select dbo.avgscore('20160211') as '平均成绩'
复制代码
2. 内联表值函数

一样寻常不需要declare变量
  1. CREATE FUNCTION [schema_name.]function_name
  2. ([{@parameter_name parameter_data_type [= default_expression]}[,...n]])
  3. RETURNS TABLE
  4. [AS] -- 一般不省略
  5. RETURN(select_statement)
复制代码
留意:内联表值函数返回的是。 
例1:创建一个内联表值函数,查询各个专业的专业名称及学生人数的。
  1. use teaching
  2. go
  3. create function ZY_RS() -- ()不能省略
  4. returns table
  5. as
  6. return(
  7. select specialty,count(*) as '学生人数'
  8. from student
  9. group by specialty)
  10. go
  11. select * from ZY_RS()  -- 返回的是一个表,所以from
复制代码
例2:创建一个内联表值函数,接受课程号,返回该课程号的选修信息,不传课程号,就返回全部课程号的选修信息。
  1. use teaching
  2. go
  3. create function XK
  4. (@cno varchar(4) = '%') -- 如果是char(4),实际上是'%'+3个空格
  5. returns table
  6. as
  7. return(
  8. select * from sc where cno like @cno)
  9. go
  10. select * from XK('0101') -- 特定课程号的选修信息
  11. select * from XK(default) -- 全部选修信息
复制代码
3. 多语句表值函数

可以自定义返回表结构
  1. CREATE FUNCTION [schema_name.]function_name
  2. ([{@parameter_name parameter_data_type [= default_expression]}[,...n]])
  3. RETURNS @return_variable TABLE<table_definition>
  4. [AS] -- 一般不省略
  5. BEGIN
  6.   function_body
  7.   RETURN
  8. END
复制代码
例:创建一个多语句表值函数,查询选修特定课程名的学号,姓名,课程号,课程名,成绩
  1. use teaching
  2. go
  3. create function KCM_XK(@cname varchar(32))
  4. -- 返回的表名必须是局部变量名的形式(@)
  5. returns @xk table(学号 char(8),姓名 varchar(10),
  6. 课程号 char(4),课程名 varchar(32),成绩 tinyint)
  7. as
  8. begin
  9.   insert into @xk
  10.   select s.sno,s.sname,sc.cno,c.cname,sc.score -- 对应好表中的列
  11.   from sc inner join student as s on sc.sno = s.sno -- 不需要逗号
  12.   inner join course as c on sc.cno = c.cno
  13.   where c.cname = @cname
  14.   return
  15. end
  16. go
  17. select * from KCM_XK('C语言')
复制代码
4、游标

4.1 游标的概述

游标是处理数据的一种方式,它答应应用程序每一次处理一行或一部分行
游标可以看作一个指针,可以指定结果中的任何位置
4.2 游标的类型

1. 只进游标

FORWARD_ONLY,即只进游标只能第一行滚动到末了一行
2. 静态游标

STATIC静态游标打开时创建一个数据快照,该快照不会随着后续数据库的修改而改变
静态游标是在数据快照上举行操作。
3. 键集游标

KEYSET键集游标在打开时,会固定结果集成员身份和顺序。这意味着,当游标打开后,纵然底层数据表中的数据发生厘革,游标所指向的行集也不会改变(除非这些行的键被更改)。然而,与静态游标差别的是,假如结果集中的行由于键的更改而被删除或更新,这些更改在键集游标中可见的。
4. 动态游标

DYNAMIC动态游标与静态游标相对,反映结果集中所做的全部更改
4.3 游标的使用

1. 声明游标

  1. DECLARE cursor_name CURSOR
  2.     [LOCAL | GLOBAL] -- 局部|全局
  3.     [FORWARD_ONLY | SCROLL] -- 只进|滚动
  4.     [STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
  5.     [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
  6.     FOR select_statement
  7.     [FOR UPDATE [OF column_name [,...n]]] -- 通过游标进行修改
复制代码
2. 打开游标

  1. OPEN {{[GLOBAL] cursor_name}|cursor_variable_name}
复制代码
3. 提取数据

  1. -- 下一行|上一行|第一行|最后一行
  2. FETCH [[NEXT|PRIOR|FIRST|LAST|
  3. ABSOLUTE {n|@nvar}|RELATIVE {n|@nvar}]FROM] -- 指定第几行|相对当前行的第几行
  4. {{[GLOBAL] cursor_name}|cursor_variable_name}
  5. [INTO @variable_name [,...n]] -- 提取到变量中
复制代码
4. 关闭游标

  1. CLOSE {{[GLOBAL] cursor_name}|cursor_variable_name}
复制代码
5. 释放游标

  1. DEALLOCATE {{[GLOBAL] cursor_name}|cursor_variable_name}
复制代码
4.4 定位修改游标

例:声明一个游标,用以更新第五个女生的年龄信息。
  1. USE teaching
  2. DECLARE S_Cur1 SCROLL CURSOR
  3. FOR
  4. SELECT * FROM student WHERE ssex='女'
  5. FOR UPDATE
  6. GO
  7. OPEN S_Cur1
  8. GO
  9. FETCH  ABSOLUTE  5  FROM  S_Cur1
  10. GO
  11. UPDATE student SET Sage=20
  12. WHERE CURRENT OF S_Cur1 -- CURRENT OF,修改当前游标所指定的行
  13. GO
  14. CLOSE S_Cur1
  15. GO
  16. DEALLOCATE  S_Cur1
复制代码
留意:
(1)定位修改一次只能更新当前游标位置确定的一行OPEN语句将游标位置定位在结果集第一行前,可以使用FETCH语句把游标位置定位在要被更新的数据行处。
(2)举行定位修改所使用的游标必须声明为FOR UPDATE 方式。举行定位修改数据表中的行不移动游标位置。被更新的行可以再次被修改,直到下一个FETCH语句的实行。
(3)定位修改可以更新多数据表或被毗连的多表,但只能更新此中一个表的行,即全部被更新的列都来自同一个表。
4.5 定位删除游标

例:声明一个游标,用以删除末了一个女生记录。
  1. USE teaching
  2. DECLARE S_Cur2  SCROLL  CURSOR
  3. FOR
  4. SELECT * FROM student WHERE ssex='女'
  5. FOR UPDATE
  6. GO
  7. OPEN S_Cur2
  8. GO
  9. FETCH  LAST  FROM  S_Cur2
  10. GO
  11. DELETE  student
  12. WHERE CURRENT OF S_Cur2 -- CURRENT OF,删除当前游标所指定的行
  13. GO
  14. CLOSE S_Cur2
  15. GO
  16. DEALLOCATE  S_Cur2
复制代码
留意:
(1)举行定位删除时,一次只能删除当前游标位置确定的一行删除后游标位置向前移动一行OPEN语句将游标位置定位在结果集第一行前,可以使用FETCH语句把游标位置定位在要被删除的行处。
(2)举行定位删除所使用的游标必须声明为FOR UPDATE 方式。而且声明游标的SELECT语句不能含有毗连操作或涉及多表。否则,纵然声明中指明了FOR UPDATE 方式,也不能删除此中的行。
(3)对使用游标删除行的数据表要求有一个唯一索引

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表