变量
变量分为全局变量和局部变量
- @@开头为全局变量,用户只能访问,赋值报错
- @开头为局部变量,用户定义和配置
局部变量
局部变量只能存一个变量值,用途:
- 控制循环次数
- 控制流程走向
- 暂存变量
定义:
局部变量的数据类型不能为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
集合运算
集合运算条件:
- 两个数据集之间必须有相同数量的列(Column)
- 两个数据集之间列出现的次序必须一致
- 两个数据集之间每一个对应的列的数据类型必须匹配
交∩(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子句,但是这里一定要注意:
- ORDER BY是对整个运算后的结果排序,并不是对单个数据集
- ORDER BY后面排序的字段名称是第一个数据集的字段名或者别名
order by 写在最后,对整个结果排序,排序要写前面表的字段,不可写后面表字段。
select name a,age from student1
union
select name1,age from student2
order by a asc