zoukankan      html  css  js  c++  java
  • sql语句中的exists和in

    有两张表:testA和testB:

    testA       testB

        

    有如下三条sql语句,他们的结果是否一样呢?

    1、select testA.A form testA where testA.A in (select B from testB);

    2、select testA.A select * from testA where exists (select B from testB);

    3、select testA.A from testA,testB where testA.A= testB.B;

    查询结果:

    1、1,2

    2、1,2,3

    3、1,1,2

    其区别在于:

    1、in和exists在不考虑效率的情况下是可以相互转换到。对于sql1语句,可以转换成的exists语句为

        select testA.A from testA where exists (select B from testB where testB.b=testA.a);

         可见语句2中少了子查询中的where限制条件;

    2、1和3又与哦什么区别呢?

    对于语句1执行过程是这样的:首先执行子查询,查询结果为testB.B(1,1,2,4);然后遍历testA中的

    A字段的数据是否在刚才的查询结果中,显然1和2在子查询结果中。所以整条语句的结果为1和2.

    而语句三呢.查询时先得到两个数据表的笛卡尔积:

    A  C  A  B

    1  A  1  1

    1  A  2  1 

    1  A  3  2

    2  B  1  1

    …………………………

    然后比较该笛卡尔积中的第一个A和B字段是否相等,相等则取出A字段。所以查询结果为1,1,2。

    附:in和exists的区别:

    参见:http://kenshin54.iteye.com/blog/366043

  • 相关阅读:
    宋亡之后无中国,明亡之后无华夏——有多少人懂
    关于Verilog 中的for语句的探讨
    三种不同状态机写法
    异步复位和同步复位
    转载
    FIFO认识(一)
    Quartus II管脚批量分配文件(.tcl)格式
    mif文件C语言生成
    基于FPGA的HDMI显示设计(三)
    FPGA----只读存储器(ROM)
  • 原文地址:https://www.cnblogs.com/peislin/p/2615206.html
Copyright © 2011-2022 走看看