在 SELECT 查询中使用集运算符

  在 SELECT 查询中使用集运算符,可以将来自两个或多个查询的结果合并到单个结果集中。

  在进行集运算之前,请确保:

(1)所有输入集合中,列数和列的顺序必须相同。

(2)对应的列中,数据类型必须兼容。

  可以在一个查询中使用多个集运算符,运算时基于以下的优先级:

(1)包含在括号中的表达式。

(2)INTERSECT 运算符

(3)从左到右求值的 EXCEPT 和 UNION

一、UNION 和 UNION ALL

  UION 和 UNION ALL 用于合并两个输入查询的结果。如果某一行出现在任一输入集合中,那么它将出现在结果集合中。

  当对输入集合进行比较时,NULL 被视为相等。

  ORDER BY 不允许出现在输入集合中,但可以出现在输出结果中。

1. UNION ALL

  UNION ALL 返回所有的输入集合中的所有行,此过程不消除重复的数据行,因此相同的行可以在结果集合中多次出现。


SELECT country, region, city FROM Employees

UNION ALL

SELECT country, region, city FROM Customers

UNION ALL

SELECT country, region, city FROM Suppliers ;

2. UNION(隐式的DISTINCT)

  UNION(隐式的DISTINCT)不但组合两个输入集合,而且还将消除重复的数据行。如果某一行出现在两个输入集合中,那么它在结果集合中仅出现一次。由于排除了重复的数据行,因此需要额外的系统开销。


SELECT country, region, city FROM Employees

UNION

SELECT country, region, city FROM Customers

ORDER BY country, region, city ;

二、EXCEPT 和 INTERSECT

  EXCEPT 和 INTERSECT 比较两个输入查询的结果,返回非重复值。

  在查询执行计划的图形显示功能中,EXCEPT 运算被显示为 left anti semi join,INTERSECT 运算被显示为 left semi join。

1. EXCEPT

  EXCEPT从左输入集合中返回右输入查询中没有找到的所有非重复的值。


SELECT country, region, city FROM Employees

EXCEPT

SELECT country, region, city FROM Customers ;

2.INTERSECT

  INTERSECT返回两个输入集合中都返回的行,而且这些数据行只出现一次(非重复值)。


SELECT country, region, city FROM HR.Employees

INTERSECT

SELECT country, region, city FROM Sales.Customers ;

三、APPLY 运算符

  APPLY 运算符用在 FROM 子句。它的右边的表通常是一个表表达式(派生表或者是一个内联TVF)。

  CROSS APPLY 可以在为外部查询中的每行飞速生成数据子集的情况下使用。APPLY 运算与 JOIN 非常相似,不同之处在于 APPLY 的右侧的表表达式可以对来自左侧表的每一行表示一个不同的行集。也就是说,当在右侧使用一个表表达式时,表表达式可以引用左侧表的参数。

1. CROSS APPLY

  CROSS APPLY 允许用户指定根据外部查询中的行构造子集的方式。


SELECT

*

FROM

Orders AS O CROSS APPLY

(

SELECT TOP(2) * --for each row in Orders there will be at most 2 customers

FROM Customers C

WHERE C.[Customer ID] = O.[Customer ID]

ORDER BY C.[Customer ID]

) AS theOrdersTopCustomers

2. OUTER APPLY

  与 CROSS APPLY 不同,OUTER APPLY 还保留外部查询中与内部查询不匹配的行。


SELECT S.supplierid, s.companyname, P.productid, P.productname, P.unitprice

FROM Production.Suppliers AS S

CROSS APPLY

dbo.fn_TopProductsByShipper(S.supplierid) AS P

  前面的示例显示 OUTER APPLY 结果包括客户 ID“PARIS”,原因是 Orders 表不包含“PARIS”的任何记录。因此,内部查询返回 NULL,原因是 TOP 客户 ID 与 Orders 表中的“PARIS”匹配。将 OUTER 更改为 CROSS 会从结果中排除“PARIS”。

原文地址:https://www.cnblogs.com/cjm123/p/8176736.html

时间: 2024-10-10 11:21:27

在 SELECT 查询中使用集运算符的相关文章

php - 在php脚本中处理select查询结果集

在php脚本中执行select查询命令,也是调用mysql_query()函数,但是和执行DML不同的是,执行SELECT 命令后,mysql_query()函数的返回值是一个资源的引用指针(结果集),需要通过相应函数进行处理. mysql_num_rows($result) 从结果集中获取数据记录的个数 mysql_num_fields($result) 从结果集中获取数据记录列的个数 mysql_fetch_row() 该函数将一条结果记录返回,并以一个普通索引数组的形式保存 mysql_f

《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集 (转)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性设置默认值.在我们示例中,当数据库中返回null值时,用‘0’作为YearsWorked属性的默认值. 解决方案 假设你有如图3-7所示的模型,你想通过模型查询employees.在数据库中,代表employees的表包含一可为空的YearsWorked列.该列映射到Employee实体中的YearsWork

【MYSQL】update/delete/select语句中的子查询

update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把总成绩小于100的学生名称修改为天才 select stu_id from score group by stu_id having sum(grade)<100; #查询总成绩小于100的学生IDupdate students set name='天才' where id in (select s

SQL语句优化系列三(关于select查询)

关于select查询 输出表中的所有列   select  *  from 表名 输出表中的部分列   select  字段名表 from 表名 为结果集内的列指定列名  select  {字段名1 [ as 列的别名]  [,-n]}  from 表名 消除取值重复的行,在select 后面紧跟 distinct 限制返回的行数    select  top 行数 列名表 from 表名 查询满足条件的元组  select  *  from 表名 where 查询条件 比较:列表达式1 比较运

编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = from person in personList select new { PersonName = person.Name, CompanyName = person.CompanyID==0?"Micro":"Sun" }; foreach (var item in

oracle分层查询中的start with和connect by(树结构查询)

来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637 ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型 结构的联系. 例如有如下案例: 数据为节选,字段值含义分别为税务机构代码.税务机构名称.上级税务机构代码,税务机构级别 select * from extern_dm_swjg查询的时候默认顺序就是上面的顺序,可以看出是混乱的并没有特殊结构特征. 而希望的结果如下图: sj_swj

Select查询语句2

一.模糊查询 1.语法结构 select*from table_name where column like '%context%' 在使用like运算符时如果不使用通配符“%”,则like的作用与==作用相同 2.%的三种使用方式 (1)开头或结尾匹配 将%放在匹配字符前面或后面可以查询以....开头或结尾的数据 (2)中间匹配 将%放在匹配字符的两端,可以实现模糊查询 (3)两端匹配 将%放在匹配字符中间,可以查询以%之前内容为开头以%之后内容为结尾的数据 3.“_”通配符 “_”通配符表示

《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联中的两个实体的扁平化投影.扁平化或者叫压缩,这是不规范的叫法.它是指一个有父类和子类的对象图,被投影到一个单独的类中. 解决方案 假设你有一对拥有一对多关联的实体,如图3-15所示的模型. 图3-15 模型中,一个代表助理的Associate的实体类型和一个代表助理工资历史的AssociateSalary实体

为何在查询中索引未被使用 (Doc ID 1549181.1)

* 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   快速检查   表上是否存在索引?   索引是否应该被使用?   索引本身的问题   索引列或者索引的前置列是否在单表(non-join)查询的 Where 条件中(predicate list)?   索引列是否用在连接谓词中(join predicates)?   索引列在 IN 或者多个 OR 语句中?   索引列是否被函数修改?   隐式类型转换(implicit ty