Union All 使用注意事项和字段顺序不一致导致的异常
使用注意,先说结果:
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 使用注意事项和字段顺序不一致导致的异常的更多相关文章
- 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题
一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...
- Mysql中字段类型不一致导致索引无效
修改后 详细见楼下链接 http://ustb80.blog.51cto.com/6139482/1287847
- [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...
- Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结
转自:http://www.111cn.net/database/mysql/71648.htm 1.增加一个字段 代码如下 复制代码 //增加一个字段,默认为空 alter table user ...
- mysql 添加字段、删除字段、调整字段顺序 转
ALTER TABLE — 更改表属性添加字段: alter table `user_movement_log`Add column GatewayId int not null default 0 ...
- MySQL 字段常用操作 添加,修改,删除,调整字段顺序
整理备忘: 添加字段:alter table 表名Add column 字段名 字段类型 默认值 AFTER 字段名 (在哪个字段后面添加) 例子: alter table appstore_sou ...
- sqlmap映射继承机制及映射字段顺序与SQL查询字段顺序无关
<typeAlias alias="TblSpPartsinfo" type="com.bn.car.biz.supply.dao.po.PartsInfoPO&q ...
- 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题
1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...
- oracle数据库调整字段顺序
oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034
随机推荐
- c++ string类基本使用
初始化用法 #include <iostream> #include "string" using namespace std; void main() { strin ...
- 04_Returners组件:返回jobid的结果到mysql
1.前期调研 0.环境 salt 2019 python3.6 很重要 [root@IP ~]# salt-call --versions-report Salt Version: Salt: 20 ...
- 边学边体验django--表格
在模板的末尾,我们增加一个rlt记号,为表格处理结果预留位置. 表格后面还有一个{% csrf_token %}的标签.csrf全称是Cross Site Request Forgery.这是Djan ...
- SIGAI深度学习第八集 卷积神经网络2
讲授Lenet.Alexnet.VGGNet.GoogLeNet等经典的卷积神经网络.Inception模块.小尺度卷积核.1x1卷积核.使用反卷积实现卷积层可视化等. 大纲: LeNet网络 Ale ...
- IO 的底层实现问题
最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理. IO涉及到的底层的概念大致如下: 1) 缓冲区操作.2) 内核空间与用户空间.3) 虚拟内存.4) 分页技术. 一,虚拟存储器 虚 ...
- luogu 2943 [USACO09MAR]清理Cleaning Up 动态规划
非常巧妙的动态规划. 你会发现每一个区间地颜色种类不能超过 $\sqrt n$, 所以可以直接枚举区间颜色种类. 令这个为 $pos[j],$ 然后考虑如何去更新这个东西就行了. Code: #inc ...
- KiCad:Cursor Ghosting
造冰箱的大熊猫@cnblogs 2019/8/11 装下KiCad学习下,结果鼠标在界面上划过时,留下一串鼠标残影,原来英文管这个叫“cursor ghosting”. 解决方法:依旧粗暴简单,从官网 ...
- [Luogu] LCA
https://www.luogu.org/problemnew/show/P4211 baoli #include <iostream> #include <cstdio> ...
- 第一章:Python数据分析前的基础铺垫
本节概要 - 数据类型 - 数据结构 - 数据的常用操作方法 数据类型 基础铺垫 定义 我们搞数据时,首先要告诉Python我们的数据类型是什么 数值型:直接写一个数字即可 逻辑型:True,Fals ...
- UVALive 3716 DNA Regions ——(式子变形)
一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...