SQL执行顺序_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2408 | 回复: 0   主题: SQL执行顺序        下一篇 
    本主题由 Administrator 于 2014-11-19 9:35:00 移动
Xuziwen
注册用户
等级:上尉
经验:721
发帖:66
精华:0
注册:2012-7-4
状态:离线
发送短消息息给Xuziwen 加好友    发送短消息息给Xuziwen 发消息
发表于: IP:您无权察看 2012-8-2 8:44:45 | [全部帖] [楼主帖] 楼主

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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论