sql server 知识大全(sql server 交集,差集的用法详解)
sql server 知识大全
sql server 交集,差集的用法详解概述
为什么使用集合运算:
在集合运算中比联接查询和EXISTS/NOT EXISTS更方便。
并集运算(UNION)
并集:两个集合的并集是一个包含集合A和B中所有元素的集合。
在T-SQL中。UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现。T-SQL支持以下两种选项:
(1)UNION ALL:不会删除重复行
-- union allselect country, region, city from hr.Employees union all select country, region, city from sales.Customers;
(2)UNION:会删除重复行
-- union select country, region from hr.Employees union select country, region from sales.Customers;
交集运算(INTERSECT)
交集:两个集合(记为集合A和集合B)的交集是由既属于A,也属于B的所有元素组成的集合。
在T-SQL中,INTERSECT集合运算对两个输入查询的结果取其交集,只返回在两个查询结果集中都出现的行。
INTERSECT集合运算在逻辑上会首先删除两个输入集中的重复行,然后返回只在两个集合中中都出现的行。换句话说:如果一个行在两个输入集中都至少出现一次,那么交集返回的结果中将包含这一行。
例如,下面返回既是雇员地址,又是客户地址的不同地址:
-- intersect select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
这里需要说的是,集合运算对行进行比较时,认为两个NULL值相等,所以就返回该行记录。
差集运算(EXCEPT)
差集:两个集合(记为集合A和集合B)的由属于集合A,但不属于集合B的所有元素组成的集合。
在T-SQL中,集合之差使用EXCEPT集合运算实现的。它对两个输入查询的结果集进行操作,反会出现在第一个结果集中,但不出现在第二个结果集中的所有行。
EXCEPT结合运算在逻辑上首先删除两个输入集中的重复行,然后返回只在第一个集合中出现,在第二个结果集中不出现的所有行。换句话说:一个行能够被返回,仅当这个行在第一个输入的集合中至少出现过一次,而且在第二个集合中一次也没出现过。
此外,相比UNION和INTERSECT,两个输入集合的顺序是会影响到最后返回结果的。
例如,借助EXCEPT运算,我们可以方便地实现属于A但不属于B的场景,下面返回属于员工抵制,但不属于客户地址的地址记录:
-- except select country, region, city from hr.Employees except select country, region, city from sales.Customers;
集合运算优先级
SQL定义了集合运算之间的优先级:INTERSECT最高,UNION和EXCEPT相等。
换句话说:首先会计算INTERSECT,然后按照从左至右的出现顺序依次处理优先级相同的运算。
-- 集合运算的优先级 select country, region, city from Production.Suppliers except select country, region, city from hr.Employees intersect select country, region, city from sales.Customers;
上面这段SQL代码,因为INTERSECT优先级比EXCEPT高,所以首先进行INTERSECT交集运算。因此,这个查询的含义是:返回没有出现在员工地址和客户地址交集中的供应商地址。
集合运算的优先级
1.INTERSECT>UNION=EXCEPT
2.首先计算INTERSECT,然后从左到右的出现顺序依次处理优先级的相同的运算。
3.可以使用圆括号控制集合运算的优先级,它具有最高的优先级。
在排序函数的OVER字句中使用ORDER BY ( SELECT <常量> )可以告诉SQL Server不必在意行的顺序。
使用表表达式避开不支持的逻辑查询处理
集合运算查询本身并不持之除ORDER BY意外的其他逻辑查询处理阶段,但可以通过表表达式来避开这一限制。
解决方案就是:首先根据包含集合运算的查询定义一个表表达式,然后在外部查询中对表表达式应用任何需要的逻辑查询处理。
(1)例如,下面的查询返回每个国家中不同的员工地址或客户地址的数量:
select country, COUNT(*) as numlocations from (select country, region, city from hr.Employees union select country, region, city from sales.Customers) as Ugroup by country;
(2)例如,下面的查询返回由员工地址为3或5的员工最近处理过的两个订单:、
select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=3 order by orderdate desc,orderid desc) as D1 union all select empid,orderid,orderdate from (select top (2) empid,orderid,orderdate from sales.Orders where empid=5 order by orderdate desc,orderid desc) as D2;
到此这篇关于sql server 交集,差集的用法详解的文章就介绍到这了,更多相关sql server 交集,差集 内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- sqlserver日志目录是否过大(SQL Server利用sp_spaceused如何查看表记录存在不准确的情况)
- sqlserver拒绝访问怎么办(SQL server服务显示远程过程调用失败的解决方法)
- SqlServer 复制中将大事务分成小事务分发的方法(SqlServer 复制中将大事务分成小事务分发的方法)
- SQLServer设置客户端使用IP地址登录的图文详解(SQLServer设置客户端使用IP地址登录的图文详解)
- sqlserver2014怎么重新激活(解决Windows 10家庭版安装SQL Server 2014出现.net 3.5失败问题)
- sqlserver乐观锁与悲观锁(sql server中死锁排查的全过程分享)
- sql server 进阶(SqlServer AS的用法)
- sqlserver存储过程怎么写日志(SqlServer快速检索某个字段在哪些存储过程中sql 语句)
- sqlserver栏位说明(SQL Server重置IDENTITY属性种子值操作)
- sqlserver数据库文件包括(详解SQL Server数据库状态和文件状态)
- sqlserverdate格式比较(sqlserver之datepart和datediff应用查找当天上午和下午的数据)
- sqlserver查看数据表更新时间(SQL Server实现显示每个类别最新更新数据的方法)
- sqlserver 添加分区(SQL Server 数据库分区分表水平分表详细步骤)
- sqlserver如何添加数据库(sqlserver建立新用户及关联数据库教程)
- sqlserver触发器循环条件(SQL Server 利用触发器对多表视图进行更新的实现方法)
- SQLServer2019安装教程图文详解(SQLServer2019安装教程图文详解)
- 这个全椒人被通报表彰,看看你认识吗(这个全椒人被通报表彰)
- 全椒人,38年集体回忆 1980-2018 ,看完不要哭(全椒人38年集体回忆)
- 董元奔吟咏历代文人 1012新旧均可 全椒人张璪 1022 -1093(董元奔吟咏历代文人)
- 泪目 这位 刷屏 的英雄,是全椒人的骄傲(泪目这位刷屏)
- 人从众 火炎焱 全椒再现 正月十六走太平 的魅力(人从众火炎焱全椒再现)
- 官宣 全椒籍明星许海峰 奚秀兰 方芳 王璐瑶携手回家 走太平(全椒籍明星许海峰)
热门推荐
- mysql实验总结分析(MySQL查询截取的深入分析)
- js闭包可以解决哪些问题(JavaScript中let避免闭包造成问题)
- mysql innodb存储原理(mysql innodb的重要组件汇总)
- 阿里云轻量服务器使用教程(阿里云轻量型服务器重新安装不自带应用的操作系统)
- docker重启报错(Docker启动为Exited状态)
- asp.net lambda表达式
- mysql流式查询(MySQL全面瓦解之查询的正则匹配详解)
- html5canvas画图有什么用(Html5基于canvas实现电子签名并生成PDF文档)
- tornado异步编程(Tornado Web服务器中处理空白字符的解决方案)
- python删除数据框重复变量(Python3删除排序数组中重复项的方法分析)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9