GaussDB数据库SQL系列-UNION & UNION ALL
目录
4、合并带有WHERE子句SQL结果集(UNION ALL)
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,需要结合业务需求进行选择。
——结束
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
实操教程 | 触发器实现 Apache DolphinScheduler 失败钉钉自动告警
作者 | sqlboy-yuzhenc 背景介绍 在实际应用中,我们经常需要将特定的任务通知给特定的人,虽然 Apache DolphinScheduler 在安全中心提供了告警组和告警实例,但是配置起来相对复杂,并且还需要在定时调度时指定告警组。通过这篇文章,你将学到一个简单的方法,无需任何配置,只需要在用户表(t_ds_user)表中增加字段钉钉名称(dignding_name),创建用户时指定用户的手机号码和维护对应的钉钉名称,就能轻松实现 Apache DolphinScheduler 任务失败时钉钉告警到指定的人。 安装插件plpython3u psql etl -U postgres create extension plpython3u pip安装requests cd /opt && wget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip install requests 创建发送钉钉的存储过程 plpython3u为不受信语言,所以只能被超级用户使用 sql create or r...
- 下一篇
如何把一个接口设计好? | 京东云技术团队
如何设计一个接口?是在我们日常开发或者面试时经常问及的一个话题。 很多人觉得这不就是CRUD,能实现不就行了。单纯实现来说,并非难事,但要做到易用、易扩展、易维护并不是一件简单的事。这里并不强调一些个接口设计的原则或者设计方法,仅从如何设计一个好的接口出发,简单讨论。 1、命名规范 我们写代码,不仅仅是为了实现当前的功能,也要有利于后面的维护。所谓的维护,就是代码不仅仅是写给自己看的,也是给别人看的。所以接口定义要清晰易懂、命名规范。 除了接口、方法、出入参命名规范,也要注意代码规范问题。一开始接触到各种代码坏味道的小伙伴,大多都会觉得这些规范很多余、很烦人,但实际上,这些好的编码习惯是让大家都能按照基本规约开发,易于阅读易于维护的基础。 在接口定义时,也请注意接口功能的单一性。其实这也是微服务的一些思想,接口功能的单一职责、明确简单。比如登录接口,它做的事情就是校验账户名和密码相关;订单服务、积分服务、商品信息相关的接口都是划分开的。 2、参数校验 入参出参校验是每个程序员必备的基本素养。你设计的接口,必须先校验参数。比如入参是否允许为空、入参长度要求、入参是否在枚举值范围内等等。日...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19