UNION用于把来自许多SELECT语句的结果组合到一个结果集合中,也叫联合查询。

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]

在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。

当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。

数据准备

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

MySQL学习(五) UNION与UNION ALL的更多相关文章

  1. MySql学习(五) —— 数据库优化理论篇(一)

    一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...

  2. MySQL学习(五)

    查询数据的学习与练习 建立一个表 CREATE TABLE goods ( `goos_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `cat_ ...

  3. mysql实体关系(mysql学习五)

    实体关系  表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级 ...

  4. MySQL 学习五 SQL实用函数

    0 select now() 显示当前时间. 1 select char_length('andyqan')   显示字符长度. 2 日期格式化         select date_format( ...

  5. MySQL学习(五)——使用JDBC完成用户表CRUD的操作

    通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 1.使用properties配置文件 开 ...

  6. MySQL学习(六)——自定义连接池

    1.连接池概念 用池来管理Connection,这样可以重复使用Connection.有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connect ...

  7. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. 【转】Mysql联合查询union和union all的使用介绍

    Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...

  9. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  10. 别人的的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

随机推荐

  1. 【python-appium】手机一直提示重新安装settings unlock 输入法等 注释掉以下代码

    注释掉目录:C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\android\android.js this.initUnic ...

  2. [opentwebst]一个简单的登陆脚本

    这个是个简单的vbs脚本,使用opentwebst进行录制 'Use the command line below to launch the script (or just double click ...

  3. django扩展User认证系统

    第一种方法proxy 如果你对Django提供的字段,以及验证的方法都比较满意,没有什么需要改的.但是只是需要在他原有的基础之上增加一些操作的方法.那么建议使用这种方式.示例代码如下: #在model ...

  4. day15_雷神_前端03

    # 前端 day03 内容回顾 javascript: 1.ECMAScript5.0 es6(阮一峰) es7 es8 (1)声明变量 var let (2)内置函数 Date Math.rando ...

  5. kaldi的TIMIT实例一

    TIMIT语音库是IT和MIT合作音素级别标注的语音库,用于自动语音识别系统的发展和评估,包括来自美式英语,8个地区方言,630个人. 每个人读10个句子,每个发音都是音素级别.词级别文本标注,16k ...

  6. Android ------------------ 带边框的圆角矩形

    <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...

  7. 7.ViewPagerIndicator

     ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用在应用初始化的介绍页面</item> ...

  8. kaili 安装中文输入法

    kaili 安装中文输入法 更换为国内可用的源: vim /etc/apt/sources.list 添加以下内容: deb http://mirrors.ustc.edu.cn/kali sana ...

  9. Data - 关于大数据

    历史与趋势 大数据的前世今生:诞生.发展.未来? 如何利用数据赚钱?大数据价值变现的10种商业模式及利弊分析 10大行业大数据应用痛点及解决策略 大数据凉了?不,流式计算浪潮才刚刚开始 概念与定义 关 ...

  10. 人生苦短之---第一个Python程序

    第一个 Python 程序 目标 第一个 HelloPython 程序 Python 2.x 与 3​​.x 版本简介 执行 Python 程序的三种方式 解释器 —— python / python ...