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出来的结果集是什么样子有点不是很清楚. ...
随机推荐
- 04-6-queryselect
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CodeChef TRIPS-Children Trips 树上分块
参考文献国家集训队2015论文<浅谈分块在一类在线问题的应用>-邹逍遥 题目链接 题目大意 一棵n个节点的树,树的每条边长度为1或2,每次询问x,y,z. 要求输出从x开始走,每次只能走到 ...
- Django中间件分析
SessionMiddleware 浏览器会发送包含SESSION_COOKIE_NAME的的Cookie 中间件从django_session中按照SESSION_COOKIE_NAME取出存入的s ...
- 微信小程序slider应用,可加减的slider控制
<view class="control-w "> <block wx:for="{{controls}}" wx:key="id& ...
- ES6 class继承
ES6 class继承 class类的继承 class可以通过extends关键字实现继承,这笔ES5的通过修改原型连实现继承要清晰和方便很多. class Point{ } class ColorP ...
- c语言学习笔记 函数数组传递笔记
今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...
- mysql 如果处理货币金钱类型
我们知道,数据库存金钱类型可以float.double.decimal ,相比较而已decimal 最好用. 好吧, 我们公司用的分为单位, 类型 用bigint 存取,操作的时候到是很方便, 展示的 ...
- Java程序员面试题收集(5)
Java基础方面: 1.作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ ...
- tensorflow object detection faster r-cnn 中keep_aspect_ratio_resizer是什么意思
如果小伙伴的英语能力强可以直接阅读这里:https://stackoverflow.com/questions/45137835/what-the-impact-of-different-dimens ...
- springboot之jpa(简述)
1.maven引入jar包(jpa和mysql) <dependency> <groupId>org.springframework.boot</groupId> ...