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

相关文章
|
5天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
17天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
91 0
|
17天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
4天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
6天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
6天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
13天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
13天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
39 3
|
16天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
56 0