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

相关推荐
都叫我大帅哥33 分钟前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
Dcs5 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
fouryears_234177 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正8 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
板板正8 小时前
SpringAI——对话记忆
java·spring boot·ai
期待のcode8 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互
李长渊哦9 小时前
深入理解Java中的Map.Entry接口
java·开发语言