3T_SQL编程与高级查询
第3章 T-SQL编程与高级查询
3.1 T-SQL分类语句
1、声明变量。T-SQL语句中可以使用两种类型的变量,局部变量和全局变量。
2、数据定义语言(Data Definition Language,DDL),用来建立数据库及数据库对象,绝大部分以create开头,如:create table等。
3、数据控制语言(Data Control Language,DCL),用来控制数据库组件的存取许可、权限等命令。
4、数据操作语言(Data Manipulation Language,DML),用来操作数据库中数据的命令,如:select、update等。
5、流程控制语言(Flow Control Language,FCL),用于控制应用程序流程的语句,如:if、case等。
3.2 T-SQL中的注释
1、嵌入行内的注释语句
使用两个连字符“--”创建嵌入行内的注释语句,该符号将注释语句与语句分开。
2、块注释语句
“/*....*/”
3.3 T-SQL中的批处理
批处理语句示例:
insert into cardInfo values('023-001','123456',50,'2009-06-06 12:00:00') select * from cardInfo go --go语句作为批处理语句的结束标志,当编译器读取到go语句时,会把go语句前的所有语句当作一个批处理,并将这些语句打包发送个服务器。 insert into cardInfo values('023-001','123456',50,'2009-06-06 12:00:00') insert into cardInfo values('023-002','123456') insert into cardInfo values('023-003','123456',65,'2009-06-06 12:30:30') go
3.4 变量
3.4.1 局部变量
1、声明T-sql局部变量
声明局部变量的语法如下:
declare {@变量名 数据类型 [,...n]}
declare @name nvarchar(20),@age int,@address nvarchar(50)--声明多个局部变量
declare语句默认会将变量的值初始化为null。
2、为T-sql局部变量赋值
set语句为局部变量赋值语法:
set@变量名=值
语法中的“值”可以是一个常量、任何有效的表达式、一个返回单值的查询语句等。
例:
/*声明三个局部变量:@name、@row_count、year*/ declare @name nvarchar(20),@row_count int,@year int /*使用set语句为局部变量赋值*/ --将一个常量赋值给@name set @name='张三' --将查询语句返回的值赋给@year set @year=YEAR(getdate()) --@row_count变量自增1 set @row_count=@row_count+1 select语句为局部变量赋值语法: select @变量名=值 例: --声明一个局部变量@cardId,用于存储临时的CardId declare @cardId int --查询cardInfo表,并未局部变量赋值 select @cardId=CardId from cardInfo where CardNumber='023-002' --查询CardId为@cardId的会员卡在本网吧的本月(6月)上网记录 select * from recordInfo where DATEDIFF(month,EndTime,GETDATE())=0 and CardId=@cardId go
3、局部变量的作用域
变量的作用域就是可以引用该变量的T-sql语句的范围。变量的作用域从声明变量的地方开始到 声明变量的批处理或存储过程的结尾。
下面是局部变量的作用域错误代码示例:
declare @money int set @money=50 go select * from cardInfo where CardBlanace<@money go
4、局部变量的应用
1.作为计算器计算循环执行的次数或控制循环执行的次数。
2.保存数据值以控制流语句测试
3.保存存储过程返回的数据值或函数返回值
3.4.2 全局变量
1.全局变量不是由用户的程序定义的,它们是在服务器级定义的
2.用户只能使用预先定义的全局变量
3.引用全局变量时,必须以标记符“@@”开头
示例代码:
select * from cardInfo go select @@rowcount as '受影响的行数' go
3.5 输出语句
print语句的语法:
print {字符串|变量|函数|字符串表达式}
例:
print'SQL server版本' print'-----------------------------' print @@version print '服务器当前时间:'+convert(varchar,getdate())'' go
使用select语句输出:
select @@version as 'SQL server版本',getdate()'当前时间'
go
3.6 T-SQL的流程控制
3.6.1 if-else语句
语法形式:
if(条件表达式)
语句或语句块
else
语句或语句块
若要定义语句块,则要使用控制流关键字begin和end,begin和end相当于C语言中的大括号“{}”。
if(条件表达式)
begin
...语句
end
else
begin
...语句
end
if-else语句可以嵌套使用,且嵌套层数没有限制。
3.6.2 case语句
1、简单case语句
语法格式:
case 测试表达式
when 表达式 then 结果表达式1
[...n]
[else 结果表达式n]
end
示例:
select PCId as '编号', case PCUse when 0 then '空闲' when 1 then '正在使用' else end as '状态',PCNote as '备注' from PCInfo go
2、搜索case格式
语法格式:
case
when 布尔表达式 then 结果表达式1
[...n]
[else 结果表达式n]
end
示例:
create table score ( sno varchar(10) not null primary key, --学号 sname varchar(20)not null, --姓名 smark float --成绩 ) go
T-Sql实现代码如下:
select sno as'学号',sname as '姓名', case when smark>=90 then '优秀' when smark>=80 then '良好' when smark>=80 then '中等' when smark>=80 then '及格' when smark>=80 then '不及格' else'成绩等级' from score go
搜索case格式中,各结果表达式的数据类型必须相同或能进行隐式转换。
3.6.3 while语句
while语句通过布尔表达式来设置一个条件,当这个条件成立时,重复执行一个语句或语句块,重复执行的部分成为循环体。T-SQL中的while循环和C语言中的循环相似。在while循环中,可以使用break和continue关键字在循环内控制while循环中语句执行。
语法:
while 布尔表达式 {语句或语句块} [break] {语句或语句块} [continue] {语句或语句块}
定义语句块时,也需要使用begin和end将语句括起来
3.7子查询
(1)使用比较运算符(=、<>、>、>=、<、!>、!<或<=)的子查询,使用这些运算符的子查询必须返回单个值。
(2)IN 和 NOT IN子查询:可以返回多个值
select * from cardInfo where cardid in(
select cardid from recordInfo where begintime<'2009-06-17' and endtime>'2009-06-16') go
(3)EXISTS 和 NOT EXISTS子查询
select * from recordInfo where exists( select * from cardInfo where cardid=recordInfo.cardid and cardnumber='023-002') go
①子查询出现在form关键字后
子查询出现在form关键字之后通常是将子查询的结果作为一张虚拟表,有点类似于视图
例如,我们将cardInfo和recordInfo的内容查询出一张虚拟的表:
select CardNumber,CardPassword,CardBalance,TransactTime,PCId, BegainTime,EndTime,Fee from recordInfo r inner join cardInfo c on c.CardId=r.CardId
②子查询出现在select关键字后
出现在select关键字后的子查询,一般将其查询结果看作一个列.