sql server 变量与集合运算

变量

变量分为全局变量和局部变量

  • @@开头为全局变量,用户只能访问,赋值报错
  • @开头为局部变量,用户定义和配置

局部变量

局部变量只能存一个变量值,用途:

  • 控制循环次数
  • 控制流程走向
  • 暂存变量

定义:

局部变量的数据类型不能为Text,ntext,和Image类型,当对于字符型变量只提供数据类型没有提供数据长度时,数据长度默认为1。一切只声明没有赋值的局部变量的初始值都为`NULL`。
declare @variable varchar(5)   --定义变量包括关键字declare,@变量名,数据类型

赋值

上面定义了变量,我们需要赋值给它,赋值可以用set和select

set @variable='test1'   --set赋值
select @variable='test2'    --select赋值(select赋值时,不能查询其他值,只能select单值赋值)
set一次只能赋值一个变量,select可以一次赋值多个变量
赋值变量时如果接收多个,set报错;select取最后一个。

使用SET对局部变量赋值时,如果赋值表达式未返回值,则局部变量变为NULL,而SELECT对表达式赋值时,如果表达式未返回值,则局部变量保持原值.

declare @a varchar(5),@b varchar(5) 
select @a=1,@b=2
select @a=pzh from student where xuehao='9999999'   --不会清空原值
set @b=(select pzh from student where xuehao='9999999')--会清空原值
select @a as a,@b b

讲道理,搜索空应该把变量置空,所以你应该尽量用set。

局部表变量

局部表变量是一个特殊的局部变量.和临时表不同,局部表变量具有一切局部变量的特点.在查询中,如果有足够的内存,则表变量和临时表都在内存(数据缓存)中创建和处理,而不是硬盘中,所以速度会远远快于临时表或是实际表,局部表变量最多的使用时在查询中充当多个表做连接时的中间表,比如:

declare @tempTable TABLE(id int,name varchar(50))
--先把前两个表的内容存入表变量
insert into @tempTable
select a.id,b.name from TABLE1 a INNER JOIN table2 b on a.id=b.idfrom
--利用表变量和第三个表在做连接,提升性能
select a.id,a.name,b.age from @tempTable a left joino table3 b on a.id=c.id

集合运算

集合运算条件:

  1. 两个数据集之间必须有相同数量的列(Column)
  2. 两个数据集之间列出现的次序必须一致
  3. 两个数据集之间每一个对应的列的数据类型必须匹配

交∩(INTERSECT)

交:AB共有数据

select * from student1
INTERSECT
select * from student2 

并∪(union)

并:AB所有数据,sql 中∪用union实现。

select * from student1
union
select * from student2 

UNION ALL同样实现了A∪B的逻辑,但与UNION不同的是,当遇到两个数据集中重复的行时,全部保留。

补-(except)

补为特有数据,比如A有,B没有;或B有A没有

student1-student2
select * from student1
except
select * from student2 

别名与排序

如果没有为数据列指定别名,则数据列的名称按照出现在第一个集合对应的列名。若要自定义列名也在第一个集合写别名。

对运算后的结果进行排序是一件非常简单的事情,只需要在运算的最后加上ORDER BY子句,但是这里一定要注意:

  1. ORDER BY是对整个运算后的结果排序,并不是对单个数据集
  2. ORDER BY后面排序的字段名称是第一个数据集的字段名或者别名
order by 写在最后,对整个结果排序,排序要写前面表的字段,不可写后面表字段。

select name a,age from student1
union
select name1,age from student2 
order by a asc
原文地址:https://www.cnblogs.com/Neroi/p/13901184.html