带例子详解Sql中Union和Union ALL的区别

目录
  • 前言
  • 提前准备
  • 测试
    • Union
    • Union ALL
    • Union
    • Union All
    • union
    • Union All
  • 最后

前言

一段时间没有用Union和Union,再用的时候忘了怎么用了。。。所以做一篇文章来记录自己学Union和Union的经历。

提前准备

在Sql Server 创建两张表,下面是创建表sql语句。

create table Student1(
   Id varchar(50) not null,
   Name varchar(50) not null,
   Age int not null
)
create table Student2(
   Id varchar(50) not null,
   Name varchar(50) not null,
   Age int not null
)
insert into Student1 values(1,'学生A',13)
insert into Student1 values(2,'学生B',13)
insert into Student1 values(3,'学生C',13)
insert into Student1 values(4,'学生D',13)

insert into Student2 values(1,'学生A',13)
insert into Student2 values(2,'学生E',13)
insert into Student2 values(3,'学生F',13)
insert into Student2 values(4,'学生D',13)

创建两张一摸一样的表并插入数据。

测试

UNION:合并两个或三个以上的Select语句的结果集,合并之后的结果集不包含重复的数

UNION ALL:合并两个或三个以上的Select语句的结果集,合并之后的结果集可以包含重复的数 。

可以看出,Union和Union All 的区别在于是否“包含重复数”,而重复数又指的是什么呢?当出现一条数据与另一条数据的所有列数据完全相同的情况,那么就称这条数据为重复数,下面拿例子来演示

Union

select * from Student1
union
select * from Student2

结果:

id为2、3的出现了两条,是因为Student1 id为2的Name列数据和Student2 id为2的Name列数据不同 (Student1为学生B,Student为学生E),并不能算重复数。
id为1、4、5只出现一次,是因为Student1和Student2中id为1、4、5的列数据完全相同,所以算重复数

Union ALL

select * from Student1
union ALL
select * from Student2

union all 就无需顾及到重复数,直接把两个表的结果集合并一起展示就OK了。
除此之外,还有几种情况

1.当表Student1和表Student2字段数量不同的情况下,使用Union和Union ALL

create table Student3(
   Id varchar(50) not null,
   Name varchar(50) not null,
   Age int not null
)
create table Student4(
   Id varchar(50) not null,
   Name varchar(50) not null
)

insert into Student3 values(1,'学生A',13)
insert into Student3 values(2,'学生B',13)
insert into Student3 values(3,'学生C',13)
insert into Student3 values(4,'学生D',13)

insert into Student4 values(1,'学生A')
insert into Student4 values(2,'学生E')
insert into Student4 values(3,'学生F')
insert into Student4 values(4,'学生D')

Student3 和Student4的字段不一样,Student3表比Student4表多一个Age字段

Union

select * from Student3
union
select * from Student4

Union All

select * from Student3
union ALL
select * from Student4

测试结果显示:只有当涉及的几个表的列具有相同的数量,才能使用Union和UnionALL

2.当表A和表B的列相同,但是列名不一致的情况,使用Union和Union ALL

create table Student3(
   Id varchar(50) not null,
   NameTest varchar(50) not null,
   Age int not null
)
create table Student4(
   Id varchar(50) not null,
   Name varchar(50) not null,
   Age int not null
)

insert into Student3 values(1,'学生A',13)
insert into Student3 values(2,'学生B',13)
insert into Student3 values(3,'学生C',13)
insert into Student3 values(4,'学生D',13)

insert into Student4 values(1,'学生A',13)
insert into Student4 values(2,'学生B',13)
insert into Student4 values(3,'学生C',13)
insert into Student4 values(4,'学生D',13)

这里Student3的第二个栏位是NameTest,而Student4第二个栏位是Name,Student3和Student4的数据一样。

union

select * from Student3
union
select * from Student4

Union All

select * from Student3
union  ALL
select * from Student4

测试结果显示:如果当列数量一样,列名不相同,那么列名优先显示先执行Select语句的结果集的列名

最后

上面进行了对 “重复数”、“列数不同”、“列数相同,但列名不相同”进行测试,我得出了自己认为的答案

到此这篇关于带例子详解Sql中Union和Union ALL的区别的文章就介绍到这了,更多相关Sql Union和Union ALL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中UNION与UNION ALL的基本使用方法

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排

  • MySQL如何使用union all获得并集排序

    项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求.之前的项目上有文章内容的展示功能,文章分为三个状态待发布.已发布.已下线. 他们在数据表中判断状态的字段(PROMOTE_STATUS)值分别为0.1.2.一开始的需求是文章只展示待发布和已发布,已发布排在待发布前面,并且两种状态下在根据自己的情况去排序.这样的实现比较简单,如下的order by语句就可以实现了. order by PROMOTE_STATUS desc ,SEQUENCE_ID desc.....

  • MySQL中使用or、in与union all在查询命令下的效率对比

    OR.in和union all 查询效率到底哪个快? 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于or.in? EXPLAIN SELECT * from employees where employees.first_NAME ='Georgi' UNION ALL SELECT * from employees where employees.first_NAME ='Bezalel' 这条语

  • 简单了解MySQL union all与union的区别

    union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明: 创建数据库表: CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(2) DEFAULT NULL, `num` int(3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DE

  • Mysql联合查询UNION和UNION ALL的使用介绍

    一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同.SQL UNION 语法: 复制代码 代码如下: SELECT column_name FROM table1UNIONSELECT column_name FROM table2 注释:默认地,UNION 操作符选取不同的值.如

  • 5分钟了解MySQL5.7中union all用法的黑科技

    union all在MySQL5.6下的表现 Part1:MySQL5.6.25 [root@HE1 ~]# MySQL -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25-log MySQL Community Server (GPL) Copyright (c) 2000,

  • sql优化实战 把full join改为left join +union all(从5分钟降为10秒)

    今天收到一个需求,要改写一个报表的逻辑,当改完之后,再次运行,发现运行超时. 因为特殊原因,无法访问客户的服务器,没办法查看sql的执行计划.没办法知道表中的索引情况,所以,尝试从语句的改写上来优化. 一.原始语句如下: select isnull(vv.customer_id,v.customer_id) as customer_id, isnull(vv.business_date,replace(v.business_date,'-','')) as business_date, v.pr

  • 浅析mysql union和union all

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION.如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排

  • 带例子详解Sql中Union和Union ALL的区别

    目录 前言 提前准备 测试 Union Union ALL Union Union All union Union All 最后 前言 一段时间没有用Union和Union,再用的时候忘了怎么用了...所以做一篇文章来记录自己学Union和Union的经历. 提前准备 在Sql Server 创建两张表,下面是创建表sql语句. create table Student1( Id varchar(50) not null, Name varchar(50) not null, Age int n

  • 详解SQL中Group By的使用教程

    1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个"小区域",然后针对若干个"小区域"进行数据处理. 2.原始表 3.简单Group By示例1 select 类别, sum(数量) as 数量之和from Agroup by 类别 返回结果如下表,实际上就是分类汇总. 4.Group By 和 Order By示例2 sele

  • 一文详解SQL 中的三值逻辑

    目录 1. 前言 2. 两种 Null 3. 为什么是 is Null 而不是 = Null ? 4. 第三个真值 “unknown” 5. 包含三值逻辑的真值表 6. “排中律” 不再成立 7. CASE 表达式和 NULL 8. NOT IN 和 NOT EXISTS 不是等价的 9. 限定谓词和 NULL 10. 限定谓词和极值函数不是等价的 11. 聚合函数和 Null 1. 前言 大多数编程语言都是基于二值逻辑的,即逻辑真值只有真和假两个.而 SQL 语言则采用一种特别的逻辑体系——三

  • 详解pandas中iloc, loc和ix的区别和联系

    Pandas库十分强大,但是对于切片操作iloc, loc和ix,很多人对此十分迷惑,因此本篇博客利用例子来说明这3者之一的区别和联系,尤其是iloc和loc. 对于ix,由于其操作有些复杂,我在另外一篇博客专门详细介绍ix. 首先,介绍这三种方法的概述: loc gets rows (or columns) with particular labels from the index. loc从索引中获取具有特定标签的行(或列).这里的关键是:标签.标签的理解就是name名字. iloc get

  • 详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(

  • 详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象

  • 详解Java中方法next()和nextLine()的区别与易错点

    1.基本语法 1.1基本使用方法 本篇博客重点nextLine()会读取换行('\r'),但是不会进行输出. Java中Scanner类中的方法next()和nextLine()都是吸取输入台输入的字符,区别: next()不会吸取字符前/后的空格/Tab键,只吸取字符,开始吸取字符(字符前后不算)直到遇到空格/Tab键/回车截止吸取: nextLine()吸取字符前后的空格/Tab键,回车键截止. 输入两行字符串: 我爱学JAVA 我真的很爱爱学JAVA 我真的很爱很爱学JAVA 期望输出结果

  • 详解sql中的参照完整性(一对一,一对多,多对多)

    一.参照完整性 参照完整性指的就是多表之间的设计,主要使用外键约束. 多表设计: 一对多.多对多.一对一设计 1.一对多 关联主要语句: constraint cus_ord_fk foreign key (customer_id) REFERENCES customer(id) 创建客户表--订单表 一个客户可以订多份订单,每份订单只能有一个客户. -- 关联(1对N) create table customer( id int PRIMARY KEY auto_increment, name

  • 详解SQL中的DQL查询语言

    DQL DQL:data Query language 数据查询语言 格式:select[distinct] 字段1,字段2 from 表名 where 控制条件 (distinct: 显示结果时,是否去除重复列 给哪一列去重就在哪一列字段前加入distinct) 学生表 (1)查询表中的所有信息 SELECT * FROM student (2)查询表中的所有学生姓名和对应的英语成绩 SELECT name,english FROM student 注:可显示部分字段,如果显示哪列数据,就直接

  • 详解sql中exists和in的语法与区别

    exists和in的区别很小,几乎可以等价,但是sql优化中往往会注重效率问题,今天咱们就来说说exists和in的区别. exists语法: select - from table where exists (子查询) 将主查询的结果,放到子查询结果中进行校验,如子查询有数据,则校验成功,那么符合校验,保留数据. create table teacher ( tid int(3), tname varchar(20), tcid int(3) ); insert into teacher va

随机推荐