博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL学习(五) UNION与UNION ALL
阅读量:6976 次
发布时间:2019-06-27

本文共 4004 字,大约阅读时间需要 13 分钟。

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 setmysql> 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

 

转载于:https://www.cnblogs.com/huangminwen/p/9261298.html

你可能感兴趣的文章
eclipse workspace
查看>>
vue 引用公共方法(例子:截取字符串固定字数,其余显示...)
查看>>
毫秒数转日期
查看>>
访问修饰符
查看>>
【FLEX教程】#008 开发中的问题笔记(慢更…)
查看>>
JQuery+PHP的AJAX封装
查看>>
爬虫大作业-爬区a9vg电玩部落ps4专区
查看>>
[Android Memory] Android系统中查看某个应用当前流量的方法
查看>>
Android的图形显示原理(GDI)一
查看>>
CORS跨域请求限制-options预检请求
查看>>
第四章 软件架构演化
查看>>
Vsftp给每个用户建立单独的配置文件
查看>>
MySQL——修改root密码的4种方法(以windows为例)
查看>>
sublime搜索和替换--多文件搜索替换
查看>>
(七):处理MFC
查看>>
【算法拾遗】大数相加(不开辟额外空间)
查看>>
Python正则表达式精讲
查看>>
Python——Beautiful Soup 4.2.0 中文文档
查看>>
Python字符串拼接、截取及替换方法总结
查看>>
3.Session安装配置
查看>>