在 SQL 中,UNION
和 UNION ALL
都用于将两个或多个结果集合并为一个结果集,但它们在处理重复数据方面有显著区别。以下是它们的详细区别:
1. UNION
UNION
操作符用于合并两个或多个 SELECT 语句的结果集,并自动去除结果集中重复的行。
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
- 去重:
UNION
自动去除重复的行,只返回唯一的行。 - 性能: 由于需要进行去重操作,
UNION
的性能相对较低,尤其是在大数据集上。 - 用途: 当需要合并结果集并且不希望结果集中包含重复的行时使用。
2. UNION ALL
UNION ALL
操作符用于合并两个或多个 SELECT 语句的结果集,不去除重复的行,返回所有结果,包括重复的行。
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
- 去重:
UNION ALL
不去除重复的行,返回所有结果。 - 性能: 由于不进行去重操作,
UNION ALL
的性能相对较高。 - 用途: 当需要合并结果集并且希望包含所有行,包括重复的行时使用。
示例代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class UnionExample {
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/yourdatabase";
private static final String JDBC_USER = "yourusername";
private static final String JDBC_PASSWORD = "yourpassword";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
Statement stmt = conn.createStatement()) {
// 示例数据准备
String createTableSQL1 = "CREATE TABLE IF NOT EXISTS table1 (id INT, name VARCHAR(255))";
String createTableSQL2 = "CREATE TABLE IF NOT EXISTS table2 (id INT, name VARCHAR(255))";
stmt.executeUpdate(createTableSQL1);
stmt.executeUpdate(createTableSQL2);
String insertDataSQL1 = "INSERT INTO table1 (id, name) VALUES (1, 'Alice'), (2, 'Bob')";
String insertDataSQL2 = "INSERT INTO table2 (id, name) VALUES (2, 'Bob'), (3, 'Charlie')";
stmt.executeUpdate(insertDataSQL1);
stmt.executeUpdate(insertDataSQL2);
// 使用 UNION
String unionSQL = "SELECT id, name FROM table1 UNION SELECT id, name FROM table2";
try (ResultSet rs = stmt.executeQuery(unionSQL)) {
System.out.println("Results of UNION:");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
}
// 使用 UNION ALL
String unionAllSQL = "SELECT id, name FROM table1 UNION ALL SELECT id, name FROM table2";
try (ResultSet rs = stmt.executeQuery(unionAllSQL)) {
System.out.println("Results of UNION ALL:");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
}
// 清理示例数据
stmt.executeUpdate("DROP TABLE IF EXISTS table1");
stmt.executeUpdate("DROP TABLE IF EXISTS table2");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上述代码中,演示了如何使用 JDBC 执行 UNION
和 UNION ALL
操作。请根据需要调整数据库连接字符串、用户名、密码和 SQL 语句。
总结
UNION
: 合并结果集并去除重复的行。UNION ALL
: 合并结果集并保留所有重复的行。