MySQL学习-- UNION与UNION ALL
UNION用于把来自许多SELECT语句的结果组合到一个结果集合中,也叫联合查询。
|
1
2
3
4
5
|
SELECT ...UNION [ALL | DISTINCT]SELECT ...[UNION [ALL | DISTINCT]SELECT ...] |
在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。
当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
数据准备
student表
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
-- ------------------------------ 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表
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-- ------------------------------ 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'); |
查询数据如下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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 setmysql> SELECT * FROM teacher;+----+------+-----+| id | name | age |+----+------+-----+| 1 | t1 | 36 || 2 | t2 | 33 || 3 | s3 | 22 |+----+------+-----+3 rows in set |
使用 UNION的结果
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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的结果
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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查询的字段数一样,能对应即可,如
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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结合使用才生效,如
|
1
2
3
4
5
6
7
8
9
10
11
12
|
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后
|
1
2
3
4
5
6
7
8
9
10
11
12
|
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 |
MySQL学习-- UNION与UNION ALL的更多相关文章
- 【转】Mysql联合查询union和union all的使用介绍
Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...
- MySQL UNION 与 UNION ALL 语法与用法
MySQL UNION 语法 MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中.语法为: SELECT column,... FROM table1 UNION [ ...
- MySQL中UNION和UNION ALL的使用
在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后 ...
- MySQL全连接(Full Join)实现,union和union all用法
MySQL本身不支持你所说的full join(全连接),但可以通过union来实现 ,下面是一个简单测试,可以看看: mysql> CREATE TABLE a(id int,name cha ...
- Mysql联合查询UNION和UNION ALL的使用介绍
UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相 ...
- mysql union 与 union all 语法及用法
1.mysql union 语法 mysql union 用于把来自多个select 语句的结果组合到一个结果集合中.语法为: select column,......from tabl ...
- MySQL的or/in/union与索引优化
转载自:MySQL的or/in/union与索引优化 https://blog.csdn.net/zhangweiwei2020/article/details/80005590 假设订单业务表结构为 ...
- 【连接查询】mySql多表连接查询与union与union all用法
1.准备两个表 表a: 结构: mysql> desc a; +-------+-------------+------+-----+---------+-------+ | Field | T ...
- MySQL 常用语法 之 UNION与UNION ALL
下面讲一下mySql中的union和union all 的功能以及区别 A union B 是将表A的数据和表B的数据连接成一张表,前提是查询的两张表的列数一定要一样否则出错. A union all ...
- Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
转载来源 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚. ...
随机推荐
- CentOS安装Eclipse luna
1 解压 Eclipse luna到/opt tar -zxvf eclipse-java-luna-SR1-linux-gtk-x86_64.tar.gz -C /opt 2 创建软链接 ln ...
- add-apt-repository ppa:<ppa_name>
add-apt-repository: add-apt-repository 是由 python-software-properties 这个工具包提供的 所以要先安装python-software- ...
- Redis学习笔记03-持久化
redis是一个内存型数据库,这就意味着,当主机重启或者宕机时,内存中的数据会被清空,redis可能会丢失数据.为了保存数据,实现数据持久化就必须要有一种机制,可以将redis数据库的数据保留在硬盘上 ...
- python学习笔记3_数据载入、存储及文件格式
一.丛mysql数据库中读取数据 import pandas as pdimport pymysqlconn = pymysql.connect( host = '***', user = '***' ...
- retrying模块的使用
安装模块:pip3 install retrying 使用方式: 使用retrying模块提供的retry模块 通过装饰器的方式使用,让装饰器的函数反复的执行 retry可以传入参数stop_max_ ...
- 洛谷P4244 [SHOI2008]仙人掌图 II
传送门 首先不考虑带环的仙人掌,如果只是一棵普通的树,可以通过dp求每棵子树中的最长链和次长链求树的直径. 那么如果dfs的时候遇到了环,应该用环上的两点挂着的最长链加上两点间的距离来更新树的直径,并 ...
- 2018-12-15-VisualStudio-通过-EditorBrowsable-隐藏不开放的属性或方法
title author date CreateTime categories VisualStudio 通过 EditorBrowsable 隐藏不开放的属性或方法 lindexi 2018-12- ...
- HDFS 冗余数据保存
- Win10操作系统安装—U盘作为启动盘—系统安装到固态硬盘中
利用U盘作为启动盘安装win10操作系统 1.U盘制作为启动盘,制作工具,我选择的是大白菜(个人觉得还是很好用的) 大白菜http://www.bigbaicai.com/rjjc/syjc/3269 ...
- Eclipse:Eclipse插件开发全套教程
分享是美德,作者为Eclipse核心工程师之一,全英文版,有不明白的地方欢迎探讨和咨询. http://www.vogella.com/tutorials/eclipse.html