SQL Select Query的本质
2011-02-17 18:23:03| 分类:
dbms
| 标签:
|举报
|字号大中小 订阅
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子句
限制返回记录的起始位置和个数
评论这张
转发至微博
转发至微博
评论