zoukankan      html  css  js  c++  java
  • in和exists比较

    exists的一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

    下面两条SQL语句的执行结果是一样的,但是,不一样的是它们的执行流程完全不一样:

    使用exists语句查询:

    指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

    SELECT
        t.id AS "itemId",
        t.data_set_id AS "dataSetId",
        t.item_sort AS "itemSort",
        t.item_code AS "itemCode",
        t.item_name AS "itemName" 
    FROM
        sys_data_set_item t 
    WHERE
        t.status = 0 
        AND EXISTS ( SELECT 1 FROM sys_data_set d WHERE d.id = t.data_set_id AND d.data_code = 'erp_org_code' ) 
    ORDER BY
        t.item_sort 

    使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,即

    SELECT
        t.id AS "itemId",
        t.data_set_id AS "dataSetId",
        t.item_sort AS "itemSort",
        t.item_code AS "itemCode",
        t.item_name AS "itemName" 
    FROM
        sys_data_set_item t 
    WHERE
        t.status = 0

    然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:

    EXISTS ( SELECT 1 FROM sys_data_set d WHERE d.id = t.data_set_id AND d.data_code = 'erp_org_code' ) 

    如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。

    也可以使用in查询:

    确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

    SELECT
        t.id AS "itemId",
        t.data_set_id AS "dataSetId",
        t.item_sort AS "itemSort",
        t.item_code AS "itemCode",
        t.item_name AS "itemName" 
    FROM
        sys_data_set_item t 
    WHERE
        t.status = 0 
        AND t.data_set_id in (select id from sys_data_set d where d.data_code = 'erp_org_code')

    使用in关键字进行查询的时候,首先,在数据库内部,查询子查询,将查询到的结果和原有的user表做一个笛卡尔积,再根据我们的t.data_set_id IN d.id的条件,将结果进行筛选。最后,得到符合条件的数据。

    总结:EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,

    但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

    区别及应用场景

    in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问;如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的

    not in 和not exists

    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快

  • 相关阅读:
    机器学习分类
    12.python中高阶函数以及内建函数(map,filter,sorted),和闭包
    python中的异常处理相关语句和迭代器
    和好朋友渐行渐远是什么感觉?
    MDX学习笔记(整理) MDX语法
    Cognos软件介绍文档(原创)
    隐藏
    android::Mutex::Autolock的使用
    Android中sp和wp的使用
    Day 07 字符编码,文件操作
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14488606.html
Copyright © 2011-2022 走看看