GaussDB 数据库 SQL 系列 - UNION & UNION ALL

简介: GaussDB UNION/UNION ALL

目录

一、前言

二、GaussDB UNION/UNION ALL

1、GaussDB UNION 操作符

2、语法定义

三、GaussDB 实验示例

1、创建实验表

2、合并且除重 (UNION)

3、合并不除重(UNION ALL)

4、合并带有 WHERE 子句 SQL 结果集(UNION ALL)

5、业务逻辑除重后合并(UNION ALL)

四、GaussDB UNION 常见错误

1、“each UNION query must have the same number of columns”

2、“UNION types timestamp without time zone and text cannot be matched”

五、小结

一、前言
SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用 SQL 语言来操作数据库中的数据。而在 SQL 中,UNION 是一个非常强大的功能,它可以将多个 SELECT 语句的结果合并成一个结果集。本文将以 GaussDB 数据库为例,介绍一下 UNION 操作符的使用。

二、GaussDB UNION/UNION ALL
1、GaussDB UNION 操作符
GaussDB UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

2、语法定义
1)UNION 语法

SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
2)UNION ALL 语法

SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION ALL
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
说明:UNION 在合并两个或多个集合时会执行去重操作,而 UNION ALL 则直接将两个或者多个结果集合并,不执行去重。 另外,执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认了两个集合不存在重重复数据时,可直接用 UNION ALL 替代 UNION,以便提升性能。

三、GaussDB 实验示例
本文以 GaussDB 数据库为实验平台,

1、创建实验表并初始化
1)学生信息表 student(ID、姓名、性别、城市)

--创建学生信息表
CREATE table student(
sId VARCHAR(10) NOT NULL
,sname VARCHAR(10) NOT NULL
,ssex VARCHAR(10) NOT NULl
,scity VARCHAR(10) NOT NULl
);

--初识化实验数据
INSERT INTO student VALUES('s01' , '赵雷' , '男', 'XIAN');
INSERT INTO student VALUES('s02' , '钱电' , '男', 'YUNNAN');
INSERT INTO student VALUES('s03' , '孙风' , '男', 'NIXIA');
INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');
INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');
INSERT INTO student VALUES('s06' , '吴兰' , '女', 'CHENGDU');
INSERT INTO student VALUES('s07' , '郑竹' , '女', 'XIAN');
INSERT INTO student VALUES('s08' , '张三' , '女', 'CHENGDU');

--查看结果集
SELECT * FROM student;

2)教师信息表 teacher(ID、姓名、性别、城市)

--创建教师信息表
CREATE table teacher(
teid VARCHAR(10) NOT NULL
,tname VARCHAR(10) NOT NULL
,tsex VARCHAR(10) NOT NULL
,tcity VARCHAR(10) NOT NULL
);

--初始化实验数据
INSERT INTO teacher VALUES('t01' , '张磊', '男', 'XIAN');
INSERT INTO teacher VALUES('t02' , '李强', '男', 'BEIJING');
INSERT INTO teacher VALUES('t03' , '王刚', '男', 'XINJIANG');

--查看结果集
SELECT * FROM teacher;

2、合并且除重 (UNION)
-- 获取学生和教师所属的城市,并按城市名称首字母升序排序。

SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
结果集如下截图,且城市数据不存在重复:

3、合并不除重(UNION ALL)
-- 获取所有学生和教师所属的城市,并按城市名称首字母升序排序。

SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION ALL
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
结果集如下截图,罗列了所有城市数据:

4、合并带有 WHERE 子句 SQL 结果集(UNION ALL)
-- 获取来自 'XIAN' 的学生和教师的所有信息,并按学生和教师的编号升序排序。

SELECT t.*
FROM
(SELECT Sid AS id
,Sname AS name
,Ssex AS sex
,Scity AS city
FROM student WHERE Scity='XIAN'
UNION ALL
SELECT Tid AS id
,Tname AS name
,Tsex AS sex
,Tcity AS city
FROM teacher WHERE Tcity='XIAN') t
ORDER BY t.id ASC;
结果集如下截图,罗列了 'XIAN' 的学生和教师的所有信息:

5、业务逻辑除重后合并(UNION ALL)
在一些业务场景下,比如上游系统提供的两张表或者多张表之间互相不会存重复数据,且自身也不存在重复数据,则为了提升合并时 SQL 性能、减少 SQL 执行时间,则选择 UNION ALL 操作符。

四、GaussDB UNION 常见错误
1、“each UNION query must have the same number of columns”
解决思路:根据提示查看两个表的表结构,看字段数量是否一支。

2、“UNION types timestamp without time zone and text cannot be matched”
解决思路:根据提示查看两个表的表结构,看字段类型是否一致。

五、小结
在实际业务场景中,无论选择 GaussDB 数据库,还是其他关系型数据库,在使用 UNION 和 UNION ALL 时,都需要注意以下几点:

左右两侧的 SQL 字段数量和字段类型需要保持一致;
业务需求是否需要考虑数据除重(合并前除重还是合并时除重);
根据表中数据量的大小,需要对 SQL 的执行效率进行评估,从而考虑是否需要选择临时表进行过渡后再合并;
需要考虑 SQL 编写的复杂度,不能为了写 SQL 而写 SQL, 需要结合业务需求进行选择。
—— 结束

相关文章
|
21天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
58 11
|
2月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
1月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
2月前
|
SQL 关系型数据库 MySQL
体验使用DAS实现数据库SQL优化,完成任务可得羊羔绒加厚坐垫!
本实验介绍如何通过数据库自治服务DAS对RDS MySQL高可用实例进行SQL优化,包含购买RDS实例并创建数据库、数据导入、生成并优化慢SQL、执行优化后的SQL语句等实验步骤。完成任务,即可领取羊羔绒加厚坐垫,限量500个,先到先得。
194 12
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
2月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
|
2月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
114 1
|
2月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。
下一篇
开通oss服务