declare @name nvarchar(50),@age int
print @name;
print @age;
print '----------------';
set @name='Jack'
set @age=18
print @name;
print @age;
print '----------------';
--结果显示:
----------------
Jack
18
----------------
可以看到在没有赋值前,他输出的是NULL。使用set关键字对变量的赋值一次只能赋值一个,那么怎么对多个变量进行赋值?这时可以使用select关键字
declare @name nvarchar(50),@age int
select @name='Jack',@age=18
print @name;
print @age;
print '----------------';
我们也可以在查询语句里面对这个变量进行赋值例如: select @name=sName from student where sid=1;
SQL Server有30多个全局系统变量,但有几个是常用到的,如下SQL语句
select @@VERSION --查看版本号
select @@IDENTITY; --返回最后插入的标识值--例如
USE MySchool
create table ideTest
(
id int identity(1,1) primary key,
idename nvarchar(50),
)
insert into ideTest(idename) values('test1');
insert into ideTest(idename) values('test2');
insert into ideTest(idename) values('test3');
insert into ideTest(idename) values('test4');
insert into ideTest(idename) values('test5');
insert into ideTest(idename) values('test6') select @@IDENTITY;
select @@error --返回错误编号,当上一条SQL语句的错误,我猜想当他的值大于时候,表示有错误。没有错误那么用表示
select @@LANGUAGE; --返回版本的语言
select @@SERVERNAME --返回服务器的名称
select @@ROWCOUNT --返回上一个语句所受影响的行数
--例如结果显示
delete ideTest where id<=3 select @@ROWCOUNT
SQL语句里的脚本
脚本提供了变量、分支、循环等控制语句,可以用来实现一些复杂的任务,SQL语句里的流程控制语句包括:
- IF…ELSE
- GOTO
- WHILE
- WAITFOR
- TRY/CATCH
- CASE
1、我们先来看一下IF...ELSE语句,语法的格式如下:
IF<Boolean Expression><SQL statement>|
BEGIN<code series>
END[ELSE<SQL statement> |
BEGIN <code series>
END]
注意,使用代码行时,别忘了BEGIN与END,这里的BENGIN...END 相当于C语言里的{ } 另外,对于IF判断有一个陷阱,就是 if @var = NULL.这样子写法是不对的,因为NULL不等于任何东西,甚至也不等于NULL,应该写成: if @var IS NULL。我们来看一下具体的实例:
USE MySchool
CREATE TABLE Score
(
id int identity(1,1) primary key,
sname nvarchar(50),
english int,
math int,
computer int
)
insert into Score(sname, english, math, computer) values('Jack',50,60,90);
insert into Score(sname, english, math, computer) values('Lou',70,80,100);
insert into Score(sname, english, math, computer) values('Andy',72,77,66);
insert into Score(sname, english, math, computer) values('Am',42,60,55);
insert into Score(sname, english, math, computer) values('Jobs',34,61,44);
insert into Score(sname, english, math, computer) values('Bill',54,32,76);
insert into Score(sname, english, math, computer) values('Afs',47,43,72);
--查看英语成绩,当英语的平均成绩小于分时最低的三个人的成绩,当成绩大于分取高的三个人的成绩
declare @avg float
select @avg=avg(english) from Score
IF (@avg<60)
begin
select top 3 * from Score order by english asc
end
ELSE
begin
select top 3 * from Score order by english desc
end
在SQL里是没有if...elseif...else的,那么该怎么实现类型于if...elseif...else的作用呢? 可以下面这个例子
USE MySchool
CREATE TABLE Score
(
id int identity(1,1) primary key,
sname nvarchar(50),
english int,
math int,
computer int
)
insert into Score(sname, english, math, computer) values('Jack',60,60,90);
insert into Score(sname, english, math, computer) values('Lou',70,80,100);
insert into Score(sname, english, math, computer) values('Andy',72,77,66);
insert into Score(sname, english, math, computer) values('Am',82,60,55);
insert into Score(sname, english, math, computer) values('Jobs',64,61,44);
insert into Score(sname, english, math, computer) values('Bill',74,32,76);
insert into Score(sname, english, math, computer) values('Afs',67,43,72);
declare @avg float
select @avg=english from Score
IF (@avg<60)
begin
select top 3 * from Score order by english asc
end
else
begin
if(@avg>60 and @avg<70)
begin
select * from Score where english>60 order by english
end
else
begin
select top 3 * from Score order by english desc
end
end
2、While语句
看一下下面这个例子:
declare @i int
set @i=0
WHILE(@i<1000)
begin
set @i=@i+1
insert into Score(sname,english,math,computer) values('test' + CONVERT(nvarchar(10),@i),@i%60,@i%60,@i%60)
end
做一个练习,如果不及格的人数超过半数,则给每个人增加2分。
select @count = count(*) from score
select @failCount = count(*) from score where english < 60
while(@failCount > @count/2)
begin
update score set english = english + 2
--为了跳出循环,加了一次后,再过行检测看人数是否还达到超过一半了
--set @failCount=-1
select @failCount=count(*) from score where english < 60
3.CASE...END
case...end的语法格式如下:
CASE EXPRESSION
--查找STUDENT表,当年龄是19岁时显示青年,18岁显示小伙,其他年龄显示少年
SELECT SAGE,
CASE SAGE
WHEN '19' THEN '青年'
WHEN '18' THEN '小伙'
ELSE '少年'
END
FROM student
--CASE..END的用处很多,我们可以使用他在客户等级,管理员级别的时候用到。例如当客户等级值为1表示普通用户,当客户等级用2表示VIP用户
--其中一个CASE可以产生一个列,多个CASE就会产生多个列
--举一个踪合列子,显示员工姓名/年龄/工资
--工资级别在1-5K 那么初级,工资级别在5-10K 那么中级,工级级别在10K以上 那么是高级。
select fname,fage,
(
case fsalary
WHEN fsalary>1000 and fsalary<=5000 then '初级'
WHEN fsalary>5000 and fsalary<=10000 then '中级'
WHEN fsalary>10000 then '高级'
else '未分级'
) as '工资级别'
from table
--有两张表如下,如何用SQL语句实现第二张表来显示第一张表的内容
--第一张表:
name subject result
张三 语文 80
张三 数学 90
张三 英语 100
李四 语文 77
李四 数学 88
李四 英语 99
--第二张表:
name 语文 数学 英语
李四 77 88 99
张三 80 90 100
--SQL语句如下
select [name]
sum(case subject
when '语文' then result
end) as '语文'
sum(case subject
when '数学' then result
end) as '数学'
sum(case subject
when '英语' then result
end) as '英语'
group by [name]
WAITFOR语句 WAITFOR语句表示时间等待,语法如下: WAITFOR DELAY <’time’> | TIME <’time’>
DELAY参数指定等待的时间量,不能指定天数,只能指定小时,分钟,秒。最大的延迟时间是24小时,
WAITFORDELAY'00:01'
select* from Score
TIME参数指定等到一天中某个特定时刻。同样也只能用24小时制: WAITFOR TIME ‘01:00’; 等到今天01:00时刻执行下面的语句
最后推荐两篇参考博文:
http://www.cnblogs.com/30ErLi/archive/2010/09/17/1829274.html
这篇文章有些是从这里COPY过来的。还有一篇在批处理上用到的关于SQLCMD的文章:
http://blog.163.com/llsh2010@126/blog/static/1691895692011615113838734/