顾静柳,安卓论坛下载,ghost32
in:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。(in时不对null进行处理)
exists:在查询的时候,遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。使用exists关键字进行查询的时候,首先查询的不是子查询的内容,而是查主查询的表,
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表a(小表),表b(大表)
1:
select * from a wherea in(selectb fromb)
效率低,用到了a表上a列的索引;
select* from a whereexists (select b fromb whereb=a.a)
效率高,用到了b表上b列的索引。
2:
select* from b where b in(selecta froma)
效率高,用到了b表上b列的索引;
select* from b where exists(selecta froma wherea=b.b)
效率低,用到了a表上a列的索引。
in和exists的区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,
反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
简易口诀:子查询相对小,用in,否则用exists.
有了前面in与exists的分析,对not in与not exists就好理解了,
如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;
而not exists的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
简易口诀:否定用not exists.
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
数据库SQL---数据库、基本表、视图、索引的定义、修改、删除
在 Azure CentOS VM 中配置 SQL Server 2019 AG - (上)
在 Azure CentOS VM 中配置 SQL Server 2019 AG - (下)
网友评论