逻辑语句与子查询
变量的分类
局部变量:(仅在过程中使用)
- 局部变量必须以标记@作为前缀,如@age。局部变量的使用也是先声明(使用declare),再赋值。
全局变量:(任何时候均可以使用)
- 全局变量必须以标记@@作为前缀,如@@version。全局变量由系统定义和维护,我们只能读取,不能修改全局变量值。
局部变量定义与赋值(定义参数)
局部变量的定义语法
DECLARE @变量名 数据类型
赋值方法
- SET @变量名=值
- SELECT @变量名=值
使用Select赋值确保筛选出的记录只有1条
问题:编写T-SQL查询李铭及其学号相邻的学员?
局部变量的使用
代码编写:
示例:
1 use StudentManageDB 2 go 3 --声明学号变量 4 declare @stuid int,@stuname varchar(20) 5 6 --查询李铭的信息 7 set @stuname='李铭' 8 select StudentId,StudentName,Gender,StudentIdNo from Students 9 where StudentName=@stuname 10 11 --查询李铭的学号 12 select @stuId=StudentId from Students where StudentName=@stuname 13 14 --查询与李铭学号相邻的学员 15 select StudentId,StudentName,Gender,StudentIdNo from Students 16 where StudentId=(@stuId+1) or StudentId=(@stuId-1)
set与select比较
示例:
1 declare @stuAddress nvarchar(100) , @stuName nvarchar(100) 2 --set @stuAddress='天津', @stuName='张三' --不允许这样赋值 3 select @stuaddress='天津', @stuName='王小虎' --允许 4 5 --set @stuAddress = (select StudentAddress from Students) --不允许 6 select @stuAddress = StudentAddress from Students --得到最后一个 7 set @stuAddress = (select StudentAddress from Students where 1<0) --NULL值 8 select @stuAddress = StudentAddress from Students where 1<0 --保持原值
全局变量示例
全局变量都使用两个@标志作为前缀
变量 | 含义 |
@@ERROR | 最后一个T-SAQL错误的错误号 |
@@IDENTITY | 最后一次插入的标识值 |
@@LANGUAGE | 当前使用的语言的名称 |
@@MAX_CONNECTIONS | 可以创建的同时连接的最大数目 |
@@ROWCOUNT | 受上一个SQL语句影响的行数 |
@@SERVERNAME | 本地服务器的名称 |
@@TRANSCOUNT | 当前连接打开的事务数 |
@@VERSIONSQL | Server的版本信息 |
1 PRINT '服务器的名称: ' + @@SERVERNAME 2 PRINT 'SQL Server的版本' + @@VERSION 3 4 SELECT @@SERVERNAME AS '服务器名称' 5 SELECT @@VERSION AS 'SQL Server的版本'
1 use StudentManageDB 2 go 3 --插入学员信息 4 insert into Students (StudentName,Gender,Age,Birthday,StudentIdNo,PhoneNumber,StudentAddress,ClassId) 5 values('王小欣','男',28,'1988-08-07',120223198808071111,'022-22222222','天津市南开区',10) 6 7 8 --获取最后一条SQL语句的执行错误号 9 print @@error
T-SQL数据类型转换
常用的两种转换方法
- CONVERT(数据类型,表达式,样式)第三个参数可以省略,它一般用于日期类型数据转换为字符类型,或浮点类型数据转换为字符类型,不同的样式使转换后字符数据的显示格式不同
- CAST(表达式AS数据类型)
CONVERT()与CAST()的不同点是:可以指定转换的样式
1 use StudentManageDB 2 go 3 --定义变量并查询 4 declare @sumScore int 5 select @sumScore=(CSharp+SQLServerDB) from ScoreList 6 where StudentId=100003 7 --输出 8 --print '学号=100003总成绩:'+@sumScore 9 10 print '学号=100003总成绩:'+convert(varchar(20),@sumScore)
两种不同类型的转换比较
1 use StudentManageDB 2 go 3 --使用CAST转换 4 select StudentName + '的出生日期是:' + CAST(Birthday as varchar(50)) AS '学生信息' 5 from Students where StudentId=100005 6 --使用CONVERT转换 7 select StudentName + '的出生日期是:' + CONVERT(varchar(50),Birthday,102) AS '学生信息' 8 from Students where StudentId=100005
T-SQL中的其他函数
问题:查询学号等于100002的学员年龄?
1 use StudentManageDB 2 go 3 --定义变量 4 declare @birthday datetime,@days int,@age int 5 --查询出生日期 6 select @birthday=Birthday from Students where StudentId=100002 7 --计算出生天数 8 set @days=datediff(dayofyear,@birthday,getdate()) 9 --计算年龄 10 set @age=floor(@days/365) 11 --输出信息 12 print '100002学员年龄:'+convert(varchar(20),@age) 13 14 --直接查询 15 select FLOOR(DATEDIFF(dy, Birthday, GETDATE())/365) 年龄 16 from Students where StudentId=100002
逻辑控制语句
分支结构
- IF-ELSE语句
- CASE-END语句
循环结构
- WHILE语句
IF-ELSE语句示例
1 use StudentManageDB 2 go 3 --查询成绩 4 declare @cAvg int 5 select @cAvg=avg(CSharp) from ScoreList 6 inner join Students on ScoreList.StudentId=Students.StudentId where ClassId=1 7 print 'C#平均成绩:'+convert(varchar(20),@cAvg) 8 --判断成绩 9 if(@cAvg>=80) 10 print '软件一班成绩优秀!' 11 else 12 print '软件一班成绩一般!'
WHILE语句示例
问题:将所有C#成绩不及格的学员加分到60
1 use StudentManageDB 2 go 3 print '加分之前的C#成绩:' 4 select StudentId,CSharp from ScoreList 5 declare @CSharp int,@StuId int 6 while(1=1) 7 begin 8 select top 1 @CSharp=CSharp,@StuId=StudentId 9 from ScoreList where CSharp<60 10 if (@CSharp<60) 11 update ScoreList set CSharp=CSharp+1 12 where StudentId=@StuId 13 if((select count(*) from ScoreList where CSharp<60)=0) 14 break 15 end 16 print '加分之后的C#成绩:' 17 select StudentId,CSharp from ScoreList
CASE-END语句示例
- ELSE表示CASE中所有WHEN条件均不为TRUE时返回的结果
- 如果省略ELSE且WHEN条件都为FALSE时,CASE语句返回NULL
问题:学员成绩进行评比,90以上为A;80-89为B;70-79为C;60-69:为D;60以下为:不及格
1 use StudentManageDB 2 go 3 select 学号=StudentId, 4 总评=CASE 5 when (CSharp+SQLServerDB)/2>=90 then 'A' 6 when (CSharp+SQLServerDB)/2 between 80 and 89 then 'B' 7 when (CSharp+SQLServerDB)/2 between 70 and 79 then 'C' 8 when (CSharp+SQLServerDB)/2 between 60 and 69 then 'D' 9 else '不及格' 10 end 11 from ScoreList
EXISTS子查询
回顾:如何用SQL语句检测数据库或数据表是否已经创建?
语法规范
IF EXISTS(子查询)
语句
用法总结果
- 子查询的结果非空,即记录条数1条以上,则EXISTS(子查询)将返回真(true),否则返回假(false)。
- EXISTS也可以作为WHERE语句的子查询,但一般都能用IN子查询替换。
END