设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] Oracle SQL语句执行过程

[复制链接]

尚未签到

发表于 2018-9-25 12:11:18 | 显示全部楼层 |阅读模式
前言
  QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名。这篇博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题。
问题呈现
  直接给出SQL代码和执行error直观来看。
[sql] view plaincopyprint?  
select ename name from emp where name = 'SIMTH';
  哦,晃眼而过,可能并不会发现问题,不过一执行,便会报 如下错误:

  也就是where子句中name识别无效。造成这种原因是因为:where子句是先于select进行处理的深入点来说,造成此类困惑的原因在于对Oracle SQL语句的执行情况不了解。

  上述问题一种牵强的解决办法:
[sql] view plaincopyprint?  
select * from
  
(
  
select ename  as name from emp
  
)
  
where name ='SMITH'
  
;
  将取别名的查询作为内联查询,就可以在外部查询中对其进行引用了, from是先于where被执行的,
  这就可以识别到name了。

  上述图示为SQL语句的执行计划,通过执行计划可以简单的观察到SQL语句的执行过程。
SQL语句执行顺序
  1、from子句:组装来自不同表、视图等数据源的数据。
  2、where子句基于指定的过滤条件对记录进行筛选。
  3、group by子句:将数据划分为多个组。
  4、使用狙击函数的计算。
  5、使用having子句筛选分组。
  6、计算所有表达式。
  7、select 产生字段。
  8、使用order by 对结果进行排序。SQL语句处理的过程和其他编程语言明显不同:
[sql] view plaincopyprint?  
SELECT  (9) DISTINCT (11)  
  
(1)  FROM
  
(3)  JOIN
  
(2) ON
  
(4) WHERE
  
(5) GROUP BY
  
(6) WITH {CUBE | ROLLUP}
  
(7) HAVING
  
(10) ORDER BY
  1、 FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
  2、 ON:对VT1应用ON筛选器,只有那些使为真才被插入到TV2。
  3、 OUTER (JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN或INNER JOIN),保留表中未找到
  匹配的行将作为外部行添加到VT2,生成TV3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表位置。
  4、 WHERE:对TV3应用WHERE筛选器,只有使为true的行才插入TV4。
  5、 GROUP BY:按GROUP BY子句中的列列表对TV4中的行进行分组,生成TV5。
  6、 CUTE|ROLLUP:把超组插入VT5,生成VT6。
  7、 HAVING:对VT6应用HAVING筛选器,只有使为true的组插入到VT7。
  8、 SELECT:处理SELECT列表,产生VT8。
  9、 DISTINCT:将重复的行从VT8中删除,产品VT9。
  10、ORDER BY:将VT9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
  11、TOP:从VC10的开始处选择指定数量或比例的行,生成表TV11,并返回给调用者。
  对于以上的每个步骤都会产生一个虚拟的表,该虚拟表作为下一步的输入,这些虚拟表在此SQL语句外是无法使用的,只有最后一步执行完毕之后产生的结果集才会给调用者。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-601813-1-1.html 上篇帖子: Oracle在linux下使用小技巧 下篇帖子: 9-16-oracle学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表