还是太菜了,在接到相关需求的时候,我连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