mysql使用exists进行查询

参考:http://blog.csdn.net/gucapg/article/details/16839587


 

1、exists的返回结果是bool型,只有true或者false

如 SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE e.a_id='6588' ),返回的结果跟SELECT * FROM alumni_info t一样(a_id=6588存在),因为select语句先执行where条件后的语句,再筛选字段,当执行完where条件后,若这条结果集存在,则where表达式后面永远都是true,否则为false。也就是说要么查询所有,要么没有数据。那么我只想查校友id,为6588的校友,使用exists该怎么写,经过一番测试,内查询中的id,必须为外查询的id,即SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE t.id_='6588' ),ok,完事.

 

2、如果我想查询所有教育经历的校友,使用exists实现,当然用in实现也一样,不过效率低点
SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE e.a_id=t.ID_ )

 

3、exists的效率比in查询要高,因为IN不走索引,但要看实际情况具体使用,IN适合于外表数据量大而内表数据小的情况;EXISTS适合于外表小而内表大的情况

 

4、exists与not exists是相对应的。


补充:select * from userwechatcard uw where EXISTS (select id from wechatcarden w where uw.cardId = 'pbLatjk4T4Hx-QFQGL4zGQy27_Qg')

比如卡券项目中我想查询卡券发行数量超过100张的卡券信息

那么sql:

select * from wechatcarden wc where exists (select * from wechatcardsummary w where wc.id = w.weChatCardEnId and  skuQuantity>= 1000 )

等价于:select * from wechatcarden uw left join wechatcardsummary  ws on uw.id = ws.weChatCardEnId where ws.skuQuantity >= 1000

mysql使用exists进行查询


必须要含有外部id或者其他外部元素可以达到where条件查询的效果,不然就是查询所有,等价于select * from wechatcarden wc

mysql使用exists进行查询