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 运算符,以便将各个查询的结果合并或比较到一个结果集中。
语法
<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 子句)引用。请注意,该语句的实际物理执行由查询处理器确定,因此在此列表中顺序可能会不同。
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE 或 WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
权限
选择数据要求对表或视图具有 SELECT 权限,该权限可从更高级别的权限继承,例如针对架构的 SELECT 权限或针对表的 CONTROL 权限。或者要求拥有 db_datareader 或 db_owner 固定数据库角色或 sysadmin 固定服务器角色的成员身份。使用 SELECTINTO 创建新表还要求 CREATETABLE 权限以及针对拥有这个新表的架构的 ALTERSCHEMA 权限。