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

UNION 介绍
这个关键字,在我们实际开发项目中会经常使用到~
它的作用官方文档给出的解释为: 合并两个 或者 多个select语句的结果集
注意
使用这个UNION关键字有一些先决条件!
- 在进行
select查询时, 必须拥有相同数量的字段 - 字段也必须拥有
相同的数据类型 - 每条
select语句中的字段的顺序也必须相同!
语法规则
SELECT 字段1,字段2, ... FROM 表1
UNION
SELECT 字段1, 字段2, ... FROM 表2;
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数据库查询相关技巧~ ❤️❤️❤️


"👍点赞" "✍️评论" "收藏❤️"欢迎一起交流学习❤️❤️💛💛💚💚

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


1011

被折叠的 条评论
为什么被折叠?



