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,

  `namevarchar(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,

  `namevarchar(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 |

+----+------+-----+---------+

rows in set

mysql> SELECT FROM teacher;

+----+------+-----+

| id | name | age |

+----+------+-----+

|  1 | t1   |  36 |

|  2 | t2   |  33 |

|  3 | s3   |  22 |

+----+------+-----+

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 |

+----+------+-----+

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 |

+----+------+-----+

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 |

+----+------+-----+

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 |

+---------+----+------+-----+

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 |

+---------+----+------+-----+

rows in set

转载链接:https://www.cnblogs.com/ganbo/p/10803786.html

https://www.cnblogs.com/huangminwen/p/9261298.html

MySQL-(联合查询-结果集合并)union和union all用法相关推荐

  1. mysql联合查询(UNION)

    mysql联合查询(UNION) 下面我就直接po截图和代码 #联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果语法: 查询语句1 union 查询语句2 union ... ...

  2. MySQL联合查询语法内联、左联、右联、全联

    MySQL联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户id,用户名,密码)    userid   username  password 1   jac ...

  3. Oracle/mysql联合查询union、union all

    若无特殊说明,oracle与mysql均适用 使用场景 union.union all关键字用户将两个select查询结果集合并成一个结果集,例如:一个旧系统使用a表,同样的信息但是新系统使用了b表, ...

  4. mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)

    MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...

  5. mysql联合查询注入防护,SQL注入之BypassWaf

    0x00 前言 无论是在CTF比赛中还是在现实项目中,都会遇到各种各样的waf,没有绝对安全的系统,仔细的研究总会发现被"漏掉"的地方. 最近在研究过waf的技巧,期间还是很有趣的 ...

  6. mysql联合查询和关联查询

    最近面试中,Java的都会考察数据库,写SQL语句,大多数就问关联查询,索引 看看下面三个关联查询的 SQL 语句有何区别?SELECT * FROM score, student WHERE sco ...

  7. mysql联合查询查询语句_mysql多表联合查询语句是什么

    mysql多表联合查询语句是:使用select语句,union关键词,语法为[select 语句1 union [union 选项] select 语句2 union [union 选项] selec ...

  8. mysql联合查询怎么加子查询_MySQL数据库 —子查询,联合查询

    编程之家收集整理的这篇文章主要介绍了MySQL数据库 -子查询,联合查询,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. <MySQL数据库 -子查询,联合查询>要点: 本文 ...

  9. mysql联合查询sql优化

    我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...

  10. 五、MySQL联合查询学习笔记 + 查询总结(详解)

    9. 联合查询 union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 UNION 查询语句2 UNION - 应用场景:要查询的结果来自多个表,且多个表之间没有直接的连接关系 ...

最新文章

  1. winxp运行html代码,关于WinXP系统实现自动化运行的操作技巧
  2. 卷积、傅立叶变换、拉普拉斯变换、Z变换
  3. 【NOIP2017模拟6.25】小W的动漫
  4. 论文浅尝 | 利用 RNN 和 CNN 构建基于 FreeBase 的问答系统
  5. 多线程实现生产者消费者
  6. js判断是否为微信浏览器
  7. python基础:字符串操作
  8. Tolua 报错cannot load incompatible bytecode
  9. 风控中英文术语手册(银行_消费金融信贷业务)
  10. 电力101/104规约文件服务报文浅析
  11. 场景法设计测试用例ATM机取款问题
  12. 回声状态网络(ESN)教程
  13. nrf51822+rfx2401c系统板(开源原理图、PCB)
  14. prism在java_Prism 框架应用-基础知识篇
  15. linux嵌入式红绿灯,嵌入式上机课设(红绿灯)..doc
  16. 使用微软官方工具下载安装Windows10系统
  17. Guava 常用 API
  18. 基于单片机的电子秤(计价/播报)电路设计(#0223)
  19. Python如何对数组求导(差分)?
  20. 【mySql】利用笛卡尔积生成连续数字

热门文章

  1. アプリケーションコンポーネント(大分類)
  2. mysql计算三角形斜边_下图中,底边和高都是6厘米的等腰三角形,分别以高的长为直径画圆,以底的一半长为直径画两个半圆,求阴影部分...
  3. 操作系统真象还原第1章:部署工作环境
  4. 高精度加减法的应用——试解大数之和
  5. 【Django毕业设计源码】Python考试题库练习系统
  6. 英语----非谓语的另类运用:独立主格
  7. 邓亚萍大手笔一掷20亿研发即刻搜索2年就倒闭带来的思考
  8. 新建一个文本文档,将后缀改为html,却还是文本文档格式,且后缀有txt
  9. 白岩松:平静才是真正的奢侈品。
  10. 南邮ctf-异性相吸