SQL_UNION

在 SQL 中使用 UNION 操作符时,被联合的两个或多个 SELECT 语句的列数必须相同,并且相应的列数据类型也需要兼容。这是因为 UNION 操作符会将结果组合成单个结果集,每个 SELECT 语句的结果行将按顺序放置在结果集中。

例如,如果你有两个 SELECT 语句:

sql 复制代码
SELECT column1, column2 
FROM table1
UNION
SELECT column3, column4 
FROM table2;

那么 column1 应该与 column3 有相同的数据类型,column2 应该与 column4 有相同的数据类型。同时,table1 的 column1 和 column2 应该与 table2 的 column3 和 column4 有相同的列数。

如果你想要合并具有不同列的查询结果,你可以使用 UNION ALL 操作符,并在结果集中为缺失的列提供默认值,例如使用 NULL 或特定的值:

sql 复制代码
SELECT column1, column2 
FROM table1
UNION ALL
SELECT column3, NULL AS column2 
FROM table2;

在这个例子中,table2 的查询结果只有一列,所以在 SELECT 语句中使用了 NULL AS column2 来提供第二列的值,以便与 table1 的两列结果匹配。

以下是一些使用 UNION 的 SQL 示例:

示例 1:基本的 UNION 使用

假设有两个表 employees 和 managers,它们都有一个名为 name 的列,我们想要合并这两个表中所有的名字:

sql 复制代码
SELECT name FROM employees
UNION
SELECT name FROM managers;

这将返回一个包含所有员工和经理名字的列表,不包含重复项。

示例 2:使用 UNION ALL 包含重复项

如果我们想要包含重复的名字,可以使用 UNION ALL:

sql 复制代码
SELECT name FROM employees
UNION ALL
SELECT name FROM managers;

示例 3:不同列数的 UNION

如果我们想要合并两个表,但它们有不同数量的列,我们可以为缺少的列提供默认值:

sql 复制代码
SELECT id, name, NULL AS department FROM employees
UNION ALL
SELECT id, name, department_name FROM departments;

在这个例子中,employees 表有一个额外的 department 列,而 departments 表有一个 department_name 列。我们使用 NULL AS department 来对齐列。

示例 4:使用 UNION 进行条件查询

我们可以使用 UNION 来合并两个具有不同条件的查询结果:

sql 复制代码
SELECT name, 'Employee' AS Type FROM employees
WHERE department_id = 5
UNION
SELECT name, 'Manager' FROM managers
WHERE department_id = 5;

这将返回部门 ID 为 5 的所有员工和经理的名字,以及他们的类型。

示例 5:使用 UNION 进行排序

我们可以使用 UNION 来合并两个查询结果,并在最终结果上进行排序:

sql 复制代码
SELECT name FROM employees
UNION
SELECT name FROM managers
ORDER BY name;

这将返回一个按名字排序的员工和经理的列表。

示例 6:使用 UNION 进行分组和聚合

我们可以使用 UNION 来合并两个聚合查询的结果:

sql 复制代码
SELECT 'Employees' AS Type, COUNT(*) AS Total FROM employees
UNION ALL
SELECT 'Managers', COUNT(*) FROM managers;

这将返回一个包含员工和经理总数的列表,每个类型一行。

请注意,在使用 UNION 时,每个 SELECT 语句中的列数必须相同,并且相应的列数据类型必须兼容。此外,ORDER BY 子句应该在所有 UNION 操作之后使用,以对最终的合并结果进行排序。

相关推荐
Hello_Embed6 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中6 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto7 小时前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h7 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
周周记笔记10 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅10 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~10 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记
..过云雨11 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中11 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui
一又四分之一.11 小时前
高数基础知识(下)②
笔记