MySQL学习(五) UNION与UNION ALL
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的更多相关文章
- MySql学习(五) —— 数据库优化理论篇(一)
一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...
- MySQL学习(五)
查询数据的学习与练习 建立一个表 CREATE TABLE goods ( `goos_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `cat_ ...
- mysql实体关系(mysql学习五)
实体关系 表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级 ...
- MySQL 学习五 SQL实用函数
0 select now() 显示当前时间. 1 select char_length('andyqan') 显示字符长度. 2 日期格式化 select date_format( ...
- MySQL学习(五)——使用JDBC完成用户表CRUD的操作
通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 1.使用properties配置文件 开 ...
- MySQL学习(六)——自定义连接池
1.连接池概念 用池来管理Connection,这样可以重复使用Connection.有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connect ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 【转】Mysql联合查询union和union all的使用介绍
Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 别人的的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
随机推荐
- 小程序页面传值e.currentTarget
将页面确定上的数值5传到js 微信官网 wtml: <view class="distpicker-btn"> <view class="distpic ...
- PHY过采样问题
什么频率下进行过采样 ?? 按时程序是LMDS时钟小于100M时会进行过程采样,实际上PHY的文档上也有明确的说明: The minimum operational data rate is 1.0 ...
- [solution] JZOJ-5458 质数
[solution] JZOJ-5458 质数 题面 Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X ...
- Go语言正则模块
基本使用 import "bytes" import "fmt" import "regexp" func main() { //这个测试一 ...
- Django基础和基本使用
Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或 ...
- C++回调:利用Sink
Sink的本质是利用C++的封装.继承.多态的面向对象来实现,从实现角度来说,更优于函数指针回调: // cbBysink.cpp : Defines the entry point for the ...
- Powershell渗透测试系列–进阶篇
原文来自:https://bbs.ichunqiu.com/thread-41561-1-1.html i春秋作家:anyedt 0×00 引言 经过基础篇的学习我们已经对powershell有了一个 ...
- js函数式编程——蹦床函数
概述 这是我在学习函数式编程的时候,关于递归,尾递归,相互递归和蹦床函数的一些心得,记下来供以后开发时参考,相信对其他人也有用. 参考资料:JavaScript玩转Clojure大法之 - Tramp ...
- Swift5 语言指南(十八) 可选链接
可选链接是一个查询和调用当前可选的可选项的属性,方法和下标的过程nil.如果optional包含值,则属性,方法或下标调用成功; 如果是可选的nil,则返回属性,方法或下标调用nil.多个查询可以链接 ...
- 影响 POST 请求文件上传失败的几个环节的配置(php + nginx)
写在前面 最近写一个 php 接口,接受上传的文件,发现文件只要超过 5m 以上就会无响应失败,最后发现是 shadowsocks 的 timeout 设置问题(我全程开了全局的 VPN),但一开始并 ...