共用方式為


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 會在內部將檢視參考解析成構成檢視之基底資料表的參考。
  • 連結資料表。SQL Server 可以存取 OLE DB 資料來源的某些資料表。這可稱為分散式查詢。OLE DB 資料來源可透過連結成連結的伺服器,或是在 OPENROWSET 或 OPENQUERY 函數中參考資料來源的方式從 SQL Server 存取。

FROM 子句也可以包含聯結規格。這些將可定義 SQL Server 在資料表之間瀏覽時要使用的特定路徑。

DELETE 與 UPDATE 陳述式也可以使用 FROM 子句來定義要修改的資料表。

WHERE search_conditions

WHERE 子句為篩選條件 (Filter),定義了在 SELECT 時位於來源資料表的每個資料列必須符合的條件。只有符合條件的資料列才會提供資料給結果集。與條件不符的資料列的資料便不使用。

DELETE 與 UPDATE 陳述式也可以使用 WHERE 子句來定義目標資料表中要修改的資料列。

GROUP BY group_by_list

GROUP BY 子句依照 group_by_list 中的資料行值,將結果集分割成群組。例如,AdventureWorksSales.SalesOrderHeader 資料表在 TerritoryID 中有十個值。GROUP BY TerritoryID 子句將結果集分割成 10 個群組,每個 TerritoryID 的值都有一個群組。

HAVING search_conditions

HAVING 子句為套用於結果集的額外篩選條件。在邏輯上,HAVING 子句將從套用 SELECT 陳述式的 FROM、WHERE 或 GROUP BY 子句所建立的中繼結果集,篩選出資料列。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。若要解決模稜兩可,並指定 Schema1 擁有 TableX,至少請以結構描述名稱來限定資料表名稱:

    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 協助