MySQL 基础———— UNION 联合查询

引言

联合查询连接查询不同,通过UNION 关键字,我们可以将多个查询语句一同执行并将结果集展示出来,不涉及到任何关联关系。

UNION 的含义是“联合,并集,结合”,在MySQL中可以将多个查询语句的结果合并成一个结果集,在MySQL 不支持FULL OUTER JOIN 的情况下,弥补了“并集” 查询的短板。

连接查询相关知识总结,参考《MySQL 基础 ———— 连接查询》。

一、UNION 介绍

UNION 查询非常简单,就是将多个SQL的结果取并集,适用于查询多个功能含义比较类似的表或结果集,同时可以将一条比较复杂的SQL拆分成多条语句。

员工表:

学生表:

联合查询: 

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student
LIMIT 15

上面的SQL语句使用 UNION 关键字将emp 和 student 的查询合并在了一起。如果希望合并多个查询,就可以使用下面的格式进行合并:

查询语句 1 

UNION

查询语句 2

UNION

......

二、联合查询的规则

联合查询是有一定使用规则的,如果不加注意,MySQL就有可能执行报错,或意义混乱

1、多条查询语句的查询列数必须保持一致,否则报错。

2、多条查询语句的列值类型顺序最好保持一致。

3、UNION 关键字默认不查询重复记录,但只要有一个字段不一样就认为是两条记录。

2.1 规则一:查询列数必须保持一致

其实很好理解,如果要将两个结果集合并,那么就需要将列数统一,MySQL对此作了严格的限制,不会以 NULL 值显示没有查询该列的查询记录,这是为了保证数据的准确性,原因是 NULL 也是一种值

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级, manager_id FROM emp
UNION
SELECT stu_id 编号, stu_name 姓名, class_id 所属部门或班级 FROM student

  

2.2 规则二:列值类型顺序最好保持一致

“最好” 的意思是 “我们可以不这样做,但皮一下并没有什么意义”。

比如,我们将stu_name 与 class_id 调换顺序:

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id 编号, class_id 姓名, stu_name 所属部门或班级 FROM student
LIMIT 15

 MySQL虽然不会报错,但结果已经不具有什么使用意义了。另外,列的别名其实并不需要完全统一,多条查询语句中如果出现不统一的列名,MySQL会默认使用第一条查询语句的列名。如:

SELECT emp_id 编号, emp_name 姓名, dept_id 所属部门或班级 FROM emp
UNION
SELECT stu_id, stu_name, class_id FROM student
LIMIT 15

但为了保证可读性,建议为每条查询语句指定相同的列名,保持统一格式。

2.3 规则三:UNION 默认去重

UNION 关键字不会查询重复的记录,但重复的记录并不是简简单单的“看上去重复”或“主键重复”,记录中只要有一个字段不一致,UNION 就会老老实实的将他们都查询出来。

三、UNION 与 UNION ALL

UNION 关键字是去重的联合查询,如果非要将所有记录都查询出来,不忽略重复的记录,那么可以使用 UNION ALL ,对比来看一下:

SELECT * FROM emp
UNION 
SELECT * FROM emp

UNION 的结果: 

SELECT * FROM emp
UNION ALL
SELECT * FROM emp

UNION  ALL 的结果:

综上,就是关于 UNION 联合查询的用法总结,欢迎文末留言。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 基础————常用数据类型

引言 从第一次学习mysql开始,不知道为什么MySQL的数据类型始终没有像Java 一样深入脑海,对某些数据类型的定义和用法,也并不清晰,这篇文章,就好好总结一番,将MySQL中几个常用的数据类型归纳一下。 一、类…

MySQL 基础 ———— SAVEPOINT 的应用

引言 savepoint 关键字用于在数据库事务中设置一个存储点,在一个较长的事务中暂存数据,如果在事务末尾执行回滚,可选择性的回滚到 savepoint 设置的暂存点。 本文承接上一篇博客《MySQL 基础 ————事务与隔离级别总结》,进一…

MySQL 基础 ———— 视图的应用与总结

引言 视图是一种虚拟表,和普通表的使用是一样的,视图的一大特点就是“临时性”,是通过表动态生成的数据,只保存SQL逻辑,不保存查询结果。 视图在实际生产中主要有两种应用场景: 1、多个地方用到同样的查…

MySQL 基础 ———— 变量

一、MySQL系统变量 系统变量是由系统提供,属于服务器层面。 系统变量分为:全局变量和会话变量。 全局变量一般要加 GLOBAL 关键字,例如在《MySQL 基础 ————事务与隔离级别总结》中提到的 GLOBAL TRANSACTION,就属于全局变量…

MySQL 基础 ———— 存储过程与函数

一、存储过程介绍 存储过程是一组预先编译好的SQL语句的集合,可理解成批处理语句。它的优点主要有以下几点: 1、提高代码的重用性; 2、简化操作; 3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率…

MySQL 基础 ———— 流程控制结构

引言 MySQL 中的流程控制作为基础知识的最后一块拼图,显得并不是特别重要,而且,在实际生产开发中,也往往不需要通过它来进行程序的控制,那么为什么还要学习它呢?我认为有以下几点: 1、知识的完…

MySQL 高级 ———— MySQL逻辑架构图简介

引言 本篇文章介绍MySQL的逻辑架构图。 MySQL并不完美,但足够灵活,能够适应高要求环境。MySQL不仅可以嵌入到应用程序中,同时也可以支持数据仓库、内容搜索、和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。 一、MySQL逻…

Java正则表达式总结

引言 正则表达式(英文:regular expression)是用于描述字符串规则的工具,是记录文本规则的代码。 它可以用来搜索、编辑、处理文本。现有编程语言都支持正则表达式的处理,但每种语言都有细微的差别。 在Java 中&…

Linux 实操 —— 日志筛选操作(sed与wc命令介绍)

引言 在处理数据交互业务场景的问题时,经常会出现需要统计日志中出现某些指定关键字的行数,或者行数,那么如何通过Linux 命令来快速统计一段时间之内,某个特定关键字出现的行数呢?这篇文章将会给你答案。 一、快速统…

Java 注解知识总结

引言 本博客总结自《Java 编程思想》第 20 章。 一、什么是注解 注解是 Java 5 引入的一种通过反射机制实现的语法特性,开发者可以通过在类、域、方法等元素前面标记一个“标签”达到对程序的源码、类信息或运行时进行某种说明或处理的效果,尽可能地简…

Linux 实操 —— Linux 系统性能分析

引言 最近配合解决压测(性能测试)方面的问题,了解到了一些可以监控 Linux 系统性能指标,如CPU、IO、内存等的工具。 此篇博客主要讲解 Linux 系统监控的一些重点内容以及 sar 命令的使用。 一、Linux 性能分析聚焦 Linux 性能…

Java 动态代理解析

引言 本博客总结自《Java 编程思想》第十四章 一、实现第一个动态代理程序 代理是软件设计中重要的设计思想,它允许我们在调用实际操作之前或之后解耦式地编写额外的操作,而一旦不需要这些操作了,就可以轻易的移除它们。 浏览了《编程思想…

MySQL 基础 ————高频函数总结

一、MySQL函数调用方式 函数调用的基本语法: SELECT 函数(实参列表) [FROM 表] 其中,对于函数,需要重点关注三点: 1、函数的名称 2、参数列表 3、函数功能 二、函数的分类 在 MySQL中,函数分为两类:1、…

MySQL 高级 —— 复合索引简介(多列索引)

引言 复合索引是指包含多个数据列的索引,与之概念相对的是单列索引,仅包含一个数据列。在大多数情况下,建立多列索引的好处都要多于单列索引。另外,复合索引最多支持16个列,但请一定不要让复合索引包含太多的列&#…

MySQL 优化 —— SQL优化概述(优化专题开篇词)

引言 最近为了研究索引的知识,特地去MySQL 官网研读了一番,发现MySQL官网有比较全面的MySQL优化方案和知识背景,所以希望通过一系列文章,将官网的知识翻译总结一下,避免日后去网上胡乱搜索产生不必要的知识勘误风险。…

MySQL 优化 —— WHERE 子句优化

引言 本文翻译自 MySQL 官网:WHERE Clause Optimization WHERE 子句优化 这一部分我们来讨论对 WHERE 子句的优化处理。本部分的案例都是以 SELECT 语句为例,但这些优化同样适用于 DELETE 和 UPDATE 语句中的 WHERE 子句。 注意 因为对 MySQL 优化器的…

MySQL 优化 —— IS NULL 优化

引言 本博客翻译自 MySQL 官网:IS NULL Optimization, MySQL版本 5.7。 MySQL 对 IS NULL 的优化 MySQL 可以对 IS NULL 执行和常量等值判断(列名 常量表达式,如name Tom)相同的优化。MySQL 可以利用索引和范围来…

MySQL 优化 —— ORDER BY 优化

引言 本文翻译自MySQL 官网:ORDER BY Optimization,MySQL 版本:5.7。 这一部分描述了MySQL何时会使用索引来满足order by子句,filesort 操作会在索引不能生效的时候被用到,以及优化器对order by的执行计划信息。 or…

MySQL 高级 —— 索引实现的思考

引言 最近看了一个公开课,是有关MySQL对索引设计的思考。详细讲解了几种索引实现的设计思考与利弊辨析,讨论了为什么MySQL默认情况下会使用B树索引,B树索引又对B树做了哪些结构改进。 本片博客通过个人的学习理解和总结,由几种简…

MySQL 优化 —— MySQL 如何使用索引

引言 本文翻译自MySQL 官网 :How MySQL Uses Indexes ,MySQL 版本 5.7 。 提升 SELECT 操作性能最好的方式就是在查询的一列或多列上建立索引。索引的行为类似指向表数据的指针,可以让查询能够快速判断哪个记录满足 WHERE 子句中的条件&…