`
tsinglongwu
  • 浏览: 232721 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle常识(一):in和exist的区别

阅读更多


in 与 exist 的语法比较:           

 

select × from 数据表 t where t.x in (...) 

     括号内可以是符合t.x字段类型的值集合,如('1','2','3'),但如果t.x是number类型的时候,似乎这样的写法会出问题;也可以是通过另外的select语句查询出来的值集合,如(select y from 数据表2 where ...)。 
     

select * from 数据表 t where [...] and exist (...) 

      方括号内为其它的查询条件,可以没有。exist后面的括号内可以是任意的条件,这个条件可以与外面的查询没有任何关系,也可以与外面的条件结合。如:(select * from 数据表2 where 1=1) 或 (select * from 数据表2 where y=t.x)

例子:

in的SQL语句

SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime 
FROM tab_oa_pub WHERE is_check=1 and 
category_id in (select id from tab_oa_pub_cate where no='1') 
order by begintime desc 

 
exists的SQL语句

SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime 
FROM tab_oa_pub WHERE is_check=1 and 
exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1') 
order by begintime desc 

 
效率比较:

        先讨论IN和EXISTS。     

select * from t1 where x in ( select y from t2 ) 

 

        事实上可以理解为:     

select * from t1, ( select distinct y from t2 ) t2 where t1.x = t2.y 

    

      如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。 
            

select * from t1 where exists ( select null from t2 where y = x ) 

 
        可以理解为:       

 for x in ( select * from t1 ) 
            loop 
                if ( exists ( select null from t2 where y = x.x ) then 
                   OUTPUT THE RECORD! 
                end if 
            end loop 

        

     这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。

        综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

原文:http://blog.csdn.net/jwisdom/archive/2007/09/27/1803577.aspx

 

分享到:
评论

相关推荐

    presto-oracle

    Presto OraclePlugin This is a plugin for Presto that allow ...Oracle Driver is not available in common repositories, so you will need to download it from Oracle and install manually in your repository.

    简述Oracle中in和exists的不同

    且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...

    Centos 7.4 配置 oracle 自启动

    接下来,我们需要创建一个启动脚本来管理Oracle实例和服务的启动和停止。编辑 `/etc/init.d/oracle` 文件,内容如下: ```bash #!/bin/bash # chkconfig: 345 85 15 # description: Oracle 12c R2 Auto Run Service ...

    Oracle In和exists not in和not exists的比较分析

    in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

    最完整的Toad For Oracle使用手册

    - **Toad and Oracle Enterprise Manager**:介绍了Toad如何与Oracle Enterprise Manager集成,以便于更好地管理和监控Oracle环境。 #### 三、快速搜索与资源 - **Quick Search Bar**:通过快速搜索栏可以快速定位...

    oracle开机自启脚本

    3. **环境变量**:正确设置`ORACLE_BASE`、`ORACLE_HOME`和`ORACLE_SID`等环境变量,确保脚本能够正确识别Oracle安装位置和实例名称。 4. **脚本执行**:确保`/etc/init.d/dbora`脚本具有可执行权限(可通过`chmod +...

    Oracle安装单机后自启动参数配置.txt

    # if the executables do not exist -- display error if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ] then echo "Oracle startup: cannot start" exit 1 fi # depending on parameter -- startup, ...

    oracle常见错误号

    以下是一些常见的Oracle错误号及其原因和解决办法: 1. ORA-01002:fetch out of sequence - 当游标没有正确地按照执行顺序进行操作时,比如在未调用`OPEN`、`FETCH`或`CLOSE`之前尝试`FETCH`,会出现这个错误。...

    ubuntu 8.0.4 server 安装oracle10.2成功

    为了安全考虑,Oracle数据库通常在一个独立的用户下运行。 1. 创建用户与组: ```bash sudo addgroup oinstall sudo groupadd dba sudo addgroup nobody sudo usermod -gnobody nobody sudo useradd oracle -g...

    oracle 错误一览表

    ### Oracle 错误一览表详解 #### ORA-00001: Unique constraint violated - **描述**:当尝试插入或更新一个行时,违反了唯一性约束。 - **解决方法**:确保数据不违反任何唯一性约束,或者修改约束以适应数据。 #...

    oracle+ora-各种常见java.sq

    为避免这些问题,开发者应熟练掌握Oracle数据库的使用,合理设计和优化SQL语句,同时确保数据库配置和网络环境的稳定性。当遇到具体异常时,结合Oracle的错误代码(如ORA-XXX)查找官方文档或在线资源,通常能找到...

    “exists”和“in”的效率问题

    当Oracle执行包含“In”的查询时,它首先完全执行内层查询,生成一个结果集,然后再逐一检查外层查询中的每一行数据是否存在于这个结果集中。 ### “In”的适用场景 - 当内层查询的数据量较小时,使用“In”可以...

    oracle存储过程、函数和程序包.pptx

    Oracle存储过程、函数和程序包是数据库管理中的重要概念,它们是PL/SQL语言的核心组成部分,用于构建复杂的数据库逻辑和业务规则。以下是这些概念的详细解释: 1. **存储过程**: - 存储过程是一组预编译的PL/SQL...

    oracle性能问题总结

    Oracle数据库的性能优化是数据库管理员和开发人员关注的重点,它涉及到多个方面,包括数据库参数配置、索引管理、SQL查询优化以及表设计等。以下是对这些知识点的详细说明: 1. **系统级优化** - **数据库参数配置...

    oracle sqL 性能优化1

    #### 十七、NOT EXIST与NOT IN的区别 NOT IN在某些情况下可能无法正常工作,尤其是在处理NULL值时。此时使用NOT EXISTS是一个更好的选择,因为它可以正确处理NULL值。 #### 十八、利用EXISTS代替COUNT DISTINCT ...

    Oracle定时计划.docx

    Oracle数据库作为业界广泛使用的数据库管理系统之一,提供了多种备份和恢复机制。本文档主要介绍如何通过Windows系统下的批处理文件(`.bat`文件)结合Oracle数据库命令行工具来实现定时自动备份的功能。 #### 二、...

    SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化

    本文将深入探讨四个关键的SQL优化策略:count、表的连接顺序、条件顺序以及in和exist的使用。 首先,让我们关注`count()`函数的优化。通常认为`count(*)`统计所有行,而`count(列名)`只计算指定列的非空值。许多人...

    利用 Oracle 和 PHP 管理分布式跟踪文件

    -------------------------------------------------------------------------------------Deployment InstructionsOracle Layer The Oracle JServer must be installed and exist in a valid state. Ensure that ...

    Oracle第15章PLSQL程序设计.pptx

    Oracle的PL/SQL程序设计是数据库管理中一个重要的部分,主要涉及存储过程、函数、局部子程序和包等概念,这些功能模块使得开发者能够编写复杂的业务逻辑并存储在数据库中,便于高效执行和管理。 15.1 存储子程序 ...

Global site tag (gtag.js) - Google Analytics