`
菊花一斤
  • 浏览: 19686 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

oracle中exists与in的使用方法

阅读更多
oracle中exists与in的使用方法

用not exists 代替not in

    select * from tsp_product p where not exists(select '' from tsp_orderitem i where p.id=i.product_id)
    select * from tsp_product p where id not in(select product_id from tsp_orderitem i where p.id=i.product_id)
    用exists 代替in
    select * from tsp_product p where p.id  in(select product_id from tsp_orderitem )
    select * from tsp_product p where  exists(select 'x' from tsp_orderitem i where p.id =i.product_id )

下面来分析为什么用用not exists 代替not in

有两个简单例子,以说明 “exists”和“in”的效率问题

    1) select * from t1 where exists(select 1 from t2 where t1.a=t2.a) ;

    t1数据量小而t2数据量非常大时,t1<<t2 时,1) 的查询效率高。

    2) select * from t1 where t1.a in (select t2.a from t2) ;

     t1数据量非常大而t2数据量小时,t1>>t2 时,2) 的查询效率高。



union
把两张表的数据合起来,如有重复行,只取一行
union all
把两张表的数据合起来,不过滤重复行
minus
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。 

oracle有这样的一些约定
1.select语句必须返回相同的列数,如果列数不同的话,可以选择串代替列。
2.select语句中相应的列必须有相同的数据类型,长度可以不同

rollup

    统计:select sum(s.totalamount),to_char(createdate,'yyyy-mm') from tsp_orders s group by rollup(to_char(createdate,'yyyy-mm')

    connect by
    select level,a. * from tsp_area a start with parent_id is null connect by prior id = parent_id


说明:创建类似树报表。
prior 强制报表的顺序变为从根到叶(如果prior是父辈)或从叶到根(如果prior是后代)
虽然where子句可以人树排除上体,但无法排除他们的子孙子(或者祖先,如果prior在等号的右边)


详细看看它他的区别

exists 用法:

请注意 1)句中的有颜色字体的部分 ,理解其含义;

其中 “select 1 from t2 where t1.a=t2.a” 相当于一个关联表查询,相当于

    “select 1 from t1,t2     where t1.a=t2.a”

但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。

“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。

因此“select 1”这里的 “1”其实是无关紧要的,www.3ppt.com换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。


in 的用法:

继续引用上面的例子

    “2) select * from t1 where t1.a in (select t2.a from t2) ”

这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,t1和t2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

打个比方:t1,t2表都有一个字段,表示工单号,但是t1表示工单号的字段名叫“ticketid”,t2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:

    “select * from t1 where t1.ticketid in (select t2.id from t2) ”

    select name from employee where name not in (select name from student);

    select name from employee where not exists (select name from student);


分享到:
评论

相关推荐

    oracle中exists_和in的效率问题详解

    EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 EXISTS 主要用于判断子查询是否存在记录...

    oracle数据库关于exists使用

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

    in和exists的区别

    在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...

    sql in,exists,not in,not exists区别

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    简述Oracle中in和exists的不同

    一直以来,大家认为exists比in速度快,其实是不准确的。且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么...

    in和exists性能解析

    此外,考虑到数据库查询优化器的智能,有时即使代码中使用了`IN`,优化器也会自动转换为`EXISTS`的形式以提升性能。因此,理解并灵活运用这两种子句,对于提高数据库查询效率至关重要。 通过以上分析,我们不难看出...

    Oracle: minus | in | exists

    在Oracle数据库中,`MINUS`、`IN` 和 `EXISTS` 是三种不同的SQL查询操作符,它们各自用于特定的数据处理场景。了解并熟练掌握这些操作符对于优化查询性能和编写复杂的SQL语句至关重要。 1. **MINUS 操作符** `MINUS...

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

    在Oracle数据库中,`IN`、`EXISTS`、`NOT IN` 和 `NOT EXISTS` 是四个常用的子查询操作符,它们在SQL查询语句中扮演着不同的角色,且各有其性能特点。以下是对这些操作符的详细分析和比较。 1. `IN` 操作符: `IN` ...

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

    在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,帮助读者更好地理解和选择合适的查询方式。 ###...

    oracle中not exists对外层查询的影响详解

    当我们在一个查询中使用`NOT EXISTS`时,它会检查子查询中的条件是否不成立。如果子查询返回任何记录,那么`NOT EXISTS`子句就会为假,导致外层查询的相应行被排除。反之,如果子查询没有返回任何记录,`NOT EXISTS`...

    Oracle提高查询效率的方法

    1. 优化 SQL 语句:避免使用 NOT IN 操作符,推荐使用 NOT EXISTS 或(外连接+判断为空)方案代替;使用 IN 时,将出现最频繁的值放在最前面,出现得最少的放在最后面;使用 EXISTS、NOT EXISTS、IN、LEFT OUTER ...

    Oracle PL SQL 开发人员试题(DBA)

    Oracle PL/SQL 开发人员试题...本资源涵盖了 Oracle PL/SQL 中的多个重要概念和语句,包括子查询、NOT IN 语句、EXISTS 语句、IN 语句和 ROWNUM 语句等。这些概念和语句是 Oracle PL/SQL 开发人员必须掌握的基本技能。

    Oracle通配符,运算符的使用

    本文旨在深入探讨Oracle数据库中通配符与运算符的使用方法,帮助读者更好地理解和掌握这些关键概念。 #### 二、Oracle通配符详解 在Oracle数据库中,通配符主要用于模糊查询,即通过模式匹配来检索符合特定条件的...

    oracle性能优化技巧

    - 在子查询中,使用`EXISTS`通常比`IN`更高效,因为`EXISTS`可以在找到第一个匹配项后立即停止搜索。 12. **NOT EXISTS与NOT IN的比较**: - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况...

    Oracle+SQL优化之使用索引提示一例

    3. **使用EXISTS代替IN**:将原SQL语句中的IN子句替换为EXISTS子句,以减少不必要的全表扫描,提高查询性能。 #### 强制索引提示的应用 即使在上述优化后,`Person`表在外层查询中仍然采用全表扫描,未充分利用...

    oracle语句优化.docx

    本文将详细地介绍 Oracle 语句优化的方法和技巧,涵盖多表关联、EXISTS 和 IN 语句的使用、INDEX_JOIN 优化、WHERE 和 HAVING 语句的区别、NOT IN 和 &lt;&gt; 操作符的使用、LIKE 操作符的替代、UNION 操作符的优化、SQL ...

    Oracle语句规划详解

    - **规则描述**:在查询语句中,如果需要检查某个值是否存在于另一个表中,使用EXISTS子句通常比使用IN子句更高效。 - **示例**:查询所有有订单的客户信息,可以使用EXISTS而不是IN: - 低效:`SELECT * FROM ...

Global site tag (gtag.js) - Google Analytics