SELECT 子句 (Transact-SQL)

指定查询返回的列。

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

语法

SELECT [ ALL | DISTINCT ]
[ TOP expression [ PERCENT ] [ WITH TIES ] ] 
<select_list> 
<select_list> ::= 
    { 
      | { table_name | view_name | table_alias }.* 
      | {
          [ { table_name | view_name | table_alias }. ]
               { column_name | $IDENTITY | $ROWGUID } 
          | udt_column_name [ { . | :: } { { property_name | field_name } 
            | method_name ( argument [ ,...n] ) } ]
          | expression
          [ [ AS ] column_alias ] 
         }
      | column_alias = expression 
    } [ ,...n ] 

参数

  • ALL
    指定在结果集中可以包含重复行。ALL 是默认值。
  • DISTINCT
    指定在结果集中只能包含唯一行。对于 DISTINCT 关键字来说,Null 值是相等的。
  • TOP expression [ PERCENT ] [ WITH TIES ]
    指示只能从查询结果集返回指定的第一组行或指定的百分比数目的行。expression 可以是指定数目或百分比数目的行。

    TOP 子句可以用于 SELECT、INSERT、UPDATE 和 DELETE 语句中。在 INSERT、UPDATE 和 DELETE 语句中,需要使用括号分隔 TOP 中的 expression。为了能够向后兼容,支持在 SELECT 语句中使用不带括号的 TOP expression,但推荐不这样做。有关详细信息,请参阅 TOP (Transact-SQL)

  • < select_list >
    要为结果集选择的列。选择列表是以逗号分隔的一系列表达式。可在选择列表中指定的表达式的最大数目是 4096。
  • *
    指定返回 FROM 子句中的所有表和视图中的所有列。这些列按 FROM 子句中指定的表或视图顺序返回,并对应于它们在表或视图中的顺序。
  • table_ name| view_ name| table_ alias.*
    * 的作用域限制为指定的表或视图。
  • column_ name
    要返回的列名。请限定 column_name 以避免引用不明确,例如,当 FROM 子句中的两个表包含同名的列时会出现这种情况。例如,AdventureWorks 数据库中的 SalesOrderHeaderSalesOrderDetail 表中均有名为 ModifiedDate 的列。如果将这两个表加入查询,则可以在选择列表中指定 SalesOrderDetail 项的修改日期,即 SalesOrderDetail.ModifiedDate
  • expression
    常量、函数以及由一个或多个运算符连接的列名、常量和函数的任意组合,或者是子查询。
  • $ROWGUID
    返回行 GUID 列。

    如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名限定 $ROWGUID,如 T1.$ROWGUID

  • udt_column_name
    要返回的公共语言运行时 (CLR) 用户定义类型列的名称。

    ms176104.note(zh-cn,SQL.90).gif注意:
    SQL Server Management Studio 返回以二进制表示形式表示的用户定义类型值。若要以字符串或 XML 格式返回用户定义类型值,请使用 CASTCONVERT
  • { . | :: }
    指定 CLR 用户定义类型的方法、属性或字段。将 . 用于实例(非静态)方法、属性或字段。将 :: 用于静态方法、属性或字段。若要调用 CLR 用户定义类型的方法、属性或字段,必须对类型具有 EXECUTE 权限。
  • property_name
    udt_column_name 的公共属性。
  • field_name
    udt_column_name 的公共数据成员。
  • method_name
    采用一个或多个参数的 udt_column_name 的公共方法。method_name 不能是赋值函数方法。

    以下示例通过调用名为 Distance 类型的方法,从 Cities 表中选择 Location 列的值(定义为 point 类型):

    CREATE TABLE Cities (
         Name varchar(20),
         State varchar(20),
         Location point );
    GO
    DECLARE @p point (32, 23), @distance float
    GO
    SELECT Location.Distance (@p)
    FROM Cities;
    
  • column_ alias
    查询结果集内替换列名的可选名。例如,可以为名为 quantity 的列指定别名,如 QuantityQuantity to DateQty

    别名还可用于为表达式结果指定名称,例如:

    USE AdventureWorks;

    GO

    SELECT AVG(UnitPrice) AS 'Average Price'

    FROM Sales.SalesOrderDetail;

    column_alias 可以用于 ORDER BY 子句中。但不能用于 WHERE、GROUP BY 或 HAVING 子句中。如果查询表达式是 DECLARE CURSOR 语句的一部分,则不能在 DECLARE CURSOR 中使用 column_alias

备注

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

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

不允许对视图使用 OPTION 子句。

table 变量的作用域内,可以像访问常规表那样访问 table 变量,因此可以在 SELECT 语句内将 table 变量作为表源使用。

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

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

选择列表中包含的 textntext 列返回的数据长度被设置为下列值中的最小值:text 列的实际大小、默认 TEXTSIZE 会话设置或硬编码应用程序限制。若要更改会话的返回文本长度,请使用 SET 语句。默认情况下,用 SELECT 语句返回的文本数据的长度限制是 4,000 字节。

如果发生下列两种情况中的一种,SQL Server 2005 数据库引擎 将引发编号为 511 的异常错误并回滚当前运行的语句:

  • SELECT 语句生成超过 8,060 字节的结果行或中间级工作表。
  • 尝试对超过 8,060 字节的行执行 DELETE、INSERT 或 UPDATE 语句。

如果没有为 SELECT INTO 或 CREATE VIEW 语句创建的列指定列名,将会发生错误。

选择标识列

将现有标识列选入新表时,新列将继承 IDENTITY 属性,除非下列条件中的一个为真:

  • SELECT 语句包含联接、GROUP BY 子句或聚合函数。
  • 多个 SELECT 语句由 UNION 联接。
  • 标识列在选择列表内多次列出。
  • 标识列是表达式的一部分。

如果这些条件中的一个为真,列将被创建为 NOT NULL 而不继承 IDENTITY 属性。所有用于标识列的规则和限制均适用于新表。

旧式外联接

SQL Server 的早期版本支持在 WHERE 子句中使用 *= 和 =* 运算符定义外部联接。SQL Server 7.0 版本支持 SQL-92 标准。这在 FROM 子句中提供联接运算符。当数据库的兼容级别设置为 90 时,不支持外部联接运算符 (*= 和 =*)。

WHERE、GROUP BY 和 HAVING 子句的处理顺序

以下步骤显示带 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序:

  1. FROM 子句返回初始结果集。
  2. WHERE 子句排除不满足搜索条件的行。
  3. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。
  4. 选择列表中指定的聚合函数可以计算各组的汇总值。
  5. 此外,HAVING 子句排除不满足搜索条件的行。

权限

需要具有 sysadmin 固定服务器角色、db_ownerdb_datareader 固定数据库角色的成员身份,或者必须是表的所有者。sysadmindb_ownerdb_securityadmin 角色的成员和表所有者可以将权限传输给其他用户。

如果用 INTO 子句创建永久表,用户必须在目的数据库中具有 CREATE TABLE 权限。

请参阅

参考

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE VIEW (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
表达式(Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL)
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
表 (Transact-SQL)
UNION (Transact-SQL)
UPDATE (Transact-SQL)
EXCEPT 和 INTERSECT (Transact-SQL)
WHERE (Transact-SQL)

其他资源

全文搜索查询
联接基础知识
子查询基础知识
使用变量和参数(数据库引擎)
使用标识符作为对象名称

帮助和信息

获取 SQL Server 2005 帮助