就是数据库执行该语句的过程,where关键字后的多个条件,数据库如何判断与解析。

解决方案 »

  1.   

    如果是sqlserver,查看一下show plans
      

  2.   

    如何查看?怎么用show plan?能够将过程一个个显示出来?我是用sql server2000
      

  3.   

    这个是由SQL SERVER内部进行处理的,应该是看不到的。
      

  4.   

    就这样假设:数据库第一步干什么,第二步干什么,几个判断条件如何执行,关键就是where后面
    那些条件如何执行的。
      

  5.   

    在查询分析器中按CTRL+K,然后执行该语句,会以图形方式显示执行计划
      

  6.   

     sql server --> query Anlayzer
      

  7.   

    应该是这样:
    1、对A表扫描过滤:where a.username='A' and a.pwd='A'
    2、A与B联接:a.departID=b.id 
    3、第二步的结果再与C外联接:a.id*=c.user_id
      

  8.   

    *=是外連接相當於
    left outer join
      

  9.   

    最好不要用*=,MS说以后会不支持此用法.最好还是用left outer join.
      

  10.   

    反正FROM后面的表是最先进行扫描的连接条件,查看一下执行计划
      

  11.   

    我也有同样问题,很巧合,我分别用同样的例子执行后,"="没有结果,"*="有结果,这个用例大致这样,在a,b表中有数据,但是在c表中没有数据,"="情况下,查不出结果,"*="情况下,有结果,但是第三个字段值为"null"。不过,我还是不大清楚外连接是什么意思?
      

  12.   

    实际上我对这条语句的疑问在于:a.id与c.userid关联,a.departid与b.id关联,在a表中id是关键字嘛,唯一的,符合条件的话,因该只有一条记录查出,但是结果可以有多条记录。所以我想知道数据库是如何执行这条语句的。
      

  13.   

    你给出的3个表,据我分析,a表应该是用户表,b表是部门表,c表是权限表。
    如果使用“*=”的话,是左外连接,数据库先将a表的记录都取出来,进行hash排序,然后从c表中取出跟a表匹配的记录,如果没有就填上NULL,最后将结果返回,a表的所有记录都在里面。
    但如果是用“=”,数据库将两个表的记录进行笛卡儿积,然后从中取出符合指定条件的,由于你的c表为空,笛卡儿积的结果就是一个空记录集,所以不可能有记录返回。
    对于你的第二个问题,更好解释:如果b表的id有多个相同的,或c表userid有多个相同的,那么得到的记录就可能有多个a.id。可以模拟一下系统的处理情况,假设表a和b的记录分别为:
    a.id  a.departid
    1     1
    2     2
    b.id  b.other
    1     b1
    1     b2
    先建立笛卡儿积,如下:
    a.id  a.departid  b.id  b.other
    1     1           1     b1
    1     1           1     b2
    2     2           1     b1
    2     2           1     b2
    然后去掉不符合条件a.departid = b.id的记录3和4,得到的记录中就会有两条a.id一样的记录
    如果是左连接,结果是:
    a.id  a.departid  b.id  b.other
    1     1           1     b1
    1     1           1     b2
    2     2           null  null
    也会出现同样情况。
    不知这样的解释你是否明白?(另,数据库实际处理时,会有各种优化策略)
      

  14.   

    内联接:A.ID=B.ID 或inner join 是说只返回两个表中ID相同的记录.
    左联接:A.ID*=B.ID 或left outer join ,意思就是说两个表中ID相同的,及A表中的ID在B表中没有的都要返回到结果集中.
    右联接:A.ID=*B.ID 或right outer join,意思就是说两个表中ID相同的,及B表中的ID在A表中没有的都要返回到结果集中.
      

  15.   

     先过滤where a.username='A' and a.pwd='A' 
     再求笛卡尔集合
      

  16.   

    连接的问题已被icevi兄像写书一样的写的很详细了。 各位都回答的这么详细了,没分拿了。:)
      

  17.   

    *= 和 left outer join 是不一样的,在null值处理上有差别,不过好像sql server2000又相同的了,不过*=不是sql 92的语法,我认为不要用它。bluepower2008(蓝色力量)说"如果使用“*=”的话,是左外连接,数据库先将a表的记录都取出来,进行hash排序"这句话是不准确的,我相信不是,我过我也说不准,最好用查询分析器试一下。