关于sql执行顺序的问题
select * from tblttt where id=3 and rownum =2 order by id desc 这条语句是先排序再取2条记录,还是先取两条记录再对这两条记录排序呢
select * from tblttt where id=3 and rownum =2 order by id desc 这条语句是先排序再取2条记录,还是先取两条记录再对这两条记录排序呢
调试欢乐多
然后再select * from tblttt
最后再order by id desc
select * from tblttt
where id=3
order by id desc
然后再取rownum=2的那一行
当然是先执行where条件再排序
(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 并返回调用者
再通过order by排序
最后通过rownum=2取最后的结果值。
看下执行计划 一幕了然,不过我感觉应该是先 id 然后再rownum
这个取出来的数据和你ORDER BY的字段有关
一般来说SQL执行的顺序如5楼所言
但对于结果你会发现可能会和你相像的不一样
这个关键点就在于rownum和order by 的关系
简单概括来说
如果order by 是主键的话
出来的结果你会出现是ORDER BY以后的第二条
如果是非主键的话,是先取ROWNUM=2再ORDER BY,实际上ORDER BY就没意义了(只有一条纪录)
如果只有一条的话,那你始终取不出数据
关于order by 和ROWNUM的问题你可以搜索下,很早以前有过讨论
我两年的一个贴子里讨论过另外个问题,里面也有谈到
http://topic.csdn.net/u/20091109/12/2078b0a5-89ba-4c29-bec8-565dd1773287.html
rownum<=2才能取到数据
这种写法取不到数据,要改成rownum <=2;
还有这种写法的返回结果是确定的,换句话说order by子句是不起作用的,很简单的解释一下,SQL先是执行where下面的筛选条件,对筛选结果再进行排序