来源:http://www.blogjava.net/terry-zj/archive/2006/04/18/41662.html
在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?
1 性能上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
相对的
select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
表 T1 不可避免的要被完全扫描一遍
分别适用在什么情况?
以子查询 ( select y from T2 )为考虑方向
如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里
相对应得子查询的结果集比较小的时候就应该使用in.
2 含义上的比较
在标准的scott/tiger用户下
|
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
1 |
7499 |
ALLEN |
SALESMAN |
7698 |
1981/02/20 |
1600.00 |
300.00 |
30 |
2 |
7521 |
WARD |
SALESMAN |
7698 |
1981/02/22 |
1250.00 |
500.00 |
30 |
3 |
7566 |
JONES |
MANAGER |
7839 |
1981/04/02 |
2975.00 |
|
20 |
4 |
7654 |
MARTIN |
SALESMAN |
7698 |
1981/09/28 |
1250.00 |
1400.00 |
30 |
5 |
7698 |
BLAKE |
MANAGER |
7839 |
1981/05/01 |
2850.00 |
|
30 |
6 |
7782 |
CLARK |
MANAGER |
7839 |
1981/06/09 |
2450.00 |
|
10 |
7 |
7788 |
SCOTT |
ANALYST |
7566 |
1987/04/19 |
3000.00 |
|
20 |
8 |
7839 |
KING |
PRESIDENT |
|
1981/11/17 |
5000.00 |
|
10 |
9 |
7844 |
TURNER |
SALESMAN |
7698 |
1981/09/08 |
1500.00 |
0.00 |
30 |
10 |
7876 |
ADAMS |
CLERK |
7788 |
1987/05/23 |
1100.00 |
|
20 |
11 |
7900 |
JAMES |
CLERK |
7698 |
1981/12/03 |
950.00 |
|
30 |
12 |
7902 |
FORD |
ANALYST |
7566 |
1981/12/03 |
3000.00 |
|
20 |
13 |
7934 |
MILLER |
CLERK |
7782 |
1982/01/23 |
1300.00 |
|
10 |
执行
SQL> select count(*) from emp where empno not in ( select mgr from emp );
COUNT(*)
----------
0
SQL> select count(*) from emp T1
2 where not exists ( select null from emp T2 where t2.mgr = t1.empno ); -- 这里子查询中取出null并没有什么特殊作用,只是表示取什么都一样。
COUNT(*)
----------
8
结果明显不同,问题就出在MGR=null的那条数据上。任何值X not in (null) 结果都不成立。
用一个小例子试验一下:
select * from dual where dummy not in ( NULL ) -- no rows selected
select * from dual where NOT( dummy not in ( NULL ) ) --no rows selected
知觉上这两句SQL总有一句会取出数据的,但是实际上都没有。SQL中逻辑表达式的值可以有三种结果(true false null)而null相当于false.
分享到:
相关推荐
SQL 中 IN、EXISTS、NOT IN、NOT EXISTS 的区别 IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,...
在编写SQL语句时,用EXISTS替代IN;用NOT EXISTS替代NOT IN可以提高执行效率。 13. 用EXISTS替换DISTINCT,如: 在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写...
在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...
SQL 中 IN 参数化的用法详解 在 SQL 中,对于 IN 操作符的使用是非常常见的,特别是在 WHERE 子句中规定多个值时。如:select * from A where ID in (1,2,3,4)。但是在实际开发中,我们不可避免地需要处理大量的...
### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...
Oracle Database 11g SQL Fundamentals 是Oracle公司推出的一本针对初学者和数据库管理员的权威指南,旨在深入讲解SQL在Oracle 11g环境中的应用。这本书分为两个部分,全面覆盖了SQL的基础知识以及在Oracle数据库...
Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...
当检查某条记录是否在另一查询结果中存在时,使用EXISTS通常比IN更高效,因为EXISTS只关心是否存在匹配,不关心匹配的数量。 **10. 用NOT EXISTS替代NOT IN** 类似地,对于否定条件,NOT EXISTS也通常优于NOT IN,...
Oracle SQL语法大全是一个重要的学习资源,它涵盖了在Oracle数据库管理系统中进行数据查询、操作和管理时所需的各种SQL语句和技巧。SQL(Structured Query Language)是用于与关系型数据库交互的语言,而Oracle作为...
3. 子查询:SQL Server使用 `IN (SELECT ...)`,Oracle则更倾向于 `EXISTS (SELECT 1 FROM ...)`。 4. 分页查询:SQL Server 使用 `OFFSET ... ROWS FETCH NEXT ... ROWS ONLY`,Oracle则使用 `ROWNUM` 和子查询来...
- **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...
书写高质量的oracle sql,用表连接替换EXISTS,索引的技巧等等
- 两个系统中,比较运算符可能有细微差别,例如 Oracle 使用 `BETWEEN`,而 SQL Server 同样支持。 5. **字符串串联运算符**: - Oracle 使用 `||` 进行字符串连接,而在 SQL Server 中应使用 `+`。 6. **PL/SQL...
在 where 条件中使用函数可能会导致 Oracle database 不能使用索引,降低 SQL 语句的执行效率。因此,应该尽量避免在 where 条件中对查询列使用函数,除非建立了相应的函数索引。 3. 任何在 where 子句中使用 is ...
在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...
Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于在Oracle数据库管理系统中操作和管理数据。在Oracle中,插入数据到表中的主要语句是`INSERT INTO`,它允许你将新记录添加到已存在的表中。下面我们将深入探讨...
### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,...通过遵循上述指导原则,可以有效地将Oracle应用程序移植到SQL Server环境中,同时保持其功能性和性能。
- Oracle和SQL Server都支持`JOIN`,但Oracle的`MINUS`和`INTERSECT`操作在SQL Server中可以用`NOT EXISTS`和`INNER JOIN`或`UNION ALL`替代。 通过了解这些差异,开发者可以在跨平台项目中更高效地编写SQL语句,...
在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并指导如何进行有效的转换。 #### 一、基本语法...