Mysql 从A表查询相关信息批量插入到B表中

本文介绍了如何使用MySQL的INSERT命令结合子查询,将A表中特有的用户信息批量插入到B表中。重点讨论了IN和EXISTS的区别,解释了IN会先执行子查询再进行笛卡尔积,而EXISTS则逐行判断,提高效率。通过实例和解释,帮助读者理解并解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是太菜了,在接到相关需求的时候,我连insert命令都没记全。

回顾一下insert命令

insert into 表名 (表内字段1,字段2) values(数据1,数据2),(数据1,数据2)

那么按照标题中的需求,具体例子:将A表中有,而B表中没有的用户插入到B表中。所以就是先用一个获取A表中有而B表中没有的用户(这里用到子查询not in),在将这些用户插入到B表中。

insert into B(name)
select username
from A
where username not in (
						select name 
						from B)

能用in的地方肯定也能用exists。

注意不是exits!!!! 我一开始因为这个问题,报语法错误,半天没看出缘由,一度开始怀疑exists的子查询不是这么用的。

insert into B(name)
select username
from A
where not exists (
						select 1 
						from B
						where A.username =B.user  )

那么对于in 和exists的区别可以看这篇博文mysql中in和exits的区别

简单的说就是:

  • in是先进行子查询,然后将子查询得到的结果和外面的表进行笛卡尔积,然后在通过外查询的where进行筛选。
  • exists是对于外查询的每一行逐个到exists的子查询中去判断,如果存在符合where的条件,就直接返回,不用继续判断了。

可以发现,在exists的子查询中,select返回的内容不重要,甚至可以select 1,2,3,4 。exists真正关注的是子查询是否存在,存在就返回true,否则返回false

### MySQL 中基于查询字段实现批量插入MySQL 中,`INSERT INTO ... SELECT ...` 是一种非常高效的批量插入方式。它允许通过查询其他数据来动态生成新记录并将其插入目标中。 #### 语法结构 基本语法如下: ```sql INSERT INTO 目标 (字段1, 字段2, ...) SELECT 字段A, 字段B, ... FROM 源 WHERE 条件; ``` - **目标** 和 **源** 可以为同一张或其他不同的。 - `SELECT` 子句用于定义要插入的目标数据集。 - 如果未指定条件,则默认插入所有符合条件的记录[^4]。 #### 映射关系 当执行 `INSERT INTO ... SELECT ...` 时,字段之间的映射仅取决于目标和 `SELECT` 查询返回的结果集中字段的位置顺序,而与其实际含义无关。例如,在以下语句中: ```sql INSERT INTO table_a (name, code) SELECT code, name FROM table_b; ``` 此操作会将 `table_b` 的 `code` 列值赋给 `table_a` 的 `name` 列,反之亦然[^2]。 #### 示例代码 以下是几个具体的例子展示如何利用该方法完成不同场景下的批量插入需求。 ##### 不带条件的批量插入 假设存在两个 `source_table` 和 `target_table` ,我们希望将前者的所有记录复制到后者中去: ```sql -- 复制 source_table 中全部数据至 target_table INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table; ``` 如果某些列不存在对应匹配项或者不需要填充任何特定值的话,默认会被设置成 NULL 或者其自增属性决定初始状态。 ##### 带有条件筛选后的批量插入 继续沿用上面提到的例子,现在只想迁移满足一定约束的部分行而非整个集合: ```sql -- 迁移 source_table 符合 condition_xxx=True 的部分数据至 target_table INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table WHERE condition_xxx = TRUE; ``` 这里增加了 WHERE 子句限定范围,从而实现了更加精确控制哪些条目应该被加入最终结果之中。 ##### 跨数据/跨服务器环境下的应用扩展 对于更复杂的业务逻辑而言,可能还会涉及到多层嵌套子查询甚至联合外部资源共同构建输入参数列等情况;此时可以借助临时中间产物作为过渡桥梁简化整体流程设计思路的同时提高可读性和维护便利程度。 --- ### 注意事项 尽管这种方法功能强大且灵活多样,但在实际运用过程中仍需注意以下几个方面的问题以免引发潜在风险或错误行为发生: 1. 数据类型兼容性验证; 2. 主键冲突处理机制设定(如忽略重复项还是更新已有记录等选项配置); 3. 性能调优考量因素分析(比如索引创建时机安排合理与否直接影响效率现). 以上这些都需要开发者根据具体项目背景情况做出适当调整优化方案. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值