SELECT (Transact-SQL)

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

[ WITH <common_table_expression>]

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、EXCEPT 和 INTERSECT 运算符,以便将各个查询的结果合并或比较到一个结果集中。

主题链接图标Transact-SQL 语法约定

语法

        <SELECT statement> ::=  

    [WITH <common_table_expression> [,...n]]
    <query_expression> 
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } 
  [ ,...n ] ] 
    [ COMPUTE 
  { { AVG | COUNT | MAX | MIN | SUM } (expression )} [ ,...n ] 
  [ BY expression [ ,...n ] ] 
    ] 
    [ <FOR Clause>] 
    [ OPTION ( <query_hint> [ ,...n ] ) ] 

<query_expression> ::= 
    { <query_specification> | ( <query_expression> ) } 
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [...n ] ] 

<query_specification> ::= 
SELECT [ ALL | DISTINCT ] 
    [TOP (expression) [PERCENT] [ WITH TIES ] ] 

    < select_list > 
    [ INTO new_table ] 
    [ FROM { <table_source> } [ ,...n ] ] 
    [ WHERE <search_condition> ] 
    [ <GROUP BY> ] 
    [ HAVING < search_condition > ] 

注释

由于 SELECT 语句的复杂性,下面按子句说明详细的语法元素和参数:

SELECT 语句中的子句顺序非常重要。可以省略可选子句,但这些子句在使用时必须按适当的顺序出现。

只有当这些语句的选择列表包含给函数的局部变量赋值的表达式时,在用户定义函数中才允许有 SELECT 语句。

对于由四部分组成的名称,若其中的服务器名称使用的是 OPENDATASOURCE 函数,则该名称可以在表名能够在 SELECT 语句内出现的任何位置作为表源使用。

某些应用于 SELECT 语句的语法限制涉及到远程表。有关详细信息,请参阅分布式查询的使用准则

SELECT 语句的逻辑处理顺序

以下步骤显示 SELECT 语句的逻辑处理顺序或绑定顺序。此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句。例如,如果查询处理器可以绑定到(访问)在 FROM 子句中定义的表或视图,则这些对象及其列可用于所有后续步骤。 相反,因为 SELECT 子句处于步骤 8 中,所以,在该子句中定义的任何列别名或派生列不能由之前的子句引用。但是,它们可由后面的子句(例如 ORDER BY 子句)引用。请注意,该语句的实际物理执行由查询处理器确定,因此在此列表中顺序可能会不同。

  1. FROM

  2. ON

  3. JOIN

  4. WHERE

  5. GROUP BY

  6. WITH CUBE 或 WITH ROLLUP

  7. HAVING

  8. SELECT

  9. DISTINCT

  10. ORDER BY

  11. TOP

权限

选择数据要求对表或视图具有 SELECT 权限,该权限可从更高级别的权限继承,例如针对架构的 SELECT 权限或针对表的 CONTROL 权限。或者要求拥有 db_datareader 或 db_owner 固定数据库角色或 sysadmin 固定服务器角色的成员身份。使用 SELECTINTO 创建新表还要求 CREATETABLE 权限以及针对拥有这个新表的架构的 ALTERSCHEMA 权限。

请参阅

参考