select a.* from A a where exists(select 1 from B b where a.id=b.id);
select a.* from A a where not exists(select 1 from B b where a.id=b.id);
select * from A where id in(select id from B);
select * from A where id not in(select id from B);
对于以上两种查询条件,in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。 exists,not exists后跟的是一个true或者是false in和exists区别 in在查询的时候,确定给定的值是否与子查询或列表中的值相匹配。首先查询子查询的表,然后将从表和主表做一个笛卡尔积,然后按照条件进行筛选。所以相对从表比较小的时候,in的速度较快。 exists是指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。 举例说明效率问题 A表有10000条记录,B表有1000000条记录,那么使用in最多可能有10000 * 1000000次遍历; A表有10000条记录,B表有100条记录,那么使用in最多可能有10000 * 100次遍历; in()适合B表数据量小于A表数据量的情况
A表有10000条记录,B表有10000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等。 如:A表有10000条记录,B表有10000000000条记录,那么exists()还是执行10000次,可见B表数据越多,越适合exists()发挥效果。 再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000 * 100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存很快,所以exists()适合B表数据量大于A表数据量情况 数据量相差不大的情况下,采用exists要比in效率高,因为IN不走索引(全表扫描)
数据从一个表往另外一个表中插入数据时使用EXISTS: 在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。 insert into A (name,age) select name,age from B where not exists (select 1 from A where A.id=B.id);
|