有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询,在where子句中可以使用两种格式的子查询
1、 使用in操作符
2、 使用exist操作符
第一种格式比较容易编写,第二种格式要比第一种格式执行效率高。在oracle中几乎可以将所有的in操作符子查询改写为使用exist的子查询
In与exist的区别:
运用exist子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可以完成工作(这里假定在where语句中使用的列存在索引)。相对应in子句来说,exist使用相连子查询,构造起来要比in子查询困难一些。
通过使用exist,oracle系统会首先检查主查询,然后运行子查询知道它找到第一个匹配项,这就节省了时间。
Oracle系统在执行in子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统会先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用exist比使用in 通常查询速度快的原因
注:Not in 里面有空值,查询出得结果一定是空值