SELECT 语句的各部分

虽然 SELECT 语句的完整语法较复杂,但是它的主要子句可归纳如下:

SELECT select_list

INTO new_table_name

FROM table_list

[ WHERE search_conditions ]

[ GROUP BY group_by_list ]

[ HAVING search_conditions ]

[ ORDER BY order_list [ ASC | DESC ] ]

select_list

描述结果集的列。它是一个逗号分隔的表达式列表。每个表达式同时定义格式(数据类型和大小)和结果集列的数据来源。通常,每个选择列表表达式都是对数据所在的源表或视图中的列的引用,但也可能是对任何其他表达式(例如,常量或 Transact-SQL 函数)的引用。在选择列表中使用 * 表达式可指定返回源表的所有列。

INTO new_table_name

指定使用结果集来创建新表。new_table_name 指定新表的名称。

FROM table_list

包含从中检索到结果集数据的表的列表。这些来源可以是:

  • 运行 SQL Server 2005 的本地服务器中的基表。
  • 本地 SQL Server 实例中的视图。SQL Server 在内部将一个视图引用按照组成该视图的基表解析为多个引用。
  • 链接表。它们是 OLE DB 数据源中的表,SQL Server 可以访问它们。称之为“分布式查询”。通过将 OLE DB 数据源链接为链接服务器,或在 OPENROWSET 或 OPENQUERY 函数中引用数据源,可以从 SQL Server 访问 OLE DB 数据源。

FROM 子句还可以包含联接规范。这些联接规范定义了 SQL Server 在从一个表导航到另一个表时使用的特定路径。

FROM 子句还用在 DELETE 和 UPDATE 语句中以定义要修改的表。

WHERE search_conditions

WHERE 子句是一个筛选,它定义了源表中的行要满足 SELECT 语句的要求所必须达到的条件。只有符合条件的行才向结果集提供数据。不符合条件的行,其中的数据将不被采用。

WHERE 子句还用在 DELETE 和 UPDATE 语句中以定义目标表中要修改的行。

GROUP BY group_by_list

GROUP BY 子句根据 group_by_list 列中的值将结果集分成组。例如,AdventureWorksSales.SalesOrderHeader 表在 TerritoryID 中有十个值。GROUP BY TerritoryID 子句将结果集分成 10 组,每组分别对应 TerritoryID 的一个值。

HAVING search_conditions

HAVING 子句是应用于结果集的附加筛选。从逻辑上讲,HAVING 子句是从应用了任何 FROM、WHERE 或 GROUP BY 子句的 SELECT 语句而生成的中间结果集中筛选行。尽管 HAVING 子句前并不是必须要有 GROUP BY 子句,但 HAVING 子句通常与 GROUP BY 子句一起使用。

ORDER BY order_list[ ASC | DESC ]

ORDER BY 子句定义了结果集中行的排序顺序。order_list 指定组成排序列表的结果集列。关键字 ASC 和 DESC 用于指定排序行的排列顺序是升序还是降序。

ORDER BY 之所以重要,是因为关系理论规定除非已经指定 ORDER BY,否则不能假设结果集中的行带有任何序列。如果结果集行的顺序对于 SELECT 语句来说很重要,那么在该语句中就必须使用 ORDER BY 子句。

SELECT 语句中的子句必须以适当顺序指定。

对数据库对象的每个引用都不得引起歧义。下列情况可能导致多义性:

  • 在一个系统中可能有多个对象具有相同的名称。例如,Schema1Schema2 可能都含有一个名为 TableX 的表。若要解决多义性问题并指定 TableXUser1 所有,至少应使用架构名称来限定表名称:

    SELECT *
    FROM Schema1.TableX
    
  • 在执行 SELECT 语句时,对象所驻留的数据库不一定总是当前数据库。若要确保使用的对象始终是正确的,而不考虑当前数据库的设置,则应以数据库和架构来限定对象名称:

    SELECT *
    FROM AdventureWorks.Purchasing.ShipMethod
    
  • 在 FROM 子句中所指定的表和视图可能有相同的列名。外键经常与它们的相关主键有相同的列名称。若要解决重复名称之间的多义性问题,必须使用表或视图名称来限定列名:

    SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
    FROM Sales.Customer JOIN Sales.Store ON
           ( Sales.Customer.CustomerID = Sales.Store.CustomerID)
    WHERE Sales.Customer.TerritoryID = 1
    

    当表和视图名称都必须完全限定时,语法将变得复杂。您可以在 FROM 子句中使用 AS 关键字为表指定一个相关名称(也称为作用域变量或别名),来解决此问题。只能在 FROM 子句中定义完全合法的表或视图名称。然后所有其他表或视图引用都可使用此相关名称。若要在上例中应用相关名称并且完全限定表,请创建如下 SELECT 语句:

    SELECT DISTINCT c.CustomerID, s.Name
    FROM Sales.Customer AS c
       JOIN
         Sales.Store AS s
       ON ( c.CustomerID = s.CustomerID)
    WHERE c.TerritoryID = 1
    

有关限定对象的详细信息,请参阅标识符

在 SQL Server 联机丛书中,有许多因为未使用限定名而得到简化的 Transact-SQL 示例。尽管将这些元素放在实例之外可以提高可读性,但还是建议您在生产系统中的 Transact-SQL 语句中使用限定名。

请参阅

其他资源

表达式(Transact-SQL)
SELECT (Transact-SQL)
IDENTITY(属性)(Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助