有两个简单例子,以说明 “exists”和“in”的效率问题
Java代码
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
exists 用法:
请注意 1)句中的有颜色字体的部分 ,理解其含义;
其中 Java代码
“select 1 from T2 where T1.a=T2.a”
“select 1 from T2 where T1.a=T2.a”相当于一个关联表查询,相当于
Java代码
“select 1 from T1,T2 where T1.a=T2.a”
“select 1 from T1,T2 where T1.a=T2.a”
但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。
in 的用法:
继续引用上面的例子
Java代码
select * from T1 where T1.a in (select T2.a from T2) ”
select * from T1 where T1.a in (select T2.a from T2) ”
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
Java代码
“select * from T1 where T1.ticketid in (select T2.id from T2) ”
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
“select * from T1 where T1.ticketid in (select T2.id from T2) ”
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student); 第一句SQL语句的执行效率不如第二句。
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。
分享到:
相关推荐
### "Exists"与"In"的效率问题详解 #### 引言 在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,...
在这个例子中,`EXISTS`后面跟着的子查询(`SELECT 1 FROM Table2 WHERE Table1.a = Table2.a`)就像一个关联查询,尽管看起来像`SELECT 1`可能有点奇怪,但这个数字在这里是无关紧要的,它只是一个占位符,表示任何...
假设我们有两个表`A`和`B`,表`A`包含`id`和`name`两列,表`B`包含`id`、`aid`和`name`三列。其中`A.id`与`B.aid`存在关联关系。我们想找出表`A`中那些在表`B`中也存在的记录: ```sql SELECT id, name FROM A ...
在SQL Server中,`EXISTS` 和 `IN` 是两种常用的子查询操作符,用于比较一个查询结果是否与另一个查询结果相匹配。虽然它们在功能上相似,但在性能和优化方面存在一些差异,这在大数据处理时尤其显著。 1. **EXISTS...
在这个例子中,我们首先定义了一个虚拟的 `contains` 操作,然后将其转换为 `NOT EXISTS` 和 `EXCEPT` 的组合。这种转换可以帮助理解多层嵌套 `EXISTS` 的逻辑,并可能提供更高效的实现方式。 #### 四、注意事项 ...
在数据库管理和查询优化中,`not in`和`not exists`是两个常用的SQL操作符,用于从结果集中排除特定的记录。然而,它们在执行效率上存在差异,特别是在处理大数据集时。以下是对这两个操作符的详细说明: 1. `not ...
在这个例子中,如果B表中的记录在A表中已经存在,`NOT EXISTS` 子查询将不会返回任何记录,插入操作就会被跳过。 总的来说,选择 `IN` 还是 `EXISTS` 应根据具体的数据量和业务需求来决定。在涉及大量数据时,通常 ...
在SQL查询优化中,`IN` 和 `EXISTS` 子句经常被用来过滤结果集,但它们在执行效率上存在显著差异。了解这些差异并根据数据集的大小选择合适的子句是数据库性能调优的关键。 ### `IN` 与 `EXISTS` 原理 `IN` 子句...
- **问题原理与现象**:这两个关键字与IN和EXISTS相反,用于查询不在特定集合中的数据或不存在的记录。 - **例子**:如果我们想找出不在特定部门ID列表中的员工,可以用 `SELECT * FROM Employees WHERE ...
例如,假设我们有`article`和`user`两个表,我们要找出`article`表中所有uid在`user`表中存在的记录,可以这样写: ```sql SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)...
关联更新通常用于保持两个或多个表之间的一致性,确保数据的准确性和完整性。本文将通过一个具体的例子来介绍如何在Oracle中实现两表之间的关联更新,并重点讲解使用`EXISTS`嵌套子查询的方法。 #### 二、示例代码...
在数据库管理中,有时我们需要确保两个表之间的数据一致性,避免重复或冗余的数据。这个教程主要探讨了如何在Oracle数据库环境中删除A表中与B表相同的数据,以保持数据的准确性。以下是对这两种方法的详细解释: 1....
- **1:1关系**:两个表之间一对一关联,例如在垂直拆分后的主键关联,这种情况下,如果子表是1的关系,即使左连接也能优化为仅查询主表。 - **1:N关系**:一个表对应另一个表的多条记录,如商品与订单的例子。 - ...
首先,介绍这个错误观点,然后详细解释它的含义,接着用一个例子或调查结果来展示其流行程度。之后,反驳这个观点,提出与之相反的看法,并列举支撑自己观点的理由。 - 错误观点的提出:Many people argue that ...
- **解析**:在两个或多个表之间执行`UPDATE`或`DELETE`操作时,需要考虑数据的一致性和完整性。 - **优化建议**:使用适当的连接和子查询来确保操作正确执行,同时也要注意事务管理。 **2.6 用Merge高效完成表对表...
例如,使用IN运算符来查询在两个特定系部的学生学号和姓名,或者使用NOT IN运算符来找出选修课成绩不在一定范围内的学生记录。这些例子说明了运算符在SQL查询中的应用,展示了如何通过这些高级的查询技术来提高数据...
例如,根节点'A'有两个子节点'B'和'C',而'B'又有两个子节点'D'和'E',以此类推。 为了查询特定节点的所有子节点,我们使用了两个存储过程:`showChildLst` 和 `createChildLst`。这两个存储过程协同工作,递归地...