mysql获取一张中,另一张表不存在的数据

SQL查询技巧:获取两张表间差异数据
本文介绍了在SQL中查找一张表中不存在于另一张表的数据的三种方法,包括NOT IN、LEFT JOIN和子查询。这些方法在数据量不同情况下有不同的效率表现,对于避免重复数据和提高查询速度具有实际指导意义。

  编写sql语句中,经常需要编写获取一张数据表中不存在与另一张表的数据,相关编写方法如下:

 方法1: 使用not in ,效率低下,在数据较小的情况下可以采用如下编写   

SELECT 
* 
FROM a 
WHERE 1=1
AND a.Id NOT IN(
     SELECT
         Id
     FROM 
          B 
     WHERE 
         B.IsDeleted=0 
     GROUP BY B.Id
);

 方法2:使用left join  较第一种方法快

SELECT 
    * 
FROM a
LEFT JOIN b ON a.Id=b.Id 
WHERE 1=1
AND b.Id IS NULL; 

方法3:速度最快,在应用到插入数据时,可在避免重复插入相同数据时又可以获取较快的时效,,速度比上两个快非常多

SELECT
   *
FROM a
WHERE 
     1=1
     AND (
            SELECT 
                   COUNT(1)
            FROM b
            WHERE a.Id=b.Id
               
     )=0;

以上方法仅供参考,如有不正确之处及更快的方法,请留言指出,谢谢!

### Java JDBC ResultSet 数据直接插入一张的最佳方法 要将 `ResultSet` 的数据直接插入到一张中,可以采用以下方式来优化性能并减少资源消耗: #### 方法概述 通过使用 JDBC 的批量更新功能以及合理的事务管理机制,能够显著提升效率。以下是具体实现思路: 1. **注册驱动程序**:加载数据库驱动类以便建立连接。 2. **创建连接对象**:通过 `DriverManager.getConnection()` 获取数据库连接。 3. **设置自动提交模式为 false**:关闭默认的自动提交行为以手动控制事务。 4. **读取源数据**:利用 `PreparedStatement` 或者普通的 SQL 查询语句获取目标数据集作为 `ResultSet`。 5. **准备插入语句**:构建用于向新写入记录的 `PreparedStatement` 对象。 6. **遍历结果集并执行批量插入**:逐条读取 `ResultSet` 中的内容并通过预编译好的插入语句将其加入批处理队列。 7. **提交事务**:完成所有批次后调用 `commit()` 提交更改;如果发生异常则回滚。 下面是个具体的代码示例展示上述过程: ```java import java.sql.*; public class CopyTableData { public static void main(String[] args) throws SQLException { String sourceQuery = "SELECT id, name FROM source_table"; String insertQuery = "INSERT INTO target_table (id, name) VALUES (?, ?)"; try ( Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "root", ""); Statement selectStmt = connection.createStatement(); PreparedStatement insertPstmt = connection.prepareStatement(insertQuery); ResultSet rs = selectStmt.executeQuery(sourceQuery)) { // Disable auto-commit to manage transactions manually. connection.setAutoCommit(false); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); insertPstmt.setInt(1, id); insertPstmt.setString(2, name); // Add the current statement into batch queue. insertPstmt.addBatch(); // Execute every 100 records as a single batch operation. if ((rs.getRow() % 100) == 0) { insertPstmt.executeBatch(); } } // Ensure any remaining statements are executed after loop ends. insertPstmt.executeBatch(); // Commit transaction once all operations succeed without error. connection.commit(); } catch (SQLException e) { System.out.println(e.getMessage()); throw new RuntimeException("Error during data copy.", e); } } } ``` 此段代码展示了如何从一张名为 `source_table` 的格里选取字段 `id`, `name` 并把它们存放到个叫作 `target_table` 的中的例子[^1]。注意这里启用了批量处理技术,并且每次累积定数量(这里是每百次)后再统发送给服务器端去执行实际 DML 动作从而提高吞吐率[^3]。 外,在整个过程中还涉及到了几个重要概念: - 关闭 AutoCommit 模式允许开发者自行决定何时保存修改至永久存储器上而是让系统频繁同步磁盘文件造成开销浪费; - 使用参数化查询防止SQL注入攻击的同时也简化了动态生成复杂达式的难度; - 合理配置缓冲区大小平衡内存占用与网络延迟之间的关系达到最佳效果[^2]. 最后提醒点就是同类型的DBMS可能对于大批量DML命令的支持程度有所差异因此建议查阅官方文档确认支持特性再做调整[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值