现在的位置: 首页 > 综合 > 正文

T-SQL查询 点滴 1

2011年08月07日 ⁄ 综合 ⁄ 共 2587字 ⁄ 字号 评论关闭

最近业余时间在阅读《Microsoft SQL Server 2005技术内幕:T-SQL查询》,虽然是本3年前的书,但是书的内容和技术含量还是蛮经典的,从更深的层次理解T-SQL的查询处理,边看边做了些笔记,分享给大家。

 

第一章:逻辑查询处理

1. 逻辑查询处理阶段简介
SELECT DISTINCT <TOP_specification> <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
WITH {CUBE | ROLLUP}
HAVING <having_condition>
ORDER BY <order_by_list>

逻辑查询处理的各个阶段:

(1) FROM :对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1。
(2) 对虚拟表VT1应用ON筛选器。只有那些<join_condition>为真的行才能被插入VT2。
(3) OUTER(JOIN):如果指定了OUTER JOIN (相对于CROSS JOIN或INNER JOIN),保留表中未找到匹配的行将作为外部行添加到TV2,生成TV3。如果FORM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行1-3步骤,直到处理完所有表为止。
(4) WHERE:对VT3应用WHERE筛选器。只有满足<where_condition>为TRUE的行才被插入VT4。
(5) GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5。
(6) CUBE|ROLLUP:把超组插入VT5,生成VT6。
(7) HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才被插入VT7。
(8) SELECT:处理SELECT列表,产生VT8。
(9) DISTINCT:将重复的行从VT8中移除,产生VT9。
(10) ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个游标(VC10)。
(11) TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
注:
(1) 只有使用外部联接时,ON和WHERE子句才会存在这种逻辑差别。当使用内部联接时,在哪里指定逻辑表达式都无所谓。
(2) 避免GROUP BY ALL的使用。
(3) 在SELECT列表中创建的别名不能在前面的步骤中使用。不支持SELECT c1+1 AS e1,e1+1 AS e2的做法,只能在SELECT列表后的步骤使用列别名。
(4) Order By操作不返回表,而是返回游标,对表进行排序的查询可以返回一个对象,包含按特定物理顺序组织的行。这种对象成为游标。
(5) 使用了ORDER BY 的子句不能用到表表达式中(视图,内联表值函数,子查询,派生表)。
(6) TOP选项是T-SQL特有的,不属于关系范畴。

2. SQL 2005中新增的逻辑处理阶段
(1) 表运算符
SQL SERVER 2005中支持4种用于FORM子句的表运算符:JOIN,APPLY,PIVOT,和UNPIVOT。
表运算符用一个或两个表作为输入,根据它们相对于表运算符关键字的位置,它们被称为左输入和右输入。与联接一样,所有运算符都会用虚拟表作为他们的左输入,位于FROM子句的第一个表运算符用一个表表达式作为做输入并返回一个虚拟表作为结果。

下面是4个运算符及其元素:
JOIN:
<left_table_expression>
<join_type> JOIN <right_table_expression>
ON <join_condition>

APPLY:
<left_table_expression>
{CROSS | OUTER} APPLY <right_table_expression>

PIVOT:
<left_table_expression>
PIVOT (<aggregate_func(<expression>)> FOR
<source_col> IN (<target_col_list>))
AS <result_table_alias>

UNPIVOT:
<left_table_expression>
UNPIVOT (<target_values_col> FOR
<target_name_col> IN (<source_col_list>))
AS <result_table_alias>

APPLY PIVOT UNPIVOT不是ANSI运算符,而是T-SQL所特有的扩展。
(2) OVER子句
OVER子句允许你请求基于窗口的计算。如果指定了OVER子句,它的输入将代替查询的GROUP BY 列表,用于指定在聚合或排名函数进行计算时所基于的分区和排序。
只有两个阶段可以应用OVER子句:SELECT阶段和ORDER BY 阶段。
(3) 集合操作
SQL Server 2005 支持三种集合操作:UNION,EXCEPT和INTERSECT。
left_query UNION [ALL] | EXCEPT | INTERSECT right_query
集合操作在两个输入中比较全部行。
UNION返回包含两个输入中的所有行的结果集。如果未指定ALL选项,UNION将从结果集中移除重复行。
EXCEPT返回出现在左输入但未出现在有输入的不重复行。
INTERSECT返回在两个输入中都出现的不重复行。

代码

---返回所有数据
select top 5 * from orders
union all
select top 10 * from orders

---返回6-10数据
select top 10 * from orders
except
select top 5 * from orders

---返回1-5数据
select top 10 * from orders
INTERSECT
select top 5 * from orders

ORDER BY 子句不能用于集合操作的单个查询中。只能在查询的最后指定ORDER BY子句,但它将被应用于集合操作的结果。

 

小结:掌握基础是关键,理解逻辑查询处理阶段和SQL 特有的这些方面对于树立SQL编程所需要的特殊观念是非常重要的。对处理问题时解决方案的选择上有很大的帮助。

 

 

抱歉!评论已关闭.