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

相关推荐
JasmineWr7 分钟前
CompletableFuture相关问题
java·开发语言
零雲9 分钟前
java面试:知道java的反射机制吗
java·开发语言·面试
java1234_小锋1 小时前
Java进程占用的内存有哪些部分?
java
sxlishaobin1 小时前
Spring Bean生命周期详解
java·后端·spring
曹牧1 小时前
Java:Assert.isTrue()
java·前端·数据库
梦里小白龙1 小时前
JAVA 策略模式+工厂模式
java·开发语言·策略模式
你不是我我2 小时前
【Java 开发日记】我们来说一说 Redis 主从复制的原理及作用
java·redis·github
程序员葫芦娃2 小时前
【Java毕设项目】基于SSM的旅游资源网站
java·开发语言·数据库·编程·课程设计·旅游·毕设
Pocker_Spades_A2 小时前
飞算Java在线学生成绩综合统计分析系统的设计与实现
java·开发语言·java开发·飞算javaai炫技赛
肉丸滚球2 小时前
飞算 JavaAI 转 SpringBoot 项目沉浸式体验:高效开发在线图书借阅平台
java·spring boot·后端