注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中吴南顾惟一笑

成功法则就是那19个字

 
 
 

日志

 
 

SQL Select Query的本质  

2011-02-17 18:23:03|  分类: dbms |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
SQL(Structured Query Language)是一种Declarative的语言,体现了面向集合的思想
而数据库内在的Relational Algebra给出了获取结果的Procedural过程


逻辑处理每一步都会产生一个虚拟的表(也可能是游标),作为下一个步骤的输入


一个基本查询的逻辑过程
(7) SELECT (8) DISTINCT  <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) HAVING <having_condition>
(9) ORDER BY <order_by_list>
(10) Limit <limit clause>

(1)执行笛卡尔积(CROSS JOIN )

(2)应用ON筛选器(联接条件)

(3)添加外部行(outer row)
为外部联接准备

(4)应用WHERE筛选器
这里不可以用聚合函数,因为数据在前面那几步还没被分组
不可以用那些你在select后面定义的列别名

(5) 分组
因为你分组了,通常这组只能返回一条关于这个组的信息

(6) 应用HAVING筛选器
筛掉不需要的组

(7)处理SELECT列表
注意分组后你的基本列只能用分组里的基础对象列了,其他列要用就得用聚合函数分组

这里有个SQL特性-同时操作:就是表达式的别名不能用于SELECT列表的其他表达式。

这个特性你可以理解为操作都是一瞬间同时完成。否则你看下面的列子
UPDATE A SET COL=(SELECT MAX(COL) FROM A)
如果你的更新不是一起完成,有先后顺序,那你这里就会出问题了。最大的COL随时都在变可能。

(8)应用DISTINCT 子句
这里如果你的代码中出现了GROUP BY,那么它是不会移除任何行的

(9)应用ORDER BY 子句
这里的ORDER BY后面可以用SELECT后面的别名

SQL是基于集合理论的。集合不会排序,只是包含数据。
排序后它是有特定物理组织的行,ANSI就把这个对象叫做游标。也因为OEDER BY返回的不是表,所以使用了ORDER BY的SQL语句不可以再用于子查询,派生表等

(10)应用Limit子句
限制返回记录的起始位置和个数
  评论这张
 
阅读(142)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017