存储过程/函数:procedure/function
通俗说,存储过程是个模块化的程序段,完成一定功能,可被反复调用,可用于解决复杂的问题,减少程序冗余度。
这里的过程和函数就是C语言的方法/函数。过程一般不直接返回值,但可以通过实参和形参返回给主调程序计算结果;函数在SQLSERVER中,它都要返回一个值。(统一看,C语言中的返回void的函数在这里叫过程,有返回类型值的函数在这里叫函数)
程序的流程
变量的定义
Declare @变量名 类型[(宽度),类型…..]
为了区分系统内存变量(包括表的列名和系统环境参数)和用户自定义变量,要求用户自定义变量时前加@
符号。当打开一个表时,表的所有列名如学号,姓名是变量,控制系统内部的参数设置的量也是变量-----系统变量和列变量。
如要定义一个自定义变量保存杨春同学学号:
declare @xh nchar(10)
select @xh=学号 from 学生表 where 姓名='杨春'
print @xh
为什么要用@xh
,而不是xh
,因为表列名有可能是“xh
”,这是为了避免冲突误会。修改上面程序段,也正确:
declare @学号 nchar(10)
select @学号=学号 from 学生表 where 姓名='杨春'
print @学号
赋值
Set @变量名=值/表达式
Select @变量名=值/表达式 from 表…..
例:定义变量存放性别和姓氏,把这些变量代入查询语句并输出结果
declare @xs nchar(1),@xb nchar(1)
set @xs='李'
set @xb='男'
select * from 学生表 where left(姓名,1)=@xs and 性别=@xb
例:如果在C#/java中如何拼凑这个查询命令? 字符串和日期常量数据都要加单引号,数值型不加
String s=”select * from 学生表 where left(姓名,1)=’”+xs+”’ and 性别=’”+xb+”’ and 身高>”+sg;
利用上例的数据,S的结果:
”select * from 学生表 where left(姓名,1)=’李’ and 性别=’男’ and 身高>175”
分支结构
if else
格式:只能用在过程或函数中,不能嵌套到其它sql命令中。
If(条件)
Begin
成立时语句序列
End
Else
Begin
条件不成立时的语句序列
End
begin …end
,等效于C语句中{ }
; 当语句序列退化成一句时,这个begin…end
是可以省写的。
例:根据姓名(@xm
变量)查询此人101课程的成绩值,再根据本成绩值判断等级,[80,100]为优秀,[60,80)为合格,60以下为不合格.
declare @xm nchar(10),@cj int,@dj nchar(3)
set @xm='李大方'
select @cj=成绩 from 成绩表 where 课程号='101' and 学号=(select 学号 from 学生表 where 姓名=@xm)
if(@cj