sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

2016-02-19 11:08 199 1 收藏

下面是个超简单的sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。



我要查询 Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据)

sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序执行时间:40109.38毫秒

sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序执行时间:8531.25毫秒

很明显使用not EXISTS效率高多了 

来源:https://www.tulaoshi.com/n/20160219/1596640.html

延伸阅读
Oracle SQL 语句可以分为以下几类: 数据操作语言语句[Data manipulation language,DML] 从一个或多个表或视图中查询数据(SELECT);获取操作[fetch]是可滚动 的[scrollable](见“可滚动游标”) 向表或视图中加入新数据行(INSERT) 修改表或视图中已有数据行的列值(UPDATE) 根据判断条件为表及视图插入或更新数...
id name 1 a 2 b 3 c 1 a 2 b 3 c 以下的sql语句都以上面表mytable为准: 1、查询id=1,3记录的所有数据 代码如下: select * from mytable where id in(1,3) 2、删除id重复的数据,表中数据只剩下id=1,2,3的所有数据 代码如下: select * into # from mytable truncate table mytable insert table select distinct * fro...
标签: SQLServer
说明:查询从第30条到第40条的记录数   SQL:select top 10 * from temp where id not in (select top 30 id from temp order by id asc) order by id asc   说明:复制表(只复制结构,源表名:a 新表名:b)    SQL: select * into b from a where 1<1     说明:拷贝表(拷贝数据,源表名:a...
1.调整内存 sp_configure 'show advanced options',1 GO RECONFIGURE Go sp_configure 'awe enabled', 1 GO RECONFIGURE Go sp_configure 'min server memory',1024 Go sp_configure 'max server memory',3072 GO RECONFIGURE Go PS: OS需要打开AWE 即在boot.ini里 添加 /3G 或者 /PAE (企业版)才能支持4G以上内存! 2.关...
标签: SQLServer
为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。 1.在查询结果中显示列名: a.用as关键字:select name as '姓名' from students order by age b.直接表示:select name '姓名' from students order by age 2.精确查找: a.用in限定范围:select *...

经验教程

318

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部