mysql中union和union all的使用及注意事项

目录
  • 1. sql中 union 和 union all 的用法
  • 2. 注意事项
    • 2.1、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列
    • 2.2、每条 SELECT 语句中列的顺序必须相同
  • 3. union all 使用场景
  • 补充:mysql中union和union all的区别
    • 一、区别1:取结果的交集
    • 二、区别2:获取结果后的操作
    • 三、区别3:
  • 总结

1. sql中 union 和 union all 的用法

如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 union all 关键字。union (或称为联合)的作用是将多个结果合并在一起显示出来。

unionunion all 的区别是,union 会自动压缩多个结果集合中的重复结果,而 union all 则将所有的结果全部显示出来,不管是不是重复。

union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表 union

如下sql:

SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
UNION
SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'

结果:

union all:对两个结果集进行并集操作,包括重复行,不进行排序; 如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

如下sql:

SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
UNION ALL
SELECT create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'

结果:

2. 注意事项

2.1、UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列

2.2、每条 SELECT 语句中列的顺序必须相同

先来说下,如果顺序不同,会是什么结果?

答:结果字段的顺序以union all 前面的表字段顺序为准。

union all 后面的表的数据会按照顺序依次附在后面。注意:按照字段顺序匹配,而不是按照字段名称匹配。

sql如下:顺序对结果的影响

SELECT *
FROM(
	SELECT msku,create_time FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK'
UNION ALL
	SELECT create_time,msku FROM `e_msku_sku` WHERE msku = '21-BQLEDNL120W-BK') t

综上:

union all 结果字段的顺序以 union all 前面的表字段顺序为准。union all 后面的表的数据会按照字段顺序依次附在后面,而不是按照字段名称匹配。

我们上面以*来表示顺序的不同,其实你写成不同顺序的字段结果一致。

3. union all 使用场景

sql 中的组合in,可用 union all 来代替,提高查询效率

修改前:组合in sql

SELECT ***, ***, ***, ***, ***
FROM e_rating_info
WHERE rating_quantity <> 0 AND (***, ***)
IN (('***', '***'), ('***', '***'),
('***', '***'), ('***', '***'),
('***', '***'), ('***', '***'),
('***', '***'), ('***', '***'),
('***', '***'), ('***', '***'))
ORDER BY *** DESC

修改后:UNION ALL sql

<select id="queryRatingInfo" resultType="***">
        <foreach collection="ratingList" item="item" index="index" open="" separator="UNION ALL" close="">
            SELECT ***, ***, ***, ***, ***
            FROM e_rating_info
            WHERE rating_quantity &lt;&gt; 0
            AND country_code = #{item.***}
            AND asin = #{item.***}
        </foreach>
        ORDER BY *** DESC;
    </select>

另外,如果系统中进行了分表,一定要保证各个表的字段顺序一致。特别是修改的时候。否则,如果使用 *汇总查询结果,肯定是会有问题的…亲身踩坑。

补充:mysql中union和union all的区别

一、区别1:取结果的交集

1、union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;

2、union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;

二、区别2:获取结果后的操作

1、union: 会对获取的结果进行排序操作

2、union all: 不会对获取的结果进行排序操作

三、区别3:

1、union看到结果中ID=3的只有一条

select * from student2 where id < 4
union
select * from student2 where id > 2 and id < 6

2、union all 结果中ID=3的结果有两个

select * from student2 where id < 4
union all
select * from student2 where id > 2 and id < 6

总结

到此这篇关于mysql中union和union all的使用及注意事项的文章就介绍到这了,更多相关mysql union和union all内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql联合查询UNION和UNION ALL的使用介绍

    一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同.SQL UNION 语法: 复制代码 代码如下: SELECT column_name FROM table1UNIONSELECT column_name FROM table2 注释:默认地,UNION 操作符选取不同的值.如

  • 浅析mysql union和union all

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排

  • MySQL中使用or、in与union all在查询命令下的效率对比

    OR.in和union all 查询效率到底哪个快? 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于or.in? EXPLAIN SELECT * from employees where employees.first_NAME ='Georgi' UNION ALL SELECT * from employees where employees.first_NAME ='Bezalel' 这条语

  • MySQL如何使用union all获得并集排序

    项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求.之前的项目上有文章内容的展示功能,文章分为三个状态待发布.已发布.已下线. 他们在数据表中判断状态的字段(PROMOTE_STATUS)值分别为0.1.2.一开始的需求是文章只展示待发布和已发布,已发布排在待发布前面,并且两种状态下在根据自己的情况去排序.这样的实现比较简单,如下的order by语句就可以实现了. order by PROMOTE_STATUS desc ,SEQUENCE_ID desc.....

  • 简单了解MySQL union all与union的区别

    union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明: 创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(2) DEFAULT NULL, `num` int(3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DE

  • MySQL中UNION与UNION ALL的基本使用方法

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排

  • 5分钟了解MySQL5.7中union all用法的黑科技

    union all在MySQL5.6下的表现 Part1:MySQL5.6.25 [root@HE1 ~]# MySQL -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25-log MySQL Community Server (GPL) Copyright (c) 2000,

  • Mysql中limit的用法方法详解与注意事项

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心, mysql已经为我们提供了这样一个功能. SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须 是一个整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回 记录行的最大数目.初始记录行的偏

  • MySQL中创建表的三种方法汇总

    目录 CREATE TABLE CREATE TABLE … LIKE CREATE TABLE … SELECT 总结 SQL 标准使用 CREATE TABLE 语句创建数据表:MySQL 则实现了三种创建表的方法,支持自定义表结构或者通过复制已有的表结构来创建新表,本文给大家分别介绍一下这些方法的使用和注意事项. CREATE TABLE CREATE TABLE 语句的基本语法如下: CREATE TABLE [IF NOT EXISTS] table_name ( column1 da

  • MySQL中union和join语句使用区别的辨析教程

    union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同的(Schema of both sides of union should match.).也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据.说明一下union 和union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合

  • MySQL中Union子句不支持order by的解决方法

    本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写: select id,title from subjects where id>#some_id# order by id limit 1 union select id,title from subjects

  • MySQL中union和order by同时使用的实现方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY. SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC UNION SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score A

  • 详解MySQL中UNION的用法

    如果想选择其他几个表中的行或从一个单一的表作为一个单独的结果集行的几个集会,那么可以使用的UNION. UNION在MySQL4.0以上版本才能可以使用.本节说明如何使用它. 假设有两个表,潜在和实际的客户列表,供应商购买耗材合并所有三个表中的姓名和地址,来创建一个单一的邮件列表.UNION提供了一种方法做到这一点.假设三个表有以下内容: mysql> SELECT * FROM prospect; +---------+-------+------------------------+ | f

  • mysql中union和union all的使用及注意事项

    目录 1. sql中 union 和 union all 的用法 2. 注意事项 2.1.UNION 和 UNION ALL 内部的 SELECT 语句必须拥有相同数量的列 2.2.每条 SELECT 语句中列的顺序必须相同 3. union all 使用场景 补充:mysql中union和union all的区别 一.区别1:取结果的交集 二.区别2:获取结果后的操作 三.区别3: 总结 1. sql中 union 和 union all 的用法 如果我们需要将两个 select 语句的结果作

  • MySQL系列理解运用union(all)与limit及exists关键字教程

    目录 1.union:可以将查询结果相加 1)union all:不能去重 2)union:可以达到去重的效果. 2.limit:分页查询全靠它 1)对limit用法的一些说明 2)案例说明 3)通用的标准分页SQL 3.exists用法:又称"相关子查询" 1)带你理解exists的执行原理 2)案例演示 3)一张图说明exists子查询的原理 1.union:可以将查询结果相加 union用于将查询结果相加,尤其是将两张毫无关系的表中的数据,拼接在一起显示的时候. 但是有一个前提条

随机推荐