编程软件向来是直男思维,容不得一点模糊和偏差,常常是差之毫厘,谬以千里,我们必须要有扎实的功底,以及精益求精的态度,才能准确无误的进行数据检索或处理。面对相似相近的操作符必须清晰知道它的定义、用法及区别,才能高效顺畅的达成目的。废话不多说,我们就来聊聊 union和union all的那点事。
先来认识一下union:
定义:union操作符用于合并两个或多个 select 语句的结果集。
简单来说,就是将两个或多个目标表合并成一个表。其用法如下:
(1)被合并的目标表必须有相同的列数。
(2)被合并的目标表对应列的顺序相同。
(3)对应列必须有相同或相似的数据类型。
(4)对应列不必有相同的列名,合并后,第一个表的列名会覆盖其他表的列名。
那 union 和 union all 到底有什么区别和联系呢?
union 和 union all 的作用一样,都是合并两个或多个表。
区别在于union 是去重联结,如果两个目标表中有相同的行,结果表中只会取其中一行;而 union all 则是不去重联结,简单将目标表上下堆叠,保留所有条数。
举个例子更好理解。
数据库中现有两个年级的学生信息表,其中 Rose 同学成绩优异从一年级跳级到二年级,因此在两个学生表中都有她的信息 。
student_information_1
student_name | age | sex | grade |
Jack | 18 | 男 | 一年级 |
Rose | 19 | 女 | 一年级 |
student_information_2
s_name | s_age | s_sex | s_grade |
Rose | 19 | 女 | 二年级 |
Scarlett | 20 | 女 | 二年级 |
Rhett | 20 | 男 | 二年级 |
假设我们想得到所有年级学生的性别和年龄分布,该怎么处理呢?union or union all?
我们利用 union 进行合并,代码如下:
select student_name,age,sex
from student_information_1
union
select s_name,s_age,s_sex
from student_information_2
结果表为:
student_name | age | sex |
Jack | 18 | 男 |
Rose | 19 | 女 |
Scarlett | 20 | 女 |
Rhett | 20 | 男 |
我们再来看看利用 union all 进行合并,结果会怎样:
select student_name,age,sex
from student_information_1
union all
select s_name,s_age,s_sex
from student_information_2
student_name | age | sex |
Jack | 18 | 男 |
Rose | 19 | 女 |
Rose | 19 | 女 |
Scarlett | 20 | 女 |
Rhett | 20 | 男 |
由此可见,union 合并后将进行去重处理,只保留肉丝童鞋的一条信息;而 union all 则不会去重,简单的将 student_information_1和 student_information_2 中的信息取出后合并,因此出现两条 Rose 的信息。
到这里,各位看官应该清楚了union 和 union all 的用法和区别了吧~
如有其他看法,欢迎一起讨论~