in用于检查一个值是否包含在列表中。exists用于检查子查询返回行的存在性
在子查询中,exists提供的性能通常比in提供的性能要好
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况
====================
in 和exists
in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。
一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:
表A(小表),表B(大表)1:
select * from A where cc in (select cc from B)
效率低,用到了A 表上cc 列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B 表上cc 列的索引。
相反的2:
select * from B where cc in (select cc from A)
效率高,用到了B 表上cc 列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A 表上cc 列的索引。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。
===========================
in和inner join
结果集比较小的情况下(比如只有几十条)用in的效率高于关联,
如果结果集比较大的情况下则用inner join的效率高于用in,
但是注意in和inner join在某些情况下结果是不一样的:当子查询中有重复数据时,join的结果也是会重复的
in的结果是不会有重复的,对非主键进行join时,join的结果是有重复的。如果说还有另一个区别的话就是join会产生一个两表合并的临时表,in不会产生两表合并的临时表
还有一篇文章如下
http://www.cnblogs.com/CreateMyself/p/6147883.html
分享到:
相关推荐
在SQL查询中,`IN`、`INNER JOIN`、`OUTER JOIN` 和 `EXISTS` 是四个重要的关键字,它们用于处理数据表之间的关联和筛选。这些概念在数据库设计和数据检索中至关重要,理解并熟练运用它们能显著提高查询效率。 1. *...
在应用目标上,以pgbench_accounts和pgbench_branches为例,我们可以通过四种不同的方式编写查询语句:使用IN子句、使用ANY子句、使用EXISTS子句和使用INNER JOIN。每种方式都有其特点和适用场景。例如,当需要判断...
在理解`EXISTS`的使用时,我们需要深入探讨其工作原理、优缺点以及与其他查询操作(如`IN`、`JOIN`)的对比。 一、`EXISTS`的基本用法 `EXISTS`子句通常与子查询一起使用,形式如下: ```sql SELECT column1, ...
在很多情况下,可以通过使用 `INNER JOIN` 或 `LEFT JOIN` 替换 `EXISTS` 来简化查询,同时保持相同的逻辑结果。这种方法不仅可以减少嵌套,还能提高查询性能。 ```sql SELECT database_items FROM database_...
理解`EXISTS`和`NOT EXISTS`的用法对于优化SQL查询非常重要,因为它们通常比使用`IN`或`JOIN`操作符更有效率,特别是在处理大量数据时。`EXISTS`主要关注记录是否存在,而不需要返回具体的值,这使得它在处理复杂...
- 对于大表,考虑使用`JOIN`操作代替`IN`或`EXISTS`,根据具体情况选择合适的连接类型(如INNER JOIN、LEFT JOIN等)。 - 使用`EXPLAIN PLAN`分析查询计划,了解数据库如何执行查询,以便进行优化。 - 在必要时,...
- **知识点**: 使用子查询来获取所有课程的信息,然后通过`LEFT JOIN`和`NOT IN`筛选未学全所有课程的学生。 - **SQL语句**: ```sql SELECT S.S#, S.Sname FROM Student S WHERE S.S# NOT IN ( SELECT S.S# ...
SQL Server支持使用IN、EXISTS和NOT EXISTS子查询,而Access支持使用IN和EXISTS子查询。 六、联结上的差异 SQL Server和Access在联结上的使用方式不同。SQL Server支持使用INNER JOIN、LEFT JOIN、RIGHT JOIN和...
通过NOT IN和子查询找到未出现在学生选课记录中的课程。 10. 全局查询与EXISTS子查询:找出未选修任何课程的学生。使用NOT EXISTS和全局查询,确保没有课程与学生的学号匹配。 11. AVG函数与分组:计算每个学院的...
- 查询上级部门编号为0的部门的员工,可以通过INNER JOIN, IN子句和EXISTS子句实现。 - 插入部门信息,如创建一个部门ID为0,部门名称为“工程技术部”,上级部门编号为99的新记录。 - 查询部分未给出具体需求,...
- **使用EXISTS和NOT EXISTS**:在某些情况下,使用EXISTS和NOT EXISTS替代IN和NOT IN可以提高查询性能,特别是在子查询返回大量行时。 #### 8. 使用条件表达式替代常量比较 - **避免不必要的计算**:如`WHERE SAL...
- **解释**: 通过`INNER JOIN`连接`teacher`和`course`表,并通过`WHERE`子句筛选出特定系别和课程名称的老师记录。 ### 四、嵌套查询 #### 具体任务 1. **查询选修了“计算机基础”的学生的学号和姓名** - **...
3. **选择正确的JOIN类型**:INNER JOIN、LEFT JOIN、RIGHT JOIN等各有优劣,根据业务需求选择最合适的JOIN类型能有效减少计算量。 4. **避免使用SELECT ***:指定需要的具体列而不是使用通配符(*),可以减少数据...
JOIN类型主要有INNER JOIN、LEFT JOIN和RIGHT JOIN。 INNER JOIN(内连接)返回两个表中满足连接条件的匹配记录。这可以视为两个集合的交集。例如,在示例中,当A表的name字段等于B表的name字段时,INNER JOIN会...
3. 使用 EXISTS 替换 IN:EXISTS通常比IN更高效,尤其是当子查询返回大量数据时。 4. 避免在 WHERE 子句中对字段进行 NULL 检查:NULL值不会被索引覆盖,可以考虑使用COALESCE或IFNULL函数。 三、合理使用JOIN操作 ...
- **NOT IN vs EXISTS**:`NOT IN`在某些情况下可能会导致全表扫描,而`EXISTS`则更倾向于只检查是否存在于子查询中,因此通常效率更高。 - **子查询与连接操作**:适当的子查询结合连接操作可以有效减少数据处理量...
在处理多个表之间的连接时,正确选择连接类型(如内连接`INNER JOIN`、左连接`LEFT JOIN`、右连接`RIGHT JOIN`)对性能至关重要。通过实例对比,我们可以看到不同连接方式在数据完整性需求下的表现差异,以及如何...
5. **使用EXISTS替代IN**:在条件表达式中,使用EXISTS通常比使用IN更高效,特别是当子查询返回大量数据时。 6. **分组与聚合函数**:使用GROUP BY时,确保所有GROUP BY列都有索引。使用HAVING代替WHERE进行过滤,...
Oracle和MySQL都支持Inner Join、Left Outer Join、Right Outer Join和Full Outer Join等多种Join类型。然而,在Oracle中,需要使用FROM关键字来指定连接表,而在MySQL中,则使用JOIN关键字。 Subquery语句 ...