关于sql执行顺序的问题
select * from tblttt where id=3 and rownum =2 order by id desc 这条语句是先排序再取2条记录,还是先取两条记录再对这两条记录排序呢

解决方案 »

  1.   

    执行的顺序是先where id=3 and rownum=2
    然后再select * from tblttt
    最后再order by id desc
      

  2.   

    个人觉得 应该是
    select * from tblttt 
    where id=3
    order by id desc  
    然后再取rownum=2的那一行
      

  3.   

    先执行哪个不是靠猜的。看下这个语句的执行计划就一目了然。
    当然是先执行where条件再排序
      

  4.   

    (8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
    (1)  FROM <left_table> 
    (3)    <join_type> JOIN <right_table> 
    (2)      ON <join_condition> 
    (4)  WHERE <where_condition> 
    (5)  GROUP BY <group_by_list> 
    (6)  WITH {CUBE | ROLLUP} 
    (7)  HAVING <having_condition> 
    (10) ORDER BY <order_by_list>--------------------------------------------------------------------------------------1.FROM:对FROM子句中前两个表执行笛卡尔积 生成虚拟表VT1 
    2.ON:对VT1表应用ON筛选器 只有满足 <join_condition>为真的行才被插入VT2 
    3.OUTER(JOIN):如果指定了OUTER JOIN 保留表(preserved table)中未找到的行将行作为外部行添加到VT2 生成T3 
    如果FROM包含两个以上表 则对上一个联结生成的结果表和下一个表重复执行步骤1和步骤3 直接结束 
    4.WHERE:对VT3应用WHERE筛选器 只有使 <where_condition>为TRUE的行才被插入VT4 
    5.GROUP BY:按GROUP BY子句中的列列表 对VT4中的行分组 生成VT5 
    6.CUBE|ROLLUP:把超组(Supergroups)插入VT6 生成VT6 
    7.HAVING:对VT6应用HAVING筛选器 只有使 <having_condition>为TRUE的组才插入VT7 
    8.SELECT:处理SELECT列表 产生VT8 
    9.DISTINCT:将重复的行从VT8中去除 产生VT9 
    10.ORDER BY:将VT9的行按ORDER BY子句中的列列表排序 生成一个游标 VC10 
    11.TOP:从VC10的开始处选择指定数量或比例的行 生成VT11 并返回调用者 
      

  5.   

    首先通过where id=3过滤
    再通过order by排序
    最后通过rownum=2取最后的结果值。
      

  6.   


    看下执行计划 一幕了然,不过我感觉应该是先 id 然后再rownum
      

  7.   

    rownum=2
    这个取出来的数据和你ORDER BY的字段有关
    一般来说SQL执行的顺序如5楼所言
    但对于结果你会发现可能会和你相像的不一样
    这个关键点就在于rownum和order by 的关系
    简单概括来说
    如果order by 是主键的话
    出来的结果你会出现是ORDER BY以后的第二条
    如果是非主键的话,是先取ROWNUM=2再ORDER BY,实际上ORDER BY就没意义了(只有一条纪录)
      

  8.   

    另外楼主,你对rownum=2的理解有错误,rownum=2 如果你的原始数据>=2条的话,那始终只会取出一条数据
    如果只有一条的话,那你始终取不出数据
    关于order by  和ROWNUM的问题你可以搜索下,很早以前有过讨论
    我两年的一个贴子里讨论过另外个问题,里面也有谈到
    http://topic.csdn.net/u/20091109/12/2078b0a5-89ba-4c29-bec8-565dd1773287.html
      

  9.   

    这个sql取不到任何数据
    rownum<=2才能取到数据
      

  10.   

    select * from tblttt where id=3 and rownum =2 order by id desc  
    这种写法取不到数据,要改成rownum <=2;
    还有这种写法的返回结果是确定的,换句话说order by子句是不起作用的,很简单的解释一下,SQL先是执行where下面的筛选条件,对筛选结果再进行排序