MySQL必知必会——第十七章组合查询

2023-11-04

组合查询

本章讲述如何利用UNION操作符将多条SELECT语句组合成一个结果集。

组合查询

多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询,并将结果作为单个查询结果返回。这些组合查询通常称为并(union)复合查询(compound query)

两种需要组合查询的情况:

  • 在单个查询中从不同的表返回类似结构的数据。
  • 对单个表执行多个查询,按单个查询返回数据。

组合查询和多个WHERE子句 一般组合相同表的两个查询与多个WHERE子句条件的单条查询完成的工作相同。这两种技术在不同的查询中性能也不同,应多做尝试以确定哪种性能较好。


创建组合查询

可用UNION操作符来组合多条SQL查询。UNION将多条SQL查询的结果组合成单个结果集。

使用UNION

UNION语法简单,只需在每条SELECT语句之间放上关键字UNION。

检索价格小于等于5的所有物品,还包括供应商1001和1002生产的所有物品。
先看单条语句:

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5;
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1003 | FC      |       2.50 |
|    1002 | FU1     |       3.42 |
|    1003 | SLING   |       4.49 |
|    1003 | TNT1    |       2.50 |
+---------+---------+------------+
4 rows in set (0.01 sec)

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001,1002);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | FU1     |       3.42 |
|    1002 | OL1     |       8.99 |
+---------+---------+------------+
5 rows in set (0.01 sec)

第一条SELECT检索价格不高于5的所有物品。第二条SELECT使用IN找出供应商1001和1002生产的所有物品。

使用UNION操作符进行组合:

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION
    -> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001,1002);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1003 | FC      |       2.50 |
|    1002 | FU1     |       3.42 |
|    1003 | SLING   |       4.49 |
|    1003 | TNT1    |       2.50 |
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | OL1     |       8.99 |
+---------+---------+------------+
8 rows in set (0.01 sec)

此语句由前面的两条SELECT语句组成,语句中用UNION关键字分隔。UNION指示MySQL执行两条SELECT语句,并把输出组合成单个查询结果集。

参考,使用WHERE子句的相同查询:

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> OR vend_id IN (1001,1002);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1003 | FC      |       2.50 |
|    1002 | FU1     |       3.42 |
|    1002 | OL1     |       8.99 |
|    1003 | SLING   |       4.49 |
|    1003 | TNT1    |       2.50 |
+---------+---------+------------+
8 rows in set (0.01 sec)

在这个例子中,使用UNION可能比使用WHERE子句更为复杂。但对于更复杂的过滤条件,或者从多个表中检索数据,使用UNION可能会更简单。

UNION规则

虽然UNION的使用简单,但还需注意几条规则:

  • UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
  • UNION中的每个查询必须包含相同的列、表达式或聚集函数(但次序没有讲究)。
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐性转换的类型(如日期类型与日期类型,数值类型与数值类型)。

包含或取消重复的行

UNION从查询结果集中自动去除了重复的行。这是UNION的默认行为,但如果需要,可以使用UNION ALL而不是UNION。

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION ALL
    -> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001,1002);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1003 | FC      |       2.50 |
|    1002 | FU1     |       3.42 |
|    1003 | SLING   |       4.49 |
|    1003 | TNT1    |       2.50 |
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | FU1     |       3.42 |
|    1002 | OL1     |       8.99 |
+---------+---------+------------+
9 rows in set (0.00 sec)

使用UNION ALL,MySQL不取消重复的行。因此这里有一行出现了两次。

  • UNION与WHERE UNION总是完成与多个WHERE条件相同的工作。UNION ALL为UNION的一种形式,它完成WHERE子句完成不了的工作。

对组合查询结果排序

SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。不允许使用多条ORDER BY子句。

排序前面的例子:

mysql> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE prod_price <= 5
    -> UNION
    -> SELECT vend_id, prod_id, prod_price
    -> FROM products
    -> WHERE vend_id IN (1001,1002)
    -> ORDER BY vend_id, prod_price;
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
|    1001 | ANV01   |       5.99 |
|    1001 | ANV02   |       9.99 |
|    1001 | ANV03   |      14.99 |
|    1002 | FU1     |       3.42 |
|    1002 | OL1     |       8.99 |
|    1003 | FC      |       2.50 |
|    1003 | TNT1    |       2.50 |
|    1003 | SLING   |       4.49 |
+---------+---------+------------+
8 rows in set (0.01 sec)

这条UNION在最后一条SELECT语句后使用了ORDER BY子句。虽然ORDER BY子句似乎只是最后一条SELECT语句的组成部分,但MySQL用它来排序所有SELECT语句的结果集。

  • 组合不同的表 为方便理解,所用的组合例子都是相同的表,但UNION组合查询可以应用不同的表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL必知必会——第十七章组合查询 的相关文章

  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • 使用什么框架来引导我的第一个生产 scala 项目?

    我正在第一次涉足 scala 的生产应用程序 该应用程序当前打包为 war 文件 我的计划是创建 scala 编译工件的 jar 文件 并将其添加到 war 文件的 lib 文件夹中 我的增强功能是通过 Jersey 公开的 mysql 支
  • SQL Server 2005 是否有与 MySql 的 ENUM 数据类型等效的数据类型?

    我正在开发一个项目 我想在表中存储一些容易枚举的信息 MySql 的枚举数据类型正是我想要的 http dev mysql com doc refman 5 0 en enum html http dev mysql com doc ref
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • SKIP加锁和nowait的区别

    pl sql 中 SKIP 锁定游标和 nowait 游标之间的区别 我认为我找到的这张图片是描述差异的最佳例子 详细说明 http viralpatel net blogs oracle skip locked
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 如何在 SQL Server 2012 中选择除一列之外的所有列? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以选择所有列 但只选择我不想选择的特定列 我的意思是有时我会遇到这样的问题 表有数百个字段 而我只需要删除一个字段 我需要重写所有列吗 有什么窍门吗 喜欢select
  • 默认情况下在sql日期时间列中插入null/空值

    如何在 SQL Server 中创建一个表 默认日期时间为空 而不是1900 01 01 00 00 00 000我得到了 我的意思是 如果没有插入值 则默认值应该为 null 空等 如果没有插入值 默认值应该是null empty 在表定
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0

随机推荐

  • 数据库复杂sql如何编写入手

    前言 说到数据库我想大家都不陌生 对主流的数据库都会基本使用 但是要写好sql完成复杂的sql编写是需要对数据库原理 sql脚本语法有一定的了解的 但是对于开发人员来说 平常都是在curd写一些业务代码 数据库接触的也不是那么复杂 对于复杂
  • 环境配置的坑(一)Cmake :: Could not find a package configuration file provided by "xxx"

    可能是放置文件问题 不是说你路径配置错了 可能就算是路径是对的 但是你放到了系统文件夹里 Program Files 和 Program Files x86 然后当你用Cmake编译时候就会报错 我以配置opencv为例 一开始我将open
  • 文心一言实测:什么是文心一言?

    我不了解百度 能用五百字向我介绍这个公司吗 百度是一家全球领先的互联网公司 致力于为人们提供便捷 高效 智能的信息获取和交流服务 公司成立于2000年1月 总部位于中国北京 百度在搜索引擎 AI技术 云计算等领域拥有强大的技术实力和丰富的产
  • 为什么要学习spring cloud

    不论是商业应用还是用户应用 在业务初期都很简单 我们通常会把它实现为单体结构的应用 但是 随着业务逐渐发展 产品思想会变得越来越复杂 单体结构的应用也会越来越复杂 这就会给应用带来如下的几个问题 代码结构混乱 业务复杂 导致代码量很大 管理
  • Buuctf[极客大挑战 2019]LoveSQL

    题目打开是登录框 先尝试用万能密码 开始还以为这样就欧克了 但尝试之后发现这与flag无关 所以还是从sql开始走一遍 先查询一下字段 order by 4 字段数是四的时候报错了 后来小瑶尝试了在字段数为三时未报错 所以确定字段数是3 之
  • Interval【对偶图优化最小割(最大最小定理 周冬)】

    2020牛客多校第二场I题 首先 我们考虑最小割的方式来处理该问题 很明显的 这就是一张对偶图了 因为它没有任意两线会存在相交的可能了 所以根据对偶图的做法 我们可以将最小割问题转化为最短路了 绿色和粉色是新的对偶图所构成的边和点 然后我们
  • 软件安全测试报告模板_软件质量保证与测试(课后习题与答案)--仅供复习参考...

    第1章 软件测试基础 一 填空题 1 软件从 出生 到 消亡 的过程称为软件生命周期 2 早期的线性开发模型称为 瀑布 开发模型 3 引入风险分析的开发模型为 螺旋开发模型 4 ISO IEC9126 1991标准提出的质量模型包括 功能性
  • webpack5之loader配置(四)

    总述 要明白为什么要引入loader 因为webpack只能理解js和json这样的文件 这是webpack开箱可用的自带能力 loader可以让 webpack去解析其他类型的文件 并且将这些文件转化为有效的模块以供我们应用程序使用 如何
  • 国产CAE的涅槃-岩土行业高性能离散元软件MatDEM

    作者 刘春博士 一 导读 2019年9月11日 ANSYS公司公开宣称 收购LSTC公司 一举获得其旗下拥有LS DYNA 结构 流体 电磁的多物理场求解器 LS PrePost 前后处理器 LS OPT LS TASC 参数优化 拓扑优化
  • 微信小程序——关于图片

    属性 类型 默认值 必填 说明 src string 否 图片资源地址 mode string scaleToFill 否 图片裁剪 缩放的模式 webp boolean false 否 默认不解析 webP 格式 只支持网络资源 lazy
  • 我在训练maskrcnn模型识别羊的时候发现,用了1500张图片,模型的损失是逐渐降低的,预测框标注的很好,但是掩膜图层识别效果非常差,resnet使用的是101,详细说出为什么这种原因,并列出详细的...

    在训练 Mask R CNN 模型识别羊时 用了 1500 张图片 模型的损失是逐渐降低的 说明模型在训练过程中较好地学习了预测框标注的特征 然而 掩膜图层识别效果非常差 这可能是由以下几种原因造成的 数据不足 如果训练数据中羊的掩膜图层标
  • QT环境搭建:解决Linux系统下QT(qDebug和console)无输出

    在Linux下调试时突然发现无论怎样qDebuge无法输出了 寻找了半天 发现是环境变量出了问题 我的环境是统信的UOS 解决办法就是修改QT LOGGING RULES变量 1 查看是否是这个变量的问题 export p grep QT
  • linux各种版本下载地址

    http blog chinaunix net uid 26760055 id 3138203 html 首先提供两个镜像站 http mirrors sohu com http mirrors 163 com Red Hat Enterp
  • linux ubuntu18.04安装(更新)cmake版本 (坑是真滴多,我都给你趟过去了)

    笔者就是想学一手网络编程 通过本地clion编写代码 在云服务器上跑起来 这就涉及到了cmake版本问题 本地编译器cmake版本为3 22 3 云服务器的版本过于低了 用这个语句装的版本为3 10 好多人都不建议用这个装 但是这个不装的话
  • 简单的整理一下VIM环境配置和插件安装

    http www zhaiqianfeng com 2017 02 install vim plugins html 先占个坑 周末有时间再写
  • Java Stream流

    目录 1 Stream 流的获取方法 2 Stream 流的常见中间方法 3 Stream 流的常见终结方法 4 Stream 流的收集方法 获取 Stream 流 创建一条流水线 并把数据放到流水线上准备进行操作 中间方法 流水线上的操作
  • nginx篇10-限速三剑客之limit_req

    本文主要是对nginx官方limit req相关模块的限速原理的解释和一些个人理解 主要参考的文章为Rate Limiting with NGINX and NGINX Plus和nginx的ngx http limit req modul
  • C++编码规范(1):代码注释

    当你阅读别人的代码时如果没有注释那会是件比较痛苦的事 一说到注释我们马上想到是通过 或 这样来添加一些描述信息 这只是狭义的注释 广义的注释我们可以理解为 任何有助于理解代码的信息都可以看成注释 我们可以把写代码和写文章类比下 自然语言会有
  • Qt - 获取屏幕分辨率

    欢迎转载 请注明出处 https blog csdn net qq 39453936 spm 1010 2135 3001 5343 原文链接 https blog csdn net qq 39453936 article details
  • MySQL必知必会——第十七章组合查询

    组合查询 本章讲述如何利用UNION操作符将多条SELECT语句组合成一个结果集 组合查询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句 MySQL也允许执行多个查询 并将结果作为单个查询结果返回 这些组合查询通常称