exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
实际应用:
使用left join
select t1.*
from TT_INVENTORY_LOC t1
left join TM_PART t2
on t1.TM_PART_ID = t2.TM_PART_ID
left join tm_warehouse t3
on t1.TM_WAREHOUSE_ID = t3.tm_warehouse_id
left join tm_dloc t4
on t3.tm_warehouse_id = t4.tm_warehouse_id
and t1.tm_dloc_id = t4.tm_dloc_id
where t4.dloc_type = 1
and t1.is_delete <> 1
and t1.IS_ONROAD <> 1
and t1.LOCK_STATUS <> 1
and t1.PART_STATE <> 0
and t2.PART_NO = 'C0005835'
order by t1.batch asc