`

关于exists 的使用

    博客分类:
  • sql
阅读更多
--近来干活时发现对同事写的用exists的sql看不很懂,在网上搜集了些资料学习学习。

--下面这些说法不见的都对,有不对的地方请高手指正。

1、exists 字面意思存在。

  EXISTS里的子查询结果集非空,EXISTS()子句的值就是true。
  EXISTS里的子查询结果集为空,EXISTS()子句的值就是false。

  SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT SYSDATE FROM DUAL);
  此句将查出scott.emp表所有内容.

  SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT * FROM scott.salgrade where 1=2) ;
  返回空结果集


   参考一下论述:
   带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
   使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值否则返回假值。
   由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,
   给出列名无实际意义。



2、用exists的相关子查询
    
      明白相关子查询:
      子查询的查询条件依赖于外层父查询的某个属性值,称这类查询为相关子查询。
      求解相关子查询不能像求解不相关子查询那样,一次将子查询求解出来,然后求解父查询。
      内层查询由于与外层查询有关,因此必须反复求值。
      
       弄清相关子查询处理过程:
       从概念上讲,相关查询的一般处理过程是:
       首先去外层查询中表的第1个元组,根据它与内层查询相关的属性值处理内层查询,
       若WHERE子句返回值为真,则取此元组放入结果表;然后再取表的下一个元组;
       重复这个过程直到外层表全部检查完为止。




  SQL> select a.ENAME  from  scott.emp a
            where exists(select * from  scott.dept b where b.deptno=a.deptno);

  ENAME
  ----------
  SMITH
  ALLEN
  WARD
  JONES
  MARTIN
  BLAKE
  CLARK
  SCOTT
  KING
  TURNER
  ADAMS
  JAMES
  FORD
  MILLER

  查询到14记录.


  相当于下sql:
  select a.ENAME  from  scott.emp a
   where a.deptno in (select b.deptno  from  scott.dept b );


exists子查询实际是通过关联别的表安某种条件缩小主查询的范围。



3、not exists    简单的理解就是 not exists= not in
      实际not  exists  取得是不属于exists限制条件的主表的数据集 



SQL>  select a.ENAME  from  scott.emp a
             where exists(select * from  scott.dept b where b.deptno=a.deptno and b.deptno=10);

ENAME
----------
CLARK
KING
MILLER


     select a.ENAME  from  scott.emp a
      where not exists(select * from  scott.dept b where b.deptno=a.deptno and b.deptno=10)

  ENAME
  ----------
  SMITH
  ALLEN
  WARD
  JONES
  MARTIN
  BLAKE
  SCOTT
  TURNER
  ADAMS
  JAMES
  FORD

  查询到11记录.





4 、exists和in

      in子句通常用在不相关子查询中。通常先执行子查询,将子查询的结构用于父查询。
      子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询。
     
      关键字: 在Oracle SQL中取数据时in 和 exists 的区别?
  在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?

  1 性能上的比较
  比如Select * from T1 where x in ( select y from T2 )
  执行的过程相当于:
  select *
    from t1, ( select distinct y from t2 ) t2
  where t1.x = t2.y;

  相对的

  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 不可避免的要被完全扫描一遍

  分别适用在什么情况?
  以子查询 ( select y from T2 )为考虑方向,如果子查询的结果集很大需要消耗很多时间,
  但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里。
  相对应得子查询的结果集比较小的时候就应该使用in.

  



5、问题: 我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,
                   但是怎么样才能保证不会插入重复的记录呢?

  答案: 可以通过使用 EXISTS 条件句防止插入重复记录。


  示例一:插入多条记录

  假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:




  INSERT INTO clients
  (client_id, client_name, client_type)
  SELECT supplier_id, supplier_name, 'advertising'
  FROM suppliers
  WHERE not exists (select * from clients
  where clients.client_id = suppliers.supplier_id);


               个人批注:not exists不存在,也就是说后面的括号中只要返回了数据那么这个条件就不存在了,
        可以理解为括号前的notexists是一个左表达式 ,括号后的查询是一个右表达式,
        只有当右表达式返回的也是not exists(即后面的查询出来的结果是非空的)时,等式才成立。






  示例一:插入单条记录

  Code:


  INSERT INTO clients
  (client_id, client_name, client_type)
  SELECT 10345, 'IBM', 'advertising'
  FROM dual
  WHERE not exists (select * from clients
  where clients.client_id = 10345);


  使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。


分享到:
评论

相关推荐

    oracle数据库关于exists使用

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

    sql server2005 exists使用方法

    ### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...

    EXISTS_和_NOT_EXISTS

    如果你想要查询在主表中不存在于子查询结果中的记录,使用 `NOT EXISTS` 可能比使用 `LEFT JOIN` 或 `NOT IN` 更直观。 - 使用场景:`EXISTS` 常用于检查关联或匹配的记录,而 `NOT EXISTS` 用于排除这些匹配的记录...

    exists 的使用举例

    使用exists 判断ERP系统中单据分录中物料是否符合某种条件,否则不予保存。

    sql exists和not exists用法

    继续使用上述表`A`和`B`的例子,如果我们想要找出表`A`中那些不在表`B`中存在的记录,可以使用`NOT EXISTS`: ```sql SELECT id, name FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.id = B.aid); ``` #### ...

    经典SQL查询总结关于Exists,not Exists.in ,not in效率的说明。

    ### 经典SQL查询总结关于Exists, not Exists, IN, not IN 效率的说明 在数据库查询操作中,存在着多种方法来实现相似的功能,但不同的实现方式在性能上可能会有显著差异。本文将深入探讨 SQL 中 `EXISTS`, `NOT ...

    exists 和 not exists的详细解释

    exists 和 not exists的详细解释

    SQL Exists语句的使用

    在SQL查询语句中,Exists语句的使用方式

    in和exists的区别

    "EXISTS"子句通常与一个子查询一起使用,它并不关心子查询返回的具体值,而是关注子查询是否能返回至少一行数据。例如: ```sql SELECT * FROM Table1 WHERE EXISTS (SELECT 1 FROM Table2 WHERE Table1.a = Table...

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

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

    exists SQL用法详解、exists和not exists的常用示例

    在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...

    ABAP read 和 line-exists 的使用方法

    ABAP read 和 line-exists 的使用方法

    function_exists函数详解

    2. **性能考量**:尽管 `function_exists()` 的使用非常方便,但频繁地进行函数存在性的检查可能会影响程序的性能。在可以预见的情况下,建议尽可能减少这类检查。 3. **与类方法的区别**:需要注意的是,`function...

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

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

    Delphi FileExists检查文件是否存在

    下面将详细介绍`FileExists`函数的使用方法、相关API以及其在实际开发中的应用。 `FileExists`函数的语法如下: ```delphi function FileExists(const FileName: string): Boolean; ``` 其中`FileName`参数是一个...

    sql中exists的用法

    exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists 的基本语法为: ```sql SELECT column_name(s) FROM table_name WHERE EXISTS (subquery); ``` 其中,subquery...

    搞懂mysql的exists

    在理解`EXISTS`的使用时,我们需要深入探讨其工作原理、优缺点以及与其他查询操作(如`IN`、`JOIN`)的对比。 一、`EXISTS`的基本用法 `EXISTS`子句通常与子查询一起使用,形式如下: ```sql SELECT column1, ...

    exists用法说明.doc

    虽然`EXISTS`和`IN`、`NOT IN`在很多情况下可以互换使用,但它们在性能上可能存在差异。`EXISTS`通常在处理大量数据时表现更好,因为它一旦找到匹配的记录就会停止,而`IN`和`NOT IN`则会构建并检查一个值列表。对于...

    in和exists性能解析

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

    SQL复习-EXISTS谓词

    以下是一个使用EXISTS的实例,假设我们有一个订单表`orders`和一个订单详情表`order_details`,我们想找出所有有商品A的订单: ```sql SELECT * FROM orders WHERE EXISTS ( SELECT 1 FROM order_details WHERE ...

Global site tag (gtag.js) - Google Analytics