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 set mysql> 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出来的结果集是什么样子有点不是很清楚. ...
随机推荐
- js 倒计时毫秒级别显示
<html> <head> <style> div{ width:100%; text-align:center; font-size: 14px; } </ ...
- C++面向对象高级编程(上)-Geekband
头文件和类声明 一定要注意使用防卫式的头文件声明: #ifndef _CLASSHEAD_ #define _CLASSHEAD_ . . . . #endif 基于对象和面向对象 : 基于对象 单一 ...
- __name__变量
再写项目过程中,将功能函数写在 if __name=="__main__":之外,执行代码写在之中,如下:如果在foo模块打印__name__为__main__,而如果在bin模 ...
- vue.js_07_vue-resource的请求方式
1.vue-resource 实现 get, post, jsonp请求 <body> <div id="app"> <input type=&quo ...
- 页面跳转不带 referrer的方法
如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer: <meta name="referrer" content="neve ...
- python基础---递归函数 知识点自查填空题
什么是递归函数:在函数中调()叫递归函数. 递归函数最大递归深度是997或998----是()设的限制. 注:如果递归次数太多,就不适合使用递归来解决问题. 递归的缺点: 占(). 递归的优点:会让代 ...
- PipeCAD 简介
PipeCAD 简介 PipeCAD的定位是中小型项目的管道设计软件,主要有管道建模.设备建模以及管道ISO图及平面图功能.程序的操作方式尽量参考PDMS,考虑灵活性.易于使用.如果用来和国内其他管道 ...
- CentOS 6.8 Linux系统U盘制作启动项
1.下载CentOS 6.8镜像文件: 2.下载地址:http://man.linuxde.net/download/CentOS_6_8 3.准备一个U盘,最好8G的: 4.下载UltraISO盘制 ...
- python生成VOC2007的类库
VOCAnnotation.py: # -*-coding:utf-8-*- from lxml import etree import os class VOCAnnotation(object): ...
- switch...case...之替换方案一
很多时候,当switch中有N个分支,且分支数已达10+,每个分支都是一个不小的方法体,那我们是不是应该考虑换一种方式来实现这个分支. 而我目前所能想到的是会用到如下几种方法. 1.Action 2. ...