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 语句中的子句必须以适当顺序指定。
对数据库对象的每个引用都不得引起歧义。下列情况可能导致多义性:
在一个系统中可能有多个对象具有相同的名称。例如,Schema1 和 Schema2 可能都含有一个名为 TableX 的表。若要解决多义性问题并指定 TableX 为 User1 所有,至少应使用架构名称来限定表名称:
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)