【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 select语句数据查询操作详解(3) UNION关键字 你真的会用吗?

🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

UNION 介绍

这个关键字,在我们实际开发项目中会经常使用到~

它的作用官方文档给出的解释为: 合并两个 或者 多个select语句的结果集

注意

使用这个UNION关键字有一些先决条件!

  1. 在进行select查询时, 必须拥有相同数量的字段
  2. 字段也必须拥有相同的数据类型
  3. 每条 select语句中的字段的顺序也必须相同!

语法规则

SELECT 字段1,字段2, ...  FROM1  
UNION  
SELECT 字段1, 字段2, ...  FROM2;
UNION 
......

我们先来看一个案例, 现在有两样两个表:

如图

我们现在就用最简单的UNION查询来吧这两个表 合并查询一下!

比如我们想获取这两个表中的所有人!

select id,ename from emp
union
select id,cname from cont;

注意:

我们满足了上面所要求的条件,同样数量的字段,字段彼此之间也是同样的数据类型, 字段排列的顺序也是一样的!

结果如下

其实如果你仔细看,你会发现,在合并之后的结果集中Bob只出现了一次!

这是因为UNION关键字本身就有去重复的功能, 如果我们希望保留所有的重复行,可以使用 UNION ALL就可以了

如下

select id,ename from emp
union all
select id,cname from cont;

如图

这就是UNION关键字的基本使用方法,那么问题来了,这样查询有什么意义呢?

当然是没什么意义的! 我们要根据实际应用的场景和需求来决定是否使用UINON关键字进行联表查询!

应用场景

那什么场景才合适我们来使用UNION关键字呢?

这个问题其实太大了,会使用到它的场景也很多,这里我们就简单的说几个案例,让大家明白UNION的作用!

首先要明白在选择使用UNION时,需要考虑以下几个因素:

数据结构和需求

如果两个表或者多个表出具有相似的结构,并且你需要将它们的数据合并到一个结果集中,那么这个时候可能使用UNION是一个合适的选择, 当然如果表之间的关联是通过主键外键建立的,并且需要基于这些关联来查询数据,那么INNER JOIN、LEFT JOIN等…可能是更合适的选择,这个我们后面再说!

举个栗子

我们现在有一个用户表Employees

表结构如下

CREATE TABLE Employees(
	eid int PRIMARY KEY IDENTITY,
	ename varchar(255) NOT NULL,
	eage int,
	ephone int,
	esaley int,
	epart varchar(255)
)

添加一些数据

insert into Employees(ename,eage,ephone,esaley,epart) values('张军',26,1356258612,3600,'开发部');
insert into Employees(ename,eage,ephone,esaley,epart) values('王辉',30,1996255512,5600,'技术部');
insert into Employees(ename,eage,ephone,esaley,epart) values('泰森',56,1511321145,1800,'市场部');
insert into Employees(ename,eage,ephone,esaley,epart) values('杨小民',19,135625912,6800,'开发部');
insert into Employees(ename,eage,ephone,esaley,epart) values('毛利华',45,1887774771,500,'人事部');
insert into Employees(ename,eage,ephone,esaley,epart) values('傲飞',30,188823112,1600,'技术部');

比如我们在一个数据表中查询最高工资最低工资 我们应该这么查询?这两个都要列出来!

SQL如下

/*查询最高工资和最低工资的人*/
select * from Employees where esaley = (select max(esaley) from Employees)
union
select * from Employees where esaley = (select min(esaley) from Employees);

如图


这是最简单的应用!

业务统计

我们举个一个比较现实中的例子~

比如说我们现在有一个需求是统计店销售记录

现在有一个实体店销售记录表(StoreSales)在线销售记录表OnlineSales

这两个表都记录了销售日期销售金额,但是现在因为它们没有共同的订单号, 因此它们是分别记录实体店在线渠道销售数据信息~
那么现在问题来了,: 公司现在想要查看所有销售渠道的总销售金额,无论销售是在实体店还是在线完成的

我们可以把这两个表结构和数据先创建出来

SQL如下

-- 实体店销售记录表  
CREATE TABLE StoreSales (
    sid int PRIMARY KEY IDENTITY,  
    SaleDate DATETIME NOT NULL,  		 --销售时间
    SaleAmount DECIMAL(10, 2) NOT NULL   --销售金额
);  


-- 在线销售记录表  
CREATE TABLE OnlineSales ( 
	oid int PRIMARY KEY IDENTITY,   
    SaleDate DATETIME NOT NULL,  		 --销售时间
    SaleAmount DECIMAL(10, 2) NOT NULL   --销售金额
); 

如图


插入一些测试数据

INSERT INTO StoreSales(SaleDate,SaleAmount) VALUES  ('2023-01-01',100.00); 
INSERT INTO StoreSales(SaleDate,SaleAmount) VALUES  ('2023-01-02',150.00); 

INSERT INTO OnlineSales(SaleDate,SaleAmount) VALUES ('2023-01-01',200.00);
INSERT INTO OnlineSales(SaleDate,SaleAmount) VALUES ('2023-01-03',300.00);  

如图

现在表有了 ,数据也有了,我们就来根据需求进行查询统计一下!

首先我们可以根据问题来拆解:

公司现在想要查看所有销售渠道的总销售金额,无论销售是在实体店还是在线完成的

那么我们就先把这两个表中的销售金额都分别查询出来

/*实体店线下销售金额*/
select SaleAmount from StoreSales;

/*网络线上销售金额*/
select SaleAmount from OnlineSales;

如图

那么这样虽然查询出来了,但是不方便我们进行统计呀,所以现在要使用到UNION关键字来吧查询出来的结果集进行合并一下, 对吧!

注意:我们这里合并中有价格,而价格存在相同的情况,所以我们要使用UNION ALL来进行合并,不能用UNION,因为它会去除重复,这里的需求下,我们选择使用UNION ALL!

如下

select SaleAmount from StoreSales
union all
select SaleAmount from OnlineSales;

那么我们就得到这样一个结果集!

如图


那么接下来该怎么去统计呢、 这里就要用到一个AS关键字子查询的小技巧了

现在你其实可以把这个查询出来的结果集看成是一个虚拟表 加上一个括号

并且取一个别名 比如tmp_table, 然后在主查询中对虚拟表字段使用聚合函数进行统计总金额

如下

/*合并查询并且统计--实体店线下销售金额和网络线上销售总金额*/
select sum(SaleAmount) as '销售总金额' from 
(select SaleAmount from StoreSales 
union all 
select SaleAmount from OnlineSales) as tmp_table

如图

这样我们就可以在两个表数据合并之后,进行处理拿到想要的结果了!

最后

对于UNION联合查询 其实都是要根据实际的项目需求和情况来决定的,不是一尘不变的,所以后期我们在实际项目的开发中再展开对UNION的讨论, 今天我就先讲到这里,下次我们再继续讨论SQL数据库查询相关技巧~ ❤️❤️❤️

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇