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, 需要结合业务需求进行选择。
—— 结束

相关文章
|
2月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
14天前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
163 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
14天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
14天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
103 8
|
2月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
206 8
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
142 5
|
19天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
296 62
|
3月前
|
SQL 缓存 监控
SqlRest让SQL秒变Http API,还支持20+数据库(含国产数据库)
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。

热门文章

最新文章