zoukankan      html  css  js  c++  java
  • SELECT 语句与其子句的详解

    SELECT
    从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。虽然 SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下:

    SELECT select_list
    [ INTO new_table ]
    FROM table_source
    [ WHERE search_condition ]
    [ GROUP BY group_by_expression ]
    [ HAVING search_condition ]
    [ ORDER BY order_expression [ ASC | DESC ] ]

    可以在查询之间使用 UNION 运算符,以将查询的结果组合成单个结果集。
    语法
    SELECT statement ::=
       < query_expression >
       [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
           [ ,...n ]    ]
       [ COMPUTE
           { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ]
           [ BY expression [ ,...n ] ]
       ]
       [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
               [ , XMLDATA ]
               [ , ELEMENTS ]
               [ , BINARY base64 ]
           }
    ]
       [ OPTION ( < query_hint > [ ,...n ]) ]

    < query expression > ::=
       { < query specification > | ( < query expression > ) }
       [ UNION [ ALL ] < query specification | ( < query expression > ) [...n ] ]

    < query specification > ::=
       SELECT [ ALL | DISTINCT ]
           [ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
           < select_list >
       [ INTO new_table ]
       [ FROM { < table_source > } [ ,...n ] ]
       [ WHERE < search_condition > ]
       [ GROUP BY [ ALL ] group_by_expression [ ,...n ]
           [ WITH { CUBE | ROLLUP } ]
       ]
       [HAVING <search_condition>]
    由于 SELECT 语句的复杂性,下面按子句说明详细的语法元素和参数:

    SELECT 子句
    指定由查询返回的列。
    语法
    SELECT [ ALL | DISTINCT ]
       [ TOP n [ PERCENT ] [ WITH TIES ] ]
       < select_list >

    < select_list > ::=

       {    *
           | { table_name | view_name | table_alias }.*
           |     { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
               [ [ AS ] column_alias ]
           | column_alias = expression
       }    [ ,...n ]

    参数
    ALL
    指定在结果集中可以显示重复行。ALL 是默认设置。
    DISTINCT
    指定在结果集中只能显示唯一行。为了 DISTINCT 关键字的用途,空值被认为相等。
    TOP n [PERCENT]
    指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
    如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n 行)。如果查询没有 ORDER BY 子句,行的顺序将任意。
    WITH TIES
    指定从基本结果集中返回附加的行,这些行包含与出现在 TOP n (PERCENT) 行最后的 ORDER BY 列中的值相同的值。如果指定了 ORDER BY 子句,则只能指定 TOP ...WITH TIES。
    < select_list >
    为结果集选择的列。选择列表是以逗号分隔的一系列表达式。
    *
    指定在 FROM 子句内返回所有表和视图内的所有列。列按 FROM 子句所指定的由表或视图返回,并按它们在表或视图中的顺序返回。
    table_name | view_name | table_alias.*
    将 * 的作用域限制为指定的表或视图。
    column_name
    是要返回的列名。限定 column_name 以避免二义性引用,当 FROM 子句中的两个表内有包含重复名的列时会出现这种情况。例如,Northwind 数据库中的 Customers 和 Orders 表内都有名为 ColumnID 的列。如果在查询中联接这两个表,可以在选择列表中将客户 ID 指定为 Customers.CustomerID。
    expression
    是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合,或者是子查询。
    IDENTITYCOL
    返回标识列。有关更多信息,请参见 IDENTITY(属性)、ALTER TABLE 和 CREATE TABLE。
    如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列,则必须用特定的表名(如 T1.IDENTITYCOL)限定 IDENTITYCOL。
    ROWGUIDCOL
    返回行全局唯一标识列。
    如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名(如 T1.ROWGUIDCOL)限定 ROWGUIDCOL。
    column_alias
    是查询结果集内替换列名的可选名。例如,可以为名为 quantity 的列指定别名,如"Quantity"或"Quantity to Date"或"Qty"。
    别名还可用于为表达式结果指定名称,例如:
    USE Northwind
    SELECT AVG(UnitPrice) AS 'Average Price'
    FROM [Order Details]
    column_alias 可用于 ORDER BY 子句。然而,不能用于 WHERE、GROUP BY 或 HAVING 子句。如果查询表达式是 DECLARE CURSOR 语句的一部分,则 column_alias 不能用在 FOR UPDATE 子句中。

    INTO 子句
    创建新表并将结果行从查询插入新表中。
    用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。有关更多信息,请参见事务和显式事务。
    通过在 WHERE 子句中包含 FALSE 条件,可以使用 SELECT...INTO 创建没有数据的相同表定义(不同表名)。
    语法
    [ INTO new_table ]
    参数
    new_table
    根据选择列表中的列和 WHERE 子句选择的行,指定要创建的新表名。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。
    当选择列表中包含计算列时,新表中的相应列不是计算列。新列中的值是在执行 SELECT...INTO 时计算出的。
    在此次发布的 SQL Server 版本中,select into/bulkcopy 数据库选项对是否可以使用 SELECT INTO 创建永久表没有影响。对包括 SELECT INTO 在内的某些大容量操作的记录量,取决于对数据库有效的恢复模式。有关更多信息,请参见使用恢复模型。
    在以前发布的版本中,如果设置了 select into/bulk copy,则可用 SELECT INTO 创建永久表。
    select into/bulk copy 用于向后兼容,但在以后的版本中可能不支持该选项。有关更多信息,请参考"恢复模式"和"向后兼容性"主题以及 ALTER DATABASE 主题。

    FROM 子句
    指定从其中检索行的表。需要 FROM 子句,除非选择列表只包含常量、变量和算术表达式(没有列名)。有关更多信息,请参见 FROM。
    语法
    [ FROM { < table_source > } [ ,...n ] ]

    < table_source > ::=
       table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
       | view_name [ [ AS ] table_alias ]
       | rowset_function [ [ AS ] table_alias ]
       | OPENXML
       | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
       | < joined_table >

    < joined_table > ::=
        < table_source > < join_type > < table_source > ON < search_condition >
       | < table_source > CROSS JOIN < table_source >
       | < joined_table >

    < join_type > ::=
       [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
       [ < join_hint > ]
       JOIN
    参数
    < table_source >
    指定用于 SELECT 语句的表、视图、派生表和联接表。
    table_name [[AS] table_alias ]
    指定表名和可选别名。
    view_name [ [ AS ] table_alias ]
    指定名称、视图和可选别名。
    rowset_function [ [AS] table_alias ]
    是行集函数名和可选别名。有关行集函数列表的更多信息,请参见行集函数。
    OPENXML
    在 XML 文档上提供行集视图。有关更多信息,请参见 OPENXML。
    WITH ( < table_hint > [ ,...n ] )
    指定一个或更多表提示。有关表提示的更多信息,请参见 FROM。
    derived_table [ [ AS ] table_alias ]
    是嵌套 SELECT 语句,可从指定的数据库和表中检索行。
    column_alias
    替换结果集内列名的可选别名。
    <joined_table>
    是两个或更多表的积的结果集。例如:
    SELECT *
    FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
       RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
           ON tab3.c1 = tab4.c1
           ON tab2.c3 = tab4.c3
    对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序。
    <join_type>
    指定联接操作的类型。
    INNER
    指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。
    LEFT [OUTER]
    指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为 NULL。
    RIGHT [OUTER]
    指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为 NULL。

    FULL [OUTER]
    如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为 NULL。除此之外,结果集中还包含通常由内联接返回的所有行。
    <join_hint>
    指定联接提示或执行算法。如果指定了 <join_hint>,也必须明确指定 INNER、LEFT、RIGHT 或 FULL。有关联接提示的更多信息,请参见 FROM。
    JOIN
    表示联接所指定的表或视图。
    ON <search_condition>
    指定联接所基于的条件。此条件可指定任何谓词,但通常使用列和比较运算符。例如:
    SELECT ProductID, Suppliers.SupplierID
       FROM Suppliers JOIN Products
       ON (Suppliers.SupplierID = Products.SupplierID)
    当条件指定列时,列不必有相同的名称或相同的数据类型。但是如果数据类型不同,则它们必须是兼容或可由 Microsoft? SQL Server? 进行隐性转换的类型。如果数据类型不能隐式转换,则条件必须使用 CAST 函数显式转换数据类型。
    有关搜索条件和谓词的更多信息,请参见搜索条件。
    CROSS JOIN
    指定两个表的矢量积。返回同样的行,就像要联接的表只列于 FROM 子句中,并且未指定 WHERE 子句。例如,这两个查询返回的结果集都由 T1 和 T2 中所有行的完全联接组成:
    SELECT * FROM T1, T2
    SELECT * FROM T1 CROSS JOIN T2

    WHERE 子句
    指定用于限制返回的行的搜索条件。
    语法
    [ WHERE < search_condition > | < old_outer_join > ]

    < old_outer_join > ::=
       column_name { * = | = * } column_name

    参数
    <search_condition>
    通过使用谓词限制结果集内返回的行。对搜索条件中可以包含的谓词数量没有限制。有关搜索条件和谓词的更多信息,请参见搜索条件。
    < old_outer_join >
    使用不标准的产品专用语法和 WHERE 子句指定外联接。*= 运算符用于指定左向外联接,=* 运算符用于指定右向外联接。
    下例指定一个左向外联接,并在结果集内包含 Tab1 中不满足指定条件的行:
    SELECT Tab1.name, Tab2.id
    FROM Tab1, Tab2
    WHERE Tab1.id *=Tab2.id
    说明  这种语法具有潜在的二义性解释并且不标准,因此不提倡使用这种语法进行外联接。而应在 FROM 子句中指定联接。
    可以通过在 FROM 子句中使用联接运算符,或通过在 WHERE 子句中使用不标准的 *= 和 =* 运算符来指定外联接。不能在同一语句中同时使用这两种方法。

    GROUP BY 子句
    指定用来放置输出行的组,并且如果 SELECT 子句 <select list> 中包含聚合函数,则计算每组的汇总值。指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
    说明  如果未指定 ORDER BY 子句,则使用 GROUP BY 子句不按任何特定的顺序返回组。建议始终使用 ORDER BY 子句指定具体的数据顺序。
    语法
    [ GROUP BY [ ALL ] group_by_expression [ ,...n ]
           [ WITH { CUBE | ROLLUP } ]
    ]
    参数
    ALL
    包含所有组和结果集,甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。
    如果访问远程表的查询中有 WHERE 子句,则不支持 GROUP BY ALL 操作。
    group_by_expression
    是对其执行分组的表达式。group_by_expression 也称为分组列。group_by expression 可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。
    说明  text、ntext 和 image 类型的列不能用于 group_by_expression。
    对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。
    CUBE
    指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL,但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。
    结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。
    ROLLUP
    指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。
    重要  使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,SQL Server 将返回错误信息并取消查询。

    HAVING 子句
    指定组或聚合的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句,HAVING 的行为与 WHERE 子句一样。
    语法
    [HAVING <search_condition>]
    参数
    <search_condition>
    指定组或聚合应满足的搜索条件。当 HAVING 与 GROUP BY ALL 一起使用时,HAVING 子句替代 ALL。有关更多信息,请参见搜索条件。
    在 HAVING 子句中不能使用 text、image 和 ntext 数据类型。
    说明  在 SELECT 语句中使用 HAVING 子句不影响 CUBE 运算符分组结果集和返回汇总聚合行的方式。

    UNION 运算符
    将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。
    使用 UNION 组合两个查询的结果集的两个基本规则是:
    所有查询中的列数和列的顺序必须相同。
    数据类型必须兼容。
    语法
       { < query specification > | ( < query expression > ) }
           UNION [ ALL ]
           < query specification | ( < query expression > )
               [ UNION [ ALL ] < query specification | ( < query expression > )
                   [ ...n ] ]
    参数
    < query_specification > | ( < query_expression > )
    是查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据组合的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐性转换实现兼容。
    下表说明数据类型与相应 (ith) 列的选项的比较规则。
    ith 列的数据类型 结果表中 ith 列的数据类型
    非数据兼容类型(数据转换不由 Microsoft? SQL Server? 隐性处理)。 SQL Server 返回的错误。
    长度为 L1 和 L2 的固定长度 char。 长度与 L1 和 L2 中较长的那个相等的固定长度 char。
    长度为 L1 和 L2 的固定长度 binary。 长度与 L1 和 L2 中较长的那个相等的固定长度 binary。
    任一列或两列都是可变长度 char。 长度与为 ith 列指定的最大长度相等的可变长度 char。
    任一列或两列都是可变长度 binary。 长度与为 ith 列指定的最大长度相等的可变长度 binary。
    两列都是数字数据类型(如 smallint、int、float、money)。 与两列的最大精度相等的数据类型。例如,如果表 A 的 ith 列是 int 类型,表 B 的 ith 列是 float 类型,则 ith 列在结果表中的数据类型是 float,因为 float 比 int 更精确。
    两列的描述都指定 NOT NULL。 指定 NOT NULL。
    UNION
    指定组合多个结果集并将其作为单个结果集返回。
    ALL
    在结果中包含所有的行,包括重复行。如果没有指定,则删除重复行。

    ORDER BY 子句
    指定结果集的排序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。
    语法
    [ ORDER BY { order_by_expression [ ASC | DESC ] }    [ ,...n ] ]
    参数
    order_by_expression
    指定要排序的列。可以将排序列指定为列名或列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。
    可指定多个排序列。ORDER BY 子句中的排序列序列定义排序结果集的结构。
    ORDER BY 子句可包括未出现在此选择列表中的项目。然而,如果指定 SELECT DISTINCT,或者如果 SELECT 语句包含 UNION 运算符,则排序列必定出现在选择列表中。
    此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。
    说明  在 ORDER BY 子句中不能使用 ntext、text 和 image 列。
    ASC
    指定按递增顺序,从最低值到最高值对指定列中的值进行排序。
    DESC
    指定按递减顺序,从最高值到最低值对指定列中的值进行排序。
    空值被视为最低的可能值。
    对 ORDER BY 子句中的项目数没有限制。然而,对于排序操作所需的中间级工作表的大小有 8,060 字节的限制。这限制了在 ORDER BY 子句中指定的列的合计大小。
    COMPUTE 子句
    生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。可在同一查询内指定 COMPUTE BY 和 COMPUTE。
    语法
    [ COMPUTE
       { { AVG | COUNT | MAX | MIN | STDEV | STDEVP
           | VAR | VARP | SUM }
               ( expression ) } [ ,...n ]
       [ BY expression [ ,...n ] ]

    参数
    AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM
    指定要执行的聚合。下面是 COMPUTE 子句使用的行聚合函数:
    行聚合函数 结果
    AVG 数字表达式中所有值的平均值
    COUNT 选定的行数
    MAX 表达式中的最高值
    MIN 表达式中的最低值
    STDEV 表达式中所有值的统计标准偏差
    STDEVP 表达式中所有值的填充统计标准偏差
    SUM 数字表达式中所有值的和
    VAR 表达式中所有值的统计方差
    VARP 表达式中所有值的填充统计方差
    没有等同于 COUNT(*) 的函数。若要查找由 GROUP BY 和 COUNT(*) 生成的汇总信息,请使用不带 BY 的 COMPUTE 子句。
    这些函数忽略空值。
    如果是用 COPPUT 子句指定的行聚合函数,则不允许它们使用 DISTINCT 关键字。
    当添加或平均整数数据时,即使列的数据类型为 smallint 或 tinyint,SQL Server 也将结果视为 int 值。有关返回添加数据或平均数据的类型的更多信息,请参见 SUM 和 AVG。
    说明  为减少在 ODBC 和 DB-Library 程序中溢出错误的可能性,请将平均或汇总结果的所有变量声明均作为数据类型 int。
    ( expression )
    表达式,如对其执行计算的列名。expression 必须出现在选择列表中,并且必须将其指定为与选择列表中的某个表达式完全一样。在 expression 内不能使用在选择列表中指定的列的别名。
    说明  在 COMPUTE 或 COMPUTE BY 子句中,不能指定 ntext、text 和 image 数据类型。
    BY expression
    在结果集内生成控制中断和分类汇总。expression 是 order_by_expression 在相关 ORDER BY 子句中的精确复本。一般情况下,这是列名或列的别名。可指定多个表达式。在 BY 后列出多个表达式可将一个组分成子组并在每个分组级别上应用聚合函数。
    如果使用 COMPUTE BY,则必须也使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集,并且必须按相同的序列。例如,如果 ORDER BY 子句是:
    ORDER BY a, b, c
    则 COMPUTE子句可以是下面的任意一个(或全部):
    COMPUTE BY a, b, c
    COMPUTE BY a, b
    COMPUTE BY a
    说明  在带 COMPUTE 子句的 SELECT 语句中,选择列表中的列顺序替代 COMPUTE 子句中的聚合函数顺序。ODBC 和 DB-library 程序员必须知道这种顺序要求,以将聚合函数结果放在正确的位置。
    由于包含 COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中,因此在 SELECT INTO 语句中不能使用 COMPUTE。因而,任何由 COMPUTE 生成的计算结果不出现在用 SELECT INTO 语句创建的新表内。
    当 SELECT 语句是 DECLARE CURSOR 语句的一部分时,不能使用 COMPUTE 子句。
    FOR 子句
    FOR 子句用于指定 BROWSE 或 XML 选项(BROWSE 和 XML 是不相关的选项)。
    语法
    [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
               [ , XMLDATA ]
               [ , ELEMENTS ]
               [ , BINARY BASE64 ]
           }
    ]
    参数
    BROWSE
    指定当查看 DB-Library 浏览模式游标中的数据时允许更新。如果表包含时间戳列(用 timestamp 数据类型定义的列),表有唯一索引且 FOR BROWSE 选项在 SELECT 语句的最后发送到 SQL Server,则可以在应用程序中浏览该表。有关更多信息,请参见浏览模式。
    说明  在含有 FOR BROWSE 选项的 SELECT 语句中无法使用 <lock_hint> HOLDLOCK。
    FOR BROWSE 选项不能出现在用 UNION 运算符联接的 SELECT 语句中。
    XML
    指定查询结果将作为 XML 文档返回。必须指定下列 XML 模式之一:RAW、AUTO、EXPLICIT。有关 XML 数据和 SQL Server 的更多信息,请参见使用 FOR XML 检索 XML 文档。
    RAW
    获得查询结果并将结果集内的各行转换为 XML 元素,用一般标识符 <row /> 作为元素标记。有关更多信息,请参见使用 RAW 模式。
    AUTO
    以简单的嵌套 XML 树返回查询结果。在 FROM 子句内,每个在 SELECT 子句中至少有一列被列出的表都表示为一个 XML 元素。SELECT 子句中列出的列映射到适当的元素特性。有关更多信息,请参见使用 AUTO 模式。
    EXPLICIT
    指定显式定义所得到的 XML 树的形状。使用此种模式,要求以一种特定的方式编写查询,以便显式指定有关期望的嵌套的附加信息。有关更多信息,请参见使用 EXPLICIT 模式。
    XMLDATA
    返回架构,但不将根元素添加到结果中。如果指定了 XMLDATA,它将被追加到文档上。
    ELEMENTS
    指定列作为子元素返回。否则,列将映射到 XML 特性。
    BINARY BASE64
    指定查询返回二进制 base64 编码格式的二进制数据。使用 RAW 和 EXPLICIT 模式检索二进制数据时,必须指定该选项。这是 AUTO 模式中的默认值。

    OPTION 子句
    指定应在整个查询中使用所指定的查询提示。每个查询提示只能指定一次,但允许指定多个查询提示。用该语句只可能指定一个 OPTION 子句。查询提示影响语句中的所有运算符。如果主查询中涉及 UNION,则只有涉及 UNION 运算符的最后一个查询可以有 OPTION 子句。如果一个或多个查询提示导致查询优化器不生成有效计划,则产生 8622 号错误。
    注意  查询优化器通常为查询选择最佳执行计划,因此建议有经验的数据库管理员将 <join_hint>、<query_hint> 和 <table_hint> 仅作为最后的手段。
    语法
    [ OPTION ( < query_hint > [ ,...n ) ]
    < query_hint > ::=
       {    { HASH | ORDER } GROUP
       | { CONCAT | HASH | MERGE } UNION
       | {LOOP | MERGE | HASH } JOIN
       | FAST number_rows
       | FORCE ORDER
       | MAXDOP number
       | ROBUST PLAN
       | KEEP PLAN
       | KEEPFIXED PLAN
       | EXPAND VIEWS
       }
    参数
    { HASH | ORDER } GROUP
    指定在 GROUP BY、DISTINCT 或 COMPUTE 查询子句中所描述的聚合应使用哈希操作或排列。
    { MERGE | HASH | CONCAT } UNION
    指定由合并、哈希或串联 UNION 集合执行所有 UNION 运算。如果指定了不止一个 UNION 提示,查询优化器就会从这些指定的提示中选择开销最少的策略。
    { LOOP | MERGE | HASH } JOIN
    指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了多个联接提示,则优化器从允许的联接策略中选择最便宜的联接策略。
    如果在同一个查询中,还为一对特定的表指定了联接提示,则虽然仍须遵守查询提示,但该联接提示将优先联接这两个表。因此,为这对表指定的联接提示可能只限制选择查询提示中允许的联接方法。有关详细信息,请参见提示。
    FAST number_rows
    指定对查询进行优化,以便快速检索第一个 number_rows(非负整数)。在第一个 number_rows 返回后,查询继续进行并生成完整的结果集。
    FORCE ORDER
    指定在查询优化过程中保持由查询语法表示的联接顺序。
    MAXDOP number
    只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时,所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息,请参见 max degree of parallelism 选项。
    ROBUST PLAN
    强制查询优化器以性能为代价,使用对最大可能的行大小有效的计划。处理查询时,中间级表和运算符可能需要存储和处理比输入行宽的行。在有些情况下,行可能很宽,以致某个运算符无法处理行。如果发生这种情况,SQL Server 将在查询执行过程中生成错误。通过使用 ROBUST PLAN,可以指示查询优化器不考虑可能会遇到该问题的查询计划。
    KEEP PLAN
    强制查询优化器对查询放宽估计的重新编译阈值。估计的重新编译阈值是一个点,基于该点当对表的索引列更改(更新、删除或插入)达到估计的数字时自动重新编译查询。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。
    KEEPFIXED PLAN
    强制查询优化器不因统计中的更改或索引列(更新、删除或插入)而重新编译查询。指定 KEEPFIXED PLAN 将确保仅当更改基础表的架构或在那些表上执行 sp_recompile 时才重新编译查询。
    EXPAND VIEWS
    指定展开索引视图,而且查询优化器不将任何索引视图看作是查询中任何部分的替代。(当视图名称由查询文本中的视图定义替换时,视图将展开。)实际上,该查询提示不允许在查询计划中直接使用索引视图和直接在索引视图上使用索引。
    只有在查询的 SELECT 部分中直接引用视图,而且指定 WITH (NOEXPAND) 或 WITH(NOEXPAND、INDEX( index_val [ ,...n ] )),才会展开索引视图。有关查询提示 WITH (NOEXPAND) 的更多信息,请参见 FROM。
    只有语句的 SELECT 部分的视图(包括 INSERT、UPDATE 和 DELETE 语句中的视图)才受提示影响。
    注释
    SELECT 语句中的子句顺序非常重要。可以省略可选子句,但这些子句在使用时必须按适当的顺序出现。
    只有当这些语句的选择列表包含给函数的局域变量赋值的表达式时,在用户定义的函数中才允许有 SELECT 语句。
    在 table 变量的作用域内,可以像访问常规表那样访问 table 变量,因此可以在 SELECT 语句内将 table 变量作为表源使用。
    对于由四部分组成的名称,若其中的服务器名称使用的是 OPENDATASOURCE 函数,则该名称可以在表名能够在 SELECT 语句内出现的任何位置作为表源使用。
    对涉及远程表的 SELECT 语句有一些语法限制。有关更多信息,请参见外部数据和 Transact-SQL。
    选择列表内包含的text 或 ntext 列的返回长度默认为最小的 text 实际大小、默认的 TEXTSIZE 会话设置或硬编码应用程序限制。若要更改会话的返回文本长度,请使用 SET 语句。默认情况下,用 SELECT 语句返回的文本数据的长度限制是 4,000 字节。
    如果发生下列两种情况中的一种,SQL Server 将生成编号为 511 的异常错误并回滚当前执行的语句:
    SELECT 语句生成超过 8,060 字节的结果行或中间级工作表。
    试图对超过 8,060 字节的行执行 DELETE、INSERT 或 UPDATE 语句。
    在 SQL Server 中,如果没有为 SELECT INTO 或 CREATE VIEW 语句创建的列提供列名,将会发生错误。
    选择标识列
    将现有标识列选入新表时,新列将继承 IDENTITY 属性,除非下列条件中的一个为真:
    SELECT 语句包含联接、GROUP BY 子句或聚合函数。
    多个 SELECT 语句由 UNION 联接。
    标识列在选择列表内多次列出。
    标识列是表达式的一部分。
    如果这些条件中的一个为真,列将被创建为 NOT NULL 而不继承 IDENTITY 属性。所有用于标识列的规则和限制均适用于新表。
    旧式外联接
    SQL Server 的早期版本支持在 WHERE 子句中使用 *= 和 =* 运算符定义外联接。SQL Server 7.0 版支持 SQL-92 标准,该标准在 FROM 子句中提供联接运算符。建议使用 SQL-92 语法重新编写查询。
    WHERE、GROUP BY 和 HAVING 子句的处理顺序
    下表显示带 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序:
    WHERE 子句排除不满足搜索条件的行。
    GROUP BY 子句将选定的行收集到 GROUP BY 子句中各唯一值的组中。
    在选择列表中指定的聚合函数计算各组的汇总值。
    HAVING 子句进一步排除不满足搜索条件的行。

    查询的逻辑执行顺序

        (1) FROM < left_table>

        (2) ON < join_condition>

        (3) < join_type> JOIN < right_table>

        (4) WHERE < where_condition>

        (5) GROUP BY < group_by_list>

        (6) WITH {cube | rollup}

        (7) HAVING < having_condition>

        (8) SELECT (9) DISTINCT (11) < top_specification> < select_list>

        (10) ORDER BY < order_by_list>

    标准的SQL 的解析顺序为:

       (1).FROM 子句 组装来自不同数据源的数据

       (2).WHERE 子句 基于指定的条件对记录进行筛选

       (3).GROUP BY 子句 将数据划分为多个分组

       (4).使用聚合函数进行计算

       (5).使用HAVING子句筛选分组

       (6).计算所有的表达式

       (7).使用ORDER BY对结果集进行排序

    执行顺序:

        1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1

        2.ON:对vt1表应用ON筛选器只有满足< join_condition> 为真的行才被插入vt2

        3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束

        4.WHERE:对vt3应用 WHERE 筛选器只有使< where_condition> 为true的行才被插入vt4

        5.GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

        6.CUBE|ROLLUP:把超组(supergroups)插入vt6 生成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 并返回调用者
    权限
    SELECT 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_datareader 固定数据库角色的成员以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色的成员和表所有者可以将权限转让给其他用户。
    如果用 INTO 子句创建永久表,用户必须在目的数据库中具有 CREATE TABLE 权限。

  • 相关阅读:
    【文本处理命令】之find搜索命令
    【文本处理命令】之grep搜索命令详解
    【VM配置】配置主机名称、网卡和yum源配置
    【Linux命令】安装命令(yum,rpm)
    【Linux命令】文件目录管理命令7个(touch、mkdir、cp、mv、rm、dd、file)
    【Linux命令】文本文件编辑命令10个(cat、more、less、head、tail、tr、wc、stat、cut、diff)
    Redis系列---redis简介01
    redis中 Could not get a resource from the pool 异常解决
    Nginx配置Tomcat8反向代理出现 java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
    FtpClient上传文件速度非常慢,而且大小为0,上传失败
  • 原文地址:https://www.cnblogs.com/BlogNetSpace/p/1218736.html
Copyright © 2011-2022 走看看