MySQL-(联合查询-结果集合并)union和union all用法
1: 什么时候用union和union all ?
我们经常会碰到这样的应用,两个表的数据按照一定的查询条件查询出来以后,需要将结果合并到一起显示出来,这个时候就需要用到union和union all关键字来实现这样的功能,union和union all的主要区别是union all是把结果集直接合并在一起,而union 是将union all后的结果镜像一次distinct,去除重复的记录后的结果。
看下面的例子:
查询一:
查询二:
两个结果集进行union all为(直接将两个查询结果集合并):
两个结果集镜像union 运算结果为(两个结果集合并后进行去重/distinct):
当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
总结: 在xwwd项目中由于还款计划表(tb_laon_repayment)数据量巨大(数量2000万),
查询一条借款的还款计划时候巨慢,当时为了解决查询慢问题就建立了一张还款计划
备份表(tb_loan_repayment_his),将还款计划表tb_loan_repayment中的已经结清
的借款的还款计划数据导出1000万到了还款计划备份表tb_loan_repayment_his中,
这样做解决了还款计划表tb_loan_repayment中数据过大导致查看借款loan详情时展示
查询该笔借款loan的还款计划查询卡死的情况。 后来由于项目需要需要查询备份表中的数据,
于是对内管查看借款详情接口进行了优化升级。 获取具体某一条还款计划的时候首先查询
还款计划表tb_laon_repayment如果没有再去查询还款计划备份表tb_loan_repayment_his.
同时“借款管理”菜单中是去分页查询所有还款计划,为了数据完整性,
这里就采用了union联合查询tb_loan_repayment,和tb_tb_repayment_his表。
其他练习:
student表:
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP
TABLE
IF EXISTS `student`;
CREATE
TABLE
`student` (
`id`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`
name
`
varchar
(10)
DEFAULT
NULL
,
`age` tinyint(4)
DEFAULT
NULL
,
`classId`
int
(11)
DEFAULT
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT
INTO
`student`
VALUES
(
'1'
,
's1'
,
'20'
,
'1'
);
INSERT
INTO
`student`
VALUES
(
'2'
,
's2'
,
'22'
,
'1'
);
INSERT
INTO
`student`
VALUES
(
'3'
,
's3'
,
'22'
,
'2'
);
INSERT
INTO
`student`
VALUES
(
'4'
,
's4'
,
'25'
,
'2'
);
teacher表:
-- ----------------------------
-- Table structure for `teacher`
-- ----------------------------
DROP
TABLE
IF EXISTS `teacher`;
CREATE
TABLE
`teacher` (
`id`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`
name
`
varchar
(10)
DEFAULT
NULL
,
`age` tinyint(4)
DEFAULT
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT
INTO
`teacher`
VALUES
(
'1'
,
't1'
,
'36'
);
INSERT
INTO
`teacher`
VALUES
(
'2'
,
't2'
,
'33'
);
INSERT
INTO
`teacher`
VALUES
(
'3'
,
's3'
,
'22'
);
查询数据如下:
mysql>
SELECT
*
FROM
student;
+
----+------+-----+---------+
| id |
name
| age | classId |
+
----+------+-----+---------+
| 1 | s1 | 20 | 1 |
| 2 | s2 | 22 | 1 |
| 3 | s3 | 22 | 2 |
| 4 | s4 | 25 | 2 |
+
----+------+-----+---------+
4
rows
in
set
mysql>
SELECT
*
FROM
teacher;
+
----+------+-----+
| id |
name
| age |
+
----+------+-----+
| 1 | t1 | 36 |
| 2 | t2 | 33 |
| 3 | s3 | 22 |
+
----+------+-----+
3
rows
in
set
使用 UNION的结果:
mysql>
SELECT
id,
name
, age
FROM
student
->
UNION
-- 与UNION DISTINCT相同
->
SELECT
id,
name
, age
FROM
teacher;
+
----+------+-----+
| id |
name
| age |
+
----+------+-----+
| 1 | s1 | 20 |
| 2 | s2 | 22 |
| 3 | s3 | 22 |
| 4 | s4 | 25 |
| 1 | t1 | 36 |
| 2 | t2 | 33 |
+
----+------+-----+
6
rows
in
set
使用 UNION ALL的结果:
mysql>
SELECT
id,
name
, age
FROM
student
->
UNION
ALL
->
SELECT
id,
name
, age
FROM
teacher;
+
----+------+-----+
| id |
name
| age |
+
----+------+-----+
| 1 | s1 | 20 |
| 2 | s2 | 22 |
| 3 | s3 | 22 |
| 4 | s4 | 25 |
| 1 | t1 | 36 |
| 2 | t2 | 33 |
| 3 | s3 | 22 |
+
----+------+-----+
7
rows
in
set
其实联合查询跟字段的类型无关,只要求每个SELECT查询的字段数一样,能对应即可,如:
mysql>
SELECT
id,
name
, age
FROM
student
-- 这里可以看出第一个SELECT语句中的字段名称被用作最后结果的字段名
->
UNION
->
SELECT
age,
name
, id
FROM
teacher;
+
----+------+-----+
| id |
name
| age |
+
----+------+-----+
| 1 | s1 | 20 |
| 2 | s2 | 22 |
| 3 | s3 | 22 |
| 4 | s4 | 25 |
| 36 | t1 | 1 |
| 33 | t2 | 2 |
| 22 | s3 | 3 |
+
----+------+-----+
7
rows
in
set
在联合查询中,当使用ORDER BY的时候,需要对SELECT语句添加括号,并且与LIMIT结合使用才生效,如:
mysql> (
SELECT
classId, id,
name
, age
FROM
student
WHERE
classId = 1
ORDER
BY
age
DESC
)
->
UNION
-> (
SELECT
classId, id,
name
, age
FROM
student
WHERE
classId = 2
ORDER
BY
age);
+
---------+----+------+-----+
| classId | id |
name
| age |
+
---------+----+------+-----+
| 1 | 1 | s1 | 20 |
| 1 | 2 | s2 | 22 |
| 2 | 3 | s3 | 22 |
| 2 | 4 | s4 | 25 |
+
---------+----+------+-----+
4
rows
in
set
此时classId为1的学生并没有按照年龄进行降序,结合LIMIT后:
mysql> (
SELECT
classId, id,
name
, age
FROM
student
WHERE
classId = 1
ORDER
BY
age
DESC
LIMIT 2)
->
UNION
-> (
SELECT
classId, id,
name
, age
FROM
student
WHERE
classId = 2
ORDER
BY
age);
+
---------+----+------+-----+
| classId | id |
name
| age |
+
---------+----+------+-----+
| 1 | 2 | s2 | 22 |
| 1 | 1 | s1 | 20 |
| 2 | 3 | s3 | 22 |
| 2 | 4 | s4 | 25 |
+
---------+----+------+-----+
4
rows
in
set
转载链接:
https://www.cnblogs.com/ganbo/p/10803786.html
https://www.cnblogs.com/huangminwen/p/9261298.html
MySQL-(联合查询-结果集合并)union和union all用法相关推荐
- mysql联合查询(UNION)
mysql联合查询(UNION) 下面我就直接po截图和代码 #联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果语法: 查询语句1 union 查询语句2 union ... ...
- MySQL联合查询语法内联、左联、右联、全联
MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户id,用户名,密码) userid username password 1 jac ...
- Oracle/mysql联合查询union、union all
若无特殊说明,oracle与mysql均适用 使用场景 union.union all关键字用户将两个select查询结果集合并成一个结果集,例如:一个旧系统使用a表,同样的信息但是新系统使用了b表, ...
- mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)
MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...
- mysql联合查询注入防护,SQL注入之BypassWaf
0x00 前言 无论是在CTF比赛中还是在现实项目中,都会遇到各种各样的waf,没有绝对安全的系统,仔细的研究总会发现被"漏掉"的地方. 最近在研究过waf的技巧,期间还是很有趣的 ...
- mysql联合查询和关联查询
最近面试中,Java的都会考察数据库,写SQL语句,大多数就问关联查询,索引 看看下面三个关联查询的 SQL 语句有何区别?SELECT * FROM score, student WHERE sco ...
- mysql联合查询查询语句_mysql多表联合查询语句是什么
mysql多表联合查询语句是:使用select语句,union关键词,语法为[select 语句1 union [union 选项] select 语句2 union [union 选项] selec ...
- mysql联合查询怎么加子查询_MySQL数据库 —子查询,联合查询
编程之家收集整理的这篇文章主要介绍了MySQL数据库 -子查询,联合查询,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. <MySQL数据库 -子查询,联合查询>要点: 本文 ...
- mysql联合查询sql优化
我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...
- 五、MySQL联合查询学习笔记 + 查询总结(详解)
9. 联合查询 union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 UNION 查询语句2 UNION - 应用场景:要查询的结果来自多个表,且多个表之间没有直接的连接关系 ...
最新文章
- winxp运行html代码,关于WinXP系统实现自动化运行的操作技巧
- 卷积、傅立叶变换、拉普拉斯变换、Z变换
- 【NOIP2017模拟6.25】小W的动漫
- 论文浅尝 | 利用 RNN 和 CNN 构建基于 FreeBase 的问答系统
- 多线程实现生产者消费者
- js判断是否为微信浏览器
- python基础:字符串操作
- Tolua 报错cannot load incompatible bytecode
- 风控中英文术语手册(银行_消费金融信贷业务)
- 电力101/104规约文件服务报文浅析
- 场景法设计测试用例ATM机取款问题
- 回声状态网络(ESN)教程
- nrf51822+rfx2401c系统板(开源原理图、PCB)
- prism在java_Prism 框架应用-基础知识篇
- linux嵌入式红绿灯,嵌入式上机课设(红绿灯)..doc
- 使用微软官方工具下载安装Windows10系统
- Guava 常用 API
- 基于单片机的电子秤(计价/播报)电路设计(#0223)
- Python如何对数组求导(差分)?
- 【mySql】利用笛卡尔积生成连续数字
热门文章
- アプリケーションコンポーネント(大分類)
- mysql计算三角形斜边_下图中,底边和高都是6厘米的等腰三角形,分别以高的长为直径画圆,以底的一半长为直径画两个半圆,求阴影部分...
- 操作系统真象还原第1章:部署工作环境
- 高精度加减法的应用——试解大数之和
- 【Django毕业设计源码】Python考试题库练习系统
- 英语----非谓语的另类运用:独立主格
- 邓亚萍大手笔一掷20亿研发即刻搜索2年就倒闭带来的思考
- 新建一个文本文档,将后缀改为html,却还是文本文档格式,且后缀有txt
- 白岩松:平静才是真正的奢侈品。
- 南邮ctf-异性相吸