UNION 和 UNION ALL

概述

UNION 和 UNION ALL 都是 SQL 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。

区别

UNION 和 UNION ALL 的区别在于,UNION 会将结果集合并成一个不含重复行的结果集,而 UNION ALL 则会保留所有的行,包括重复的行。

因为 UNION 需要去重,所以它需要对结果集进行排序和去重的操作,因此比 UNION ALL 操作要慢,并且消耗更多的系统资源。

使用方法

UNION

UNION 的基本语法如下:

  1. SELECT column1, column2, ... FROM table1

  2. UNION

  3. SELECT column1, column2, ... FROM table2;

这个语句会返回从 table1 和 table2 中检索的唯一行。注意,两个查询的列数必须相同,并且对应列的数据类型也必须相同。

如果希望在结果集中保留重复的行,需要使用 UNION ALL。

UNION ALL

UNION ALL 的基本语法如下:

  1. SELECT column1, column2, ... FROM table1

  2. UNION ALL

  3. SELECT column1, column2, ... FROM table2;

这个语句会返回从 table1 和 table2 中检索的所有行,包括重复的行。

与 UNION 不同,UNION ALL 不会对结果集进行排序和去重的操作,因此比 UNION 更快,也更消耗较少的系统资源。

使用例子

以下是一些使用 UNION 和 UNION ALL 的例子。

示例1:使用 UNION 操作符

假设有两个表 employees 和 customers,它们的结构如下:

  1. employees

  2. | emp_id | first_name | last_name |

  3. |--------|------------|-----------|

  4. | 1 | John | Smith |

  5. | 2 | Jane | Doe |

  6. customers

  7. | cust_id | first_name | last_name |

  8. |---------|------------|-----------|

  9. | 1 | Mary | Jones |

  10. | 2 | Bill | Smith |

如果想要将这两个表中的所有人员的名字和姓氏组合成一个唯一的列表,可以使用 UNION 操作符:

复制代码
  1. SELECT first_name, last_name FROM employees

  2. UNION

  3. SELECT first_name, last_name FROM customers;

这个语句会返回以下结果:

复制代码
  1. | first_name | last_name |

  2. |------------|-----------|

  3. | John | Smith |

  4. | Jane | Doe |

  5. | Mary | Jones |

  6. | Bill | Smith |

请注意,UNION 操作符会去重结果集中的重复行,这使得查询更耗费资源和时间。如果不需要去重,请使用 UNION ALL 操作符,这样可以更快地获取结果集。

示例2:使用 UNION ALL 操作符

假设有两个表 sales 和 returns,它们的结构如下:

复制代码
  1. sales

  2. | sale_id | product_name | sale_date | sale_amount |

  3. |---------|--------------|-----------|-------------|

  4. | 1 | Product A | 2022-01-01 | 1000 |

  5. | 2 | Product B | 2022-01-02 | 2000 |

  6. | 3 | Product C | 2022-01-03 | 3000 |

  7. returns

  8. | return_id | product_name | return_date | return_amount |

  9. |-----------|--------------|------------|---------------|

  10. | 1 | Product A | 2022-01-05 | 100 |

  11. | 2 | Product B | 2022-01-06 | 200 |

  12. | 3 | Product D | 2022-01-07 | 300 |

如果想要将这两个表中的所有销售和退货记录组合成一个列表,可以使用 UNION ALL 操作符:

复制代码
  1. SELECT sale_id, product_name, sale_date, sale_amount FROM sales

  2. UNION ALL

  3. SELECT return_id, product_name, return_date, return_amount FROM returns;

这个语句会返回以下结果:

复制代码
  1. | id | product_name | sale_date | amount |

  2. |-----|--------------|-----------|--------|

  3. | 1 | Product A | 2022-01-01 | 1000 |

  4. | 2 | Product B | 2022-01-02 | 2000 |

  5. | 3 | Product C | 2022-01-03 | 3000 |

  6. | 1 | Product A | 2022-01-05 | 100 |

  7. | 2 | Product B | 2022-01-06 | 200 |

  8. | 3 | Product D | 2022-01-07 | 300 |

请注意,这个结果集包含重复的行,因为 UNION ALL 不会去重。这使得 UNION ALL 更快,因为不需要排序和去重操作。

总结

在 SQL 查询中,UNION 和 UNION ALL 都是将多个查询结果集合并在一起的操作符。UNION 会去除结果集中的重复行,而 UNION ALL 则保留所有的行。在使用 UNION 和 UNION ALL 时需要注意,两个查询的列数必须相同,并且对应列的数据类型也必须相同。此外,如果需要去重,应该使用 UNION;如果不需要去重,应该使用 UNION ALL。

相关推荐
卓怡学长1 小时前
w194基于ssm新能源汽车充电系统小程序
java·小程序·intellij-idea
JAVA面经实录9171 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
光依旧2 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
弹简特3 小时前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖3 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran3 小时前
Spring IoC和DI概念篇
java·后端·spring
小狼154543 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang53 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu3 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
弹简特4 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot