UNION 和 UNION ALL

概述

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

区别

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

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

使用方法

UNION

UNION 的基本语法如下:

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

  2. UNION

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

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

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

UNION ALL

UNION ALL 的基本语法如下:

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

  2. UNION ALL

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

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

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

使用例子

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

示例1:使用 UNION 操作符

假设有两个表 employeescustomers,它们的结构如下:

  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 操作符

假设有两个表 salesreturns,它们的结构如下:

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

相关推荐
Jackson@ML10 分钟前
2026最新版Sublime Text 4安装使用指南
java·python·编辑器·sublime text
毕设源码-朱学姐11 分钟前
【开题答辩全过程】以 校园闲置物品交易平台的设计与实现为例,包含答辩的问题和答案
java·eclipse
chilavert31816 分钟前
技术演进中的开发沉思-326 JVM:内存区域与溢出异常(上)
java·jvm
纪莫39 分钟前
技术面:如何让你的系统抗住高并发的流量?
java·redis·java面试⑧股
spencer_tseng1 小时前
Unlikely argument type for equals(): JSONObject seems to be unrelated to String
java·equals
爱敲代码的小鱼1 小时前
事务核心概念与隔离级别解析
java·开发语言·数据库
小冷coding1 小时前
【Java】遇到微服务接口报错导致系统部分挂掉时,需要快速响应并恢复,应该怎么做呢?如果支付服务出现异常如何快速处理呢?
java·开发语言·微服务
一个处女座的程序猿O(∩_∩)O2 小时前
Nacos 中的 Namespace 深度解析:实现多租户隔离的关键机制
java
HeisenbergWDG2 小时前
线程实现runnable和callable接口
java·开发语言
JavaGuide2 小时前
IntelliJ IDEA 2026.1 EAP 发布!拥抱 Java 26,Spring Boot 4 深度支持!
java·后端·mysql·springboot·idea·大厂面试·javaguide