【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 select语句数据查询操作详解(3) UNION关键字 你真的会用吗?
🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
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数据库查询相关技巧~ ❤️❤️❤️
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以
点击下方关注❤️
微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇