SQL中exists和in的区别

假设如下应用:

两张表——用户表TDefUser(userid,address,phone)和消费表 TAccConsume(userid,time,amount),需要查消费超过5000的用户记录。

用exists:

1
2
SELECT * FROM TDefUser
WHERE EXISTS (SELECT 1 FROM TAccConsume WHERE TDefUser.userid=TAccConsume.userid AND TAccConsume.amount>5000)

用in:

1
2
SELECT * FROM TDefUser
WHERE userid IN (SELECT userid FROM TAccConsume WHERE TAccConsume.amount>5000)

通常情况下采用exists要比in效率高。

exists()后面的子查询被称做相关子查询 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是”select 1″的原因,换成”select 6″完全一样,当然也可以select字段,但是明显效率低些),其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">