建立了两张数据表,一张数据表命名为programinfo(有2行记录),另一张数据表命名为typeinfo(有2行记录)
有下列查询语句:
select * from programinfo
where exists(select * from typeinfo where programinfo.programtype=typeinfo.id)请问是如下的执行过程吗:
系统执行到第一行的select,会将第一行的programinfo数据表加载进内存,
取出programinfo数据表的第一个记录(假设为A),然后进入exists后的子查询语句:
(select * from typeinfo where programinfo.programtype=typeinfo.id)
,在这个子查询语句里,
首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较
然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较
根据比较结果,决定是否输出外表中的A取出programinfo数据表的第二个记录(假设为B),然后进入exists后的子查询语句:
(select * from typeinfo where programinfo.programtype=typeinfo.id)
,在这个子查询语句里,
首先取出typeinfo的第一个数据(假设为a),并将B的programtype 与a的id进行比较
然后取出typeinfo的第二个数据(假设为b),并将B的programtype 与b的id进行比较
根据比较结果,决定是否输出外表中的B至此:执行完毕。请问过程是这样吗?谢谢大师!

解决方案 »

  1.   

    大致是这样的,不过有一个不一样:在这个子查询语句里,
    首先取出typeinfo的第一个数据(假设为a),并将A的programtype 与a的id进行比较
    然后取出typeinfo的第二个数据(假设为b),并将A的programtype 与b的id进行比较
    根据比较结果,决定是否输出外表中的A
    就是,如果在typeinfo中的任何一个数据,比如就是你上面的a吧,如果将A的programtype 与a的id进行比较,有相同的,那么,接下去,就不再比较了。因为exists这个是只存在的意思,也就是programtype中的某条记录的id值,只要存在于typeinfo中就可以,比如:programtype的值 = 1
    可能typeinfo表中的id = 1的的记录有2条,比如a 和b,那么只要取出a,然后把id和programtype比较,如果是相同的,那么就不会再次取出b了,因为programtype = 1的在typeinfo中exists的。
      

  2.   

    exists一般会在一个语句中出现2个同a表,并与其他b表比较后,得到符合条件的a表的记录 。
      

  3.   


    大师好人那!我想追问一下:
    假设 数据表programinfo有4条记录:
     ____________
    | programtye|
    |     10     |
    |    20     | 
    |    30     |
    |    40     |
    |___________|
    假设现在取出的programinfo表里的记录是30,“扫描typeinfo时,如果遇到一致的了”是指 从typeinfo中逐条取出记录,如果遇到只与30一致的(而不是与10 20 30 40一致吧)
      

  4.   


    大师好人那!我想追问一下:
    假设 数据表programinfo有4条记录:
     ____________
    | programtye|
    |     10     |
    |    20     | 
    |    30     |
    |    40     |
    |___________|
    假设现在取出的programinfo表里的记录是30,“扫描typeinfo时,如果遇到一致的了”是指 从typeinfo中逐条取出记录,如果遇到只与30一致的(而不是与10 20 30 40一致吧)对的,只要遇到与30一致的,就可以
      

  5.   

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False也就是说 exists(内容XXX)中,内容XXX返回来的结果连一行数据都没有的话,则where语句等同于 where 1=2
    参考:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html