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要快

  • 相关阅读:
    iOS resign code with App Store profile and post to AppStore
    HTTPS科普扫盲帖 对称加密 非对称加密
    appid 评价
    使用Carthage安装第三方Swift库
    AngularJS:何时应该使用Directive、Controller、Service?
    xcode7 The operation couldn't be completed.
    cocoapods pod install 安装报错 is not used in any concrete target
    xcode7 NSAppTransportSecurity
    learning uboot how to set ddr parameter in qca4531 cpu
    learning uboot enable protect console
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14488606.html
Copyright © 2011-2022 走看看