使用注意,先说结果:

UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是:

  • UNION 内部的 SELECT 语句必须拥有相同数量的列;
  • 列也必须拥有相似的数据类型(实际非必须);
  • 同时,每条 SELECT 语句中列的顺序必须相同。

一、表结构数据准备如下:

1.1 test_union_1

结构:

CREATE TABLE `test_union_1` (
`one` varchar(255) DEFAULT NULL,
`two` varchar(255) DEFAULT NULL,
`three` varchar(255) DEFAULT NULL,
`four` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

数据:

1.2 test_union_2

结构:

CREATE TABLE `test_union_2` (
`four` varchar(255) DEFAULT NULL,
`three` varchar(255) DEFAULT NULL,
`two` varchar(255) DEFAULT NULL,
`one` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

数据:

两表数据一致,字段一致,只是字段顺序不同。

test_union_1的顺序:one,two,three,four

test_union_2 的顺序:four,three,two,one

二、验证

2.1、验证:UNION 内部的 SELECT 语句必须拥有相同数量的列;

2.2、验证:列也必须拥有相似的数据类型(实际非必须);

这个实际非必须。

修改表test_union_2 结构如下:String类型改为int类型。

CREATE TABLE `test_union_2` (
`four` int(255) DEFAULT NULL,
`three` int(255) DEFAULT NULL,
`two` int(255) DEFAULT NULL,
`one` int(255) DEFAULT NULL
) ENGINE = InnoDB CHARSET = latin1;

查询:

SELECT *
FROM (
SELECT one, two, three, four
FROM test_union_1
UNION ALL
SELECT one, two, three, four
FROM test_union_2
) T;

结果:

所以,实际不是字段类型必须一致,只要可以转换即可。具体转换逻辑暂时不清楚,后续遇到了再搞。

2.3、验证:每条 SELECT 语句中列的顺序必须相同(亲身踩坑)。

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

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

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

测试如下:表顺序对结果的影响

2.1 test_union_1 UNION ALL test_union_2

SELECT *
FROM (
SELECT *
FROM test_union_1
UNION ALL
SELECT *
FROM test_union_2
) T;

结果:

可发现:结果字段是test_union_1的字段顺序:one,two,three,four

2.2 test_union_2 UNION ALL test_union_1

SELECT *
FROM (
SELECT *
FROM test_union_2
UNION ALL
SELECT *
FROM test_union_1
) T;

结果:

可发现:结果字段是test_union_2的字段顺序:four,three,two,one

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

我们上面以*来表示顺序的不同,其实你写成不同顺序的字段结果一致。我亲测如此,但是不重复贴结果了。

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

Union All 使用注意事项和字段顺序不一致导致的异常的更多相关文章

  1. 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题

    一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...

  2. Mysql中字段类型不一致导致索引无效

    修改后 详细见楼下链接 http://ustb80.blog.51cto.com/6139482/1287847

  3. [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序

    文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...

  4. Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结

    转自:http://www.111cn.net/database/mysql/71648.htm 1.增加一个字段  代码如下 复制代码 //增加一个字段,默认为空 alter table user ...

  5. mysql 添加字段、删除字段、调整字段顺序 转

    ALTER TABLE — 更改表属性添加字段: alter table `user_movement_log`Add column GatewayId int  not null default 0 ...

  6. MySQL 字段常用操作 添加,修改,删除,调整字段顺序

    整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型  默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...

  7. sqlmap映射继承机制及映射字段顺序与SQL查询字段顺序无关

    <typeAlias alias="TblSpPartsinfo" type="com.bn.car.biz.supply.dao.po.PartsInfoPO&q ...

  8. 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题

    1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...

  9. oracle数据库调整字段顺序

    oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034

随机推荐

  1. Jquery的toggle()与trigger()方法

    我一直分不清楚toggle()与trigger()两个各自的作用,所以今天抽时间记录一些,以加深印象. 1.toggle() 定义和用法: toggle() 方法切换元素的可见状态.如果被选元素可见, ...

  2. java中VO的使用(组成复杂的实体类)

    https://blog.csdn.net/G0_hw/article/details/78326359

  3. java上传文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...

  4. Cogs 1695. 梦游仙境(分块)

    梦游仙境 ★☆ 输入文件:XTTMYXJ.in 输出文件:XTTMYXJ.out 简单对比 时间限制:5 s 内存限制:512 MB [题目描述] 在Asm.def仍然在与人工智能进行艰苦的斗争时,雪 ...

  5. nginx下载 并将vue项目部署上去

    这是一个比较全的nginx配置说明:新手可以先忽略,直接往下看:https://www.cnblogs.com/findbetterme/p/11289273.html nginx官网下载地址:htt ...

  6. HDU 4374 One hundred layer(单调队列DP)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=116242#problem/E 题意:差不多就是男人勇下百层的游戏.从第一层到最 ...

  7. 修复grub rescue问题

    前几天,手欠点了下win10的系统升级,直接从17.09升级到了19.3虽然也有些波折,总体顺利,以为一切都完事大吉之时,重启系统,原来,万恶的win10给我挖好了坑,早等着我呢.我去,千万只cnm脑 ...

  8. elasticsearch各种服务链接

    查看elasticsearch信息http://localhost:9200/ 查看某个索引信息http://localhost:9200/index_name例如:http://localhost: ...

  9. PyTricks-Differebt ways to test multiple flags at once in

    x, y, z = 0, 1, 0 if x == 1 or y == 1 or z == 1: print('passed') if 1 in (x, y, z): print('passed') ...

  10. 解决Maven的jar包冲突问题

    1. 问题描述 控制台说:无法将 com.zpx.servlet.MyServlet 识别为 javax.servlet.Servlet 2. 问题原因 Maven的一个核心功能就是一键构建,所以Ma ...