zoukankan      html  css  js  c++  java
  • T-SQL 之 概述

      T-SQL(Transact Structured Query Language )它是ANSI和ISO SQL 标准的Microsoft SQL Server方言或扩展,SQL SERVER专用标准结构化查询语言增强版。,它是用来让应用程式与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL 的 DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。

      SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

      每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。

      首先,对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述:

    (8) SELECT  (9) DISTINCT  (11) <TOP_specification> <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)  WITH {CUBE | ROLLUP}
    (7)  HAVING <having_condition>
    (10) ORDER BY <order_by_list>

      逻辑查询处理阶段简介

    1. FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1。
    2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
    3. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3。如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
    4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4。
    5. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5。
    6. CUBE|ROLLUP:把超组(Suppergroups)插入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,并返回调用者。

      注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10。这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

      因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。

    例如,下面的派生表查询无效,并产生一个错误:

    select * 
    from(select orderid,customerid from orders order by orderid) as d

    下面的视图也会产生错误

    create view my_view
    as
    select *
    from orders
    order by orderid

      在SQL中,表表达式中不允许使用带有ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项)。

      所以要记住,不要为表中的行假设任何特定的顺序。换句话说,除非你确定要有序行,否则不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要执行有序索引扫描或使用排序运行符。

      二、在SQL Server 2008版本中,则对逻辑阶段的描述扩展到了所有的逻辑语句,而不仅仅是联接处理,如APPLY、PIVOT等。按这种分类方式,将逻辑步骤分成了6部分,部分步骤中包含了子步骤。

    (5)SELECT (5-2)DISTINCT (5-3)<TOP_specification> (5-1)<select_list>
    (1)FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <join_condition>
            |(1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
            |(1-P) <left_table> PIVOT(<pivot_specifications>) AS <alias>
            |(1-U) <left_table> UNPIVOT(<unpivot_specifications>) AS <alias>
    (2)WHERE <where_condition>
    (3)GROUP BY <group_by_list> (3-CR)WITH {CUBE | ROLLUP}
    (4)HAVING <having_condition>
    (6)ORDER BY <order_by_list>

    下图更详细地描述了各个处理步骤的流程:

      

      这种步骤分类相比2005版本而言更加全面和具体。上面步骤中的3-CR是我添加上去的,我觉得这样的描述更加全面。3-CR中的WITH ROLLUP和WITH CUBE参数,在SQL Server 2008中已经被GROUP BY子句的GROUPING SETS、ROLLUP和CUBE运算符代替,不再推荐使用不符合ISO标准的WITH ROLLUP、WITH CUBE和ALL语法。但是,这并不影响逻辑处理的顺序。

      下面是对逻辑处理过程中各个步骤的说明,请注意虚拟表(VTn)的生成步骤:

      1. FROM:该步骤中用于验证查询的源表,并处理表操作符。每个表操作符应用于一系列子步骤。例如,在上面用于联接的(1-J)步骤中会涉及如下的子步骤。最终这些子步骤完成后,将生成虚拟表VT1。

      [1] (1-J1):执行left_table和right_table两个表的交叉联接(笛卡儿乘积),生成虚拟表VT1-J1;

      [2] (1-J2):对笛卡儿乘积应用ON筛选器,生成虚拟表VT1-J2;

      [3] (1-J3):如果是外部联接,会在该步骤中将被ON筛选掉的外部行添加到VT1-J2中,生成VT1-J3。否则,将跳过该步骤。

      2. WHERE:对VT1应用WHERE筛选器,将符合筛选条件的行插入到VT2中。

      3. GROUP BY:按GROUP BY子句中的列列表对VT2中的行分组,生成VT3。如果语句中包含WITH CUBE或WITH ROLLUP,则将分组统计结果再次加总后插入VT3,生成VT3-RC。

      4. HAVING:对VT3应用HAVING筛选器,将符合筛选条件的行插入到VT4。

      5. SELECT:处理SELECT子句中的元素,生成VT5。

      [1](5-1)计算表达式:该步骤计算SELECT列表中的表达式,生成VT5-1;

      [2](5-2)DISTINCT:从VT5-1中移除重复行,生成VT5-2;

      [3](5-3)TOP:该步骤根据ORDER BY子句中指定的排序规则,从VT5-2的开始处筛选出指定数量或比例的行。

      6. ORDER BY:该步骤对VT5-3中的行按ORDER BY子句中的列列表进行排序,生成一个游标VC6。

  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/xinaixia/p/5138671.html
Copyright © 2011-2022 走看看