`
utopialxw
  • 浏览: 367744 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

exists、in、inner join的区别和效率

    博客分类:
  • sql
阅读更多
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
分享到:
评论

相关推荐

    关于in and inner/outer join and exists

    NULL 博文链接:https://xinyangwjb.iteye.com/blog/1388909

    SQL入门常见问题总结与实用技巧介绍.docx

    使用EXISTS替代IN子句提高效率。 数据类型与查询优化 适当的数据类型选择: 根据实际数据范围和精度选择合适的数值类型。 避免过度使用TEXT/BLOB类型,可能影响索引和查询速度。 数据过滤: 使用谓词推导和SARGable...

    K3触发器实现对物料单据管控 .txt

    inner join icstockbillentry as t5 on t5.finterid=t4.finterid and t5.fsourceinterid=t2.fsourceinterid group by t3.fbillno,t1.fdate having Cast(year(t1.fdate) as int(10))*100+Cast(month(t1.fdate) ...

    SQL排除重复结果只取字段最大值分享

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID...select a.* from [Sheet1$] a inner join (select PID,max(ID) as max_id from [Sheet1$] group by PID) b on a.PID=b.PID and a.ID=b.max_id

    数据库和ado知识

    between and 和 in 的使用 like, not like 通配符(%,_,[],^) 空值处理:null 是什么? 排序(order by id asc / desc)(默认是哪一种排序?) 分组(group by ),单条件分组,多条件分组(分组时,要注意的事情[位置,列]...

    微软内部资料-SQL性能优化5

    Having useful indexes speeds up finding individual rows in a table, as well as finding the matching rows needed to join two tables. What You Will Learn After completing this lesson, you will be able ...

    MYSQL常用命令大全

    mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE; 9:导入.sql文件命令(例如D:/mysql.sql) mysql>use database; mysql>source d:/mysql.sql; 10:删除表 mysql>drop TABLE MYTABLE; 11:清空表 ...

    MySQL命令大全

    mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt”INTO TABLE MYTABLE; 9:导入.sql文件命令(例如D:/mysql.sql) mysql>use database; mysql>source d:/mysql.sql; 10:删除表 mysql>drop TABLE MYTABLE; 11:...

    SQL SERVER先判断视图是否存在然后再创建视图的语句

    如果我们的语句为: IF NOT EXISTS(SELECT 1 FROM sys.views WHERE name='Report_IndividualTicket') BEGIN create view Report_IndividualTicket ...(GisProcess INNER JOIN Ticket ON GisProcess.TicketID=Tic

    超实用sql语句

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    二者有很大区别 “%”可以代表任意长度的字符串,长度可以为0; “_”只能表示单个字符。 如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为一个汉字是两个字符,而一个“_”符号...

    精通SQL 结构化查询语言详解

    9.3.3 内连接(INNER JOIN) 9.3.4 外连接(OUTER JOIN)  9.3.5 交叉连接(CROSS JOIN)  9.4 UNION与UNION JOIN  9.4.1 关系的集合运算  9.4.2 UNION运算符  9.4.3 ORDER BY子句排序UNION运算结果  9.4.4 ...

    Sql Server中判断表、列不存在则创建的方法

    一、Sql Server中如何判断... INNER JOIN SYSCOLUMNS T2 ON T1.ID=T2.ID WHERE T1.NAME='A' AND T2.NAME='C' ) PRINT '存在' ELSE PRINT '不存在' 第二种方法,短小精悍,可谓精典  IF COL_LENGTH('A', 'C') I

    经典SQL语句大全

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...

    数据库操作语句大全(sql)

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...

    sql经典语句一部分

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...

    T-SQL高级查询

    exists和not exists查询需要内部查询和外部查询进行一个关联的条件,如果没有这个条件将是查询到的所有信息。如:id等于student.id; # some、any、all子句查询示例 查询班级的学生年龄大于班级的学生的年龄的...

    精通SQL--结构化查询语言详解

    9.3.3 内连接(inner join) 167 9.3.4 外连接(outer join) 170 9.3.5 交叉连接(cross join) 176 9.4 union与union join 177 9.4.1 关系的集合运算 177 9.4.2 union运算符 178 9.4.3 order by子句排序...

    经典全面的SQL语句大全

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....  12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

Global site tag (gtag.js) - Google Analytics