SQL的执行顺序:
2?wMyMh27199141
(1) FROM <left_table> 检查对象是否存在
(2) ON <join_condition> 检查连接条件,字段是否存在
(3) <join_type> JOIN <right_table> 连接类型
(4) WHERE <where_condition> 过滤条件
(5) GROUP BY <group_by_list> 分组
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition> 过滤分组
(10) ORDER BY <order_by_list> 排序
ITPUB个人空间9we-}n-bB Z ys&p5c0O
其中要注意,JOIN要先于WHERE条件执行。
如:
select a.name,b.class,c.fund from
a,b,cc where a.id=b.id and a.lx=cc.lx(+) and cc.rp=1 ;
这里先执行连接a.id=b.id and a.lx=cc.lx(+),执行完毕后再执行where过滤cc.rp=1
ITPUB个人空间7fN4|:G ^;Og*l
select a.name,b.class,c.fund from
a,b,(select rp,lx from cc where cc.rp=1) c where a.id=b.id and a.lx=c.lx(+) ;
这里先执行(select rp,lx from cc where cc.rp=1),cc.rp=1的数据,然后再与a、b连接,再执行where中的过滤条件。
两种写法,结果是不一样的(十有八九都是一样的,第二种结果往往会多一些)。原因在于,第一种写法中,左连接后进行了过滤,其结果相当于没有进行左连接;第二中写法中,先过滤再后左连接,得到行数是的a 、b连接后的结果的行数。
该贴由system转至本版2014-11-19 9:35:00