zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    同库 不同表更新
    js 随机时间
    转 vagrant package[打包命令]详解
    mysql 批量更新与批量更新多条记录的不同值实现方法 (转)
    vagrant up时提示 Authentication failure. Retrying
    vagrant 错误记录
    签名保存
    linux下svn命令大全
    linux 搭建SVN服务器,为多个项目分别建立版本库并单独配置权限
    log file sync
  • 原文地址:https://www.cnblogs.com/Neroi/p/13901184.html
Copyright © 2011-2022 走看看