14.1 组合查询
多数 SQL查询只包含从一个或多个表中返回数据的单条 SELECT 语句。
但是,SQL也允许执行多个查询(多条 SELECT 语句),并将结果作为一
个查询结果集返回。这些组合查询通常称为并(union)或复合查询
(compound query)。
主要有两种情况需要使用组合查询:
  在一个查询中从不同的表返回结构数据;
  对一个表执行多个查询,按一个查询返回数据。

提示:组合查询和多个 WHERE 条件
多数情况下,组合相同表的两个查询所完成的工作与具有多个 WHERE
子句条件的一个查询所完成的工作相同。换句话说,任何具有多个
WHERE 子句的 SELECT 语句都可以作为一个组合查询,在下面可以看
到这一点。

14.2 创建组合查询
可用 UNION 操作符来组合数条 SQL 查询。利用 UNION ,可给出多条
SELECT 语句,将它们的结果组合成一个结果集。
14.2.1 使用 UNION
使用 UNION 很简单,所要做的只是给出每条 SELECT 语句,在各条语句
之间放上关键字 UNION 。
举个例子,假如需要 Illinois、Indiana和 Michigan等美国几个州的所有顾
客的报表,还想包括不管位于哪个州的所有的 Fun4All 。当然可以利用
WHERE 子句来完成此工作,不过这次我们使用 UNION 。
如上所述,创建 UNION 涉及编写多条 SELECT 语句。首先来看单条语句:
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI');
输出▼
cust_name cust_contact cust_email
----------- ------------- ------------
Village Toys John Smith sales@villagetoys.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';

输出▼
cust_name cust_contact cust_email
----------- ------------- ------------
Fun4All Jim Jones jjones@fun4all.com
Fun4All Denise L. Stephens dstephens@fun4all.com
分析▼
第一条 SELECT 把 Illinois、Indiana、Michigan等州的缩写传递给 IN 子句,
检索出这些州的所有行。第二条 SELECT 利用简单的相等测试找出所有
Fun4All 。你会发现有一条记录出现在两次结果里,因为它满足两次的
条件。
组合这两条语句,可以如下进行:
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
输出▼
cust_name cust_contact cust_email
----------- ----------- ----------------
Fun4All Denise L. Stephens dstephens@fun4all.com
Fun4All Jim Jones jjones@fun4all.com
Village Toys John Smith sales@villagetoys.com
The Toy Store Kim Howard NULL
分析▼
这条语句由前面的两条 SELECT 语句组成,之间用 UNION 关键字分隔。

UNION 指示 DBMS执行这两条 SELECT 语句,并把输出组合成一个查询
结果集。
为了便于参考,这里给出使用多条 WHERE 子句而不是 UNION 的相同查询:
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
在这个简单的例子中,使用 UNION 可能比使用 WHERE 子句更为复杂。但
对于较复杂的过滤条件,或者从多个表(而不是一个表)中检索数据的
情形,使用 UNION 可能会使处理更简单。
提示: UNION 的限制
使用 UNION 组合 SELECT 语句的数目,SQL没有标准限制。但是,最
好是参考一下具体的 DBMS文档,了解它是否对 UNION 能组合的最大
语句数目有限制。
注意:性能问题
多数好的 DBMS使用内部查询优化程序,在处理各条 SELECT 语句前
组合它们。理论上讲,这意味着从性能上看使用多条 WHERE 子句条件
还是 UNION 应该没有实际的差别。不过我说的是理论上,实践中多数
查询优化程序并不能达到理想状态,所以最好测试一下这两种方法,
看哪种工作得更好。

14.2.2  UNION 规则
可以看到, UNION 非常容易使用,但在进行组合时需要注意几条规则。
 UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字
UNION 分隔(因此,如果组合四条 SELECT 语句,将要使用三个 UNION
关键字)。
 UNION 中的每个查询必须包含相同的列、表达式或聚集函数(不过,
各个列不需要以相同的次序列出)。
  列数据类型必须兼容:类型不必完全相同,但必须是 DBMS可以隐含
转换的类型(例如,不同的数值类型或不同的日期类型)。
说明:UNION 的列名
如果结合 UNION 使用的 SELECT 语句遇到不同的列名,那么会返回什
么名字呢?比如说,如果一条语句是 SELECT prod_name ,而另一条
语句是 SELECT productname ,那么查询结果返回的是什么名字呢?
答案是它会返回第一个名字,举的这个例子就会返回 prod_name ,而
不管第二个不同的名字。这也意味着你可以对第一个名字使用别名,
因而返回一个你想要的名字。
这种行为带来一个有意思的副作用。由于只使用第一个名字,那么想
要排序也只能用这个名字。拿我们的例子来说,可以用 ORDER BY
prod_name 对结果排序,如果写成 ORDER BY productname 就会出错,
因为查询结果里没有叫作 productname 的列。
如果遵守了这些基本规则或限制,则可以将 UNION 用于任何数据检索
操作。

14.2.3 包含或取消重复的行
回到 14.2.1 节,我们看看所用的 SELECT 语句。注意到在分别执行语句
时,第一条 SELECT 语句返回 3行,第二条 SELECT 语句返回 2行。而在
用 UNION 组合两条 SELECT 语句后,只返回 4行而不是 5行。
UNION 从查询结果集中自动去除了重复的行;换句话说,它的行为与一
条 SELECT 语句中使用多个 WHERE 子句条件一样。因为 Indiana州有一个
Fun4All单位,所以两条 SELECT 语句都返回该行。使用 UNION 时,重复
的行会被自动取消。
这是 UNION 的默认行为,如果愿意也可以改变它。事实上,如果想返回
所有的匹配行,可使用 UNION ALL 而不是 UNION 。
请看下面的例子:
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION ALL
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
输出▼
cust_name cust_contact cust_email
----------- ------------- ------------
Village Toys John Smith sales@villagetoys.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL
Fun4All Jim Jones jjones@fun4all.com
Fun4All Denise L. Stephens dstephens@fun4all.com

分析▼
使用 UNION ALL ,DBMS不取消重复的行。因此,这里返回 5行,其中
有一行出现两次。
提示: UNION 与 WHERE
这一课一开始我们说过, UNION 几乎总是完成与多个 WHERE 条件相同
的工作。 UNION ALL 为 UNION 的一种形式,它完成 WHERE 子句完成
不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),
就必须使用 UNION ALL ,而不是 WHERE 。
14.2.4 对组合查询结果排序
SELECT 语句的输出用 ORDER BY 子句排序。在用 UNION 组合查询时,只
能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。对
于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一
部分的情况,因此不允许使用多条 ORDER BY 子句。
下面的例子对前面 UNION 返回的结果进行排序:
输入▼
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;

输出▼
cust_name cust_contact cust_email
----------- ------------- -------------
Fun4All Denise L. Stephens dstephens@fun4all.com
Fun4All Jim Jones jjones@fun4all.com
The Toy Store Kim Howard NULL
Village Toys John Smith sales@villagetoys.com
分析▼
这条 UNION 在最后一条 SELECT 语句后使用了 ORDER BY 子句。虽然 ORDER
BY 子句似乎只是最后一条 SELECT 语句的组成部分,但实际上 DBMS将
用它来排序所有 SELECT 语句返回的所有结果。
说明:其他类型的 UNION
某些 DBMS 还支持另外两种 UNION : EXCEPT (有时称为 MINUS )可用
来检索只在第一个表中存在而在第二个表中不存在的行;而 INTERSECT
可用来检索两个表中都存在的行。实际上,这些 UNION 很少使用,因
为相同的结果可利用联结得到。
提示:操作多个表
为了简单,本课中的例子都是使用 UNION 来组合针对同一表的多个查
询。实际上, UNION 在需要组合多个表的数据时也很有用,即使是有
不匹配列名的表,在这种情况下,可以将 UNION 与别名组合,检索
一个结果集。

SQL必需掌握的100个重要知识点:组合查询相关推荐

  1. PMP考试 | 点击率最高 的100个主要知识点

    PMP考试内容太多了. <PMBOK指南>也有700多页,这要是专有名词还一点都不懂的话,学习起来是非常困难的. 另外如果自己学,还把握不好重点,所以这里给大家整理了100条在考试中点击率 ...

  2. css就近原则_细品100道CSS知识点(上)「干货满满」

    作者:hh_phoebe 转发链接:https://juejin.im/post/5ee0cf335188254ec9505381 目录 细品100道CSS知识点(上)[干货满满]本篇 细品100道C ...

  3. SQL Server 2005的100范例程序及数据库下载

    这是微软 2006/4/19 日所公布的SQL Server 2005的100范例程序及数据库下载... 里面包含超过100个以上的范例程序及3个样板数据库,而范例示范的部分如下: Database ...

  4. css为什么要用浮动_细品100道CSS知识点(上)「干货满满」

    作者:hh_phoebe 转发链接:https://juejin.im/post/5ee0cf335188254ec9505381 目录 细品100道CSS知识点(上)[干货满满]本篇 细品100道C ...

  5. 关系数据库SQL面试排名前100道问答题

    RDBMS 是迄今为止最常用的数据库之一,因此SQL 技能在大多数工作角色中必不可少.在这篇 SQL 面试问题文章中,我将向您介绍有关 SQL(结构化查询语言)的最常见问题.本文是您学习与 SQL.O ...

  6. 【SQL自学打卡|DAY13】——组合查询

    前言 ❤欢迎大家阅读我的文章呀❤ 今天是SQL必知必会的最后一块练习. 希望你们在我的文章当中能有所收获!!! SLogan:利用有限的时间,撸起袖子加油干! 知识点回顾 内联结:inner join ...

  7. SQL数据库实战(含建表数据和查询案例)

    Oracle数据库安装的时候会自带一个练习用数据库(其中包含employee表,后来版本中此表改名为emp): 首先在安装过程中应该有个选项"是否安装实例表"(完全安装模式下默认是 ...

  8. MySQL基础——数据库和SQL概述\MySQL基本使用\DQL语言学习\条件查询\排序查询\常见函数\分组查询\连接查询\子查询\分页查询\联合查询

    本文详细讲解了MySQL中DQL语言,也就是数据查询语句的使用.全文3w余字,是对学习MySQL知识的整理总结,因为篇幅较长,MySQL基础知识余下部分发表在余下博客中 DML语言学习\插入数据\删除 ...

  9. dbForge Studio for SQL Server入门教程:如何创建和编辑查询

    2019独角兽企业重金招聘Python工程师标准>>> [dbForge Studio for SQL Server下载] 创建查询: 1.创建服务器连接.有关如何创建服务器连接的详 ...

最新文章

  1. 把「光」存储1小时,中科大新研究破世界纪录,保真度高达96.4% | Nature子刊
  2. lintcode: 爬楼梯
  3. java stream流_Java-8-流(1)
  4. pycharm(windows)安装及其设置中文菜单
  5. 玩转oracle 11g(33):无监听程序
  6. 【qduoj - 1010】easy problem(巧妙的枚举)
  7. 产品经理的冬天来了嘛?
  8. python3 新式类_python新式类和旧式类区别
  9. rs422 波特率高错误_质量流量计的应用问题与常见错误代码的故障处理
  10. 马化腾回应《腾讯没有梦想》:我的理想不是赚多少钱
  11. Understanding ES6 -- 深入理解ES6书籍
  12. python 去除panda安装包_沉淀,再出发:python中的pandas包
  13. JavaScript基础流程控制(3)
  14. spring源码下载以及gradle的详细使用教程
  15. CAD教程:CAD自定义菜单和工具栏的操作技巧
  16. 嵌入式软件测试——初探
  17. 必杀VI、VIM编辑器命令
  18. Android应用各个开放平台市场
  19. 使用jmeter进行压测
  20. 信创产业现状、分析与预测

热门文章

  1. 解决virtualBox挂载问题/sbin/mount.vboxsf: mounting failed with the error: Protocol
  2. 心田花开写作指导二年级看图写话风筝写作方法
  3. 光影魔术手可以切片吗_实体框架魔术独角兽(还有更多!)现已开放,并且可以收回
  4. css 类似于360安全体检的动画
  5. mendeley云端容量_mendeley如何迁移数据到新电脑?
  6. 通过拉卡拉支付上市研判第三方支付发展前景
  7. 温度控制电机转动案例
  8. 基于javaEE技术的驾驶证(驾校、交规)模拟考试系统的设计
  9. BricsCAD二次开发之外部组件发生异常bug
  10. seq2seq + attention 详解