集合运算(UNION、UNION ALL、INTERSECT、MINUS)
封面图
•
2025-12-19
•
MySQL
242
0
0
0
集合运算(Set Operations)是数据库中用于操作两个或多个查询结果集的常见操作,主要用于对两个或多个表进行**行级别的比较和组合**。常见的集合运算包括: --- ## 1. **UNION** ### 功能: 将两个查询的结果合并成一个结果集,并**去除重复的行**。 ### 语法: ```sql SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2; ``` ### 特点: - 自动去重。 - 要求两个查询的列数、数据类型必须一致。 ### 示例: ```sql SELECT name FROM employees UNION SELECT name FROM customers; ``` 这个查询会返回 `employees` 和 `customers` 表中所有不同的名字。 --- ## 2. **UNION ALL** ### 功能: 将两个查询的结果合并成一个结果集,并**保留所有重复的行**。 ### 语法: ```sql SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2; ``` ### 特点: - 不去重,保留所有行。 - 性能通常比 `UNION` 更高,因为不需要去重。 ### 示例: ```sql SELECT name FROM employees UNION ALL SELECT name FROM customers; ``` 这个查询会返回 `employees` 和 `customers` 表中所有的名字,包括重复的。 --- ## 3. **INTERSECT** ### 功能: 返回两个查询结果的**交集**,即同时存在于两个结果集中的行。 ### 语法: ```sql SELECT column1, column2, ... FROM table1 INTERSECT SELECT column1, column2, ... FROM table2; ``` ### 特点: - 只返回两个结果集都有的行。 - 自动去重。 ### 示例: ```sql SELECT name FROM employees INTERSECT SELECT name FROM customers; ``` 这个查询会返回既在 `employees` 中又在 `customers` 中的名字。 --- ## 4. **MINUS**(也叫 `EXCEPT`) ### 功能: 返回第一个查询结果中**不在第二个查询结果中的行**。 ### 语法(Oracle 使用 `MINUS`,SQL Server 和 PostgreSQL 使用 `EXCEPT`): ```sql -- Oracle SELECT column1, column2, ... FROM table1 MINUS SELECT column1, column2, ... FROM table2; -- SQL Server / PostgreSQL SELECT column1, column2, ... FROM table1 EXCEPT SELECT column1, column2, ... FROM table2; ``` ### 特点: - 返回的是“差集”。 - 自动去重。 ### 示例: ```sql SELECT name FROM employees MINUS SELECT name FROM customers; ``` 这个查询会返回在 `employees` 中但不在 `customers` 中的名字。 --- ## ✅ 小结对比 | 运算符 | 是否去重 | 是否保留重复 | 含义 | |------------|----------|--------------|------------------------------| | UNION | 是 | 否 | 合并两个结果集,去重 | | UNION ALL | 否 | 是 | 合并两个结果集,保留重复 | | INTERSECT | 是 | 否 | 返回两个结果集的交集 | | MINUS / EXCEPT | 是 | 否 | 返回第一个结果集中不在第二个中的行 | --- ## ⚠️ 注意事项 - 所有集合运算要求两个查询的列数、数据类型必须相同。 - 通常用于报表、数据分析、数据清洗等场景。 - 在实际使用中,建议先用 `ORDER BY` 对结果排序,以便更直观地查看结果。 --- 如果你有具体的例子或需要实现某个功能,可以告诉我,我可以帮你写对应的 SQL 语句 😊
上一篇:
mysql查询下一个月过生日的学生
下一篇:
mysql查询本月过生日的学生
标题录入,一次不能超过6条
留言
评论