SELECT 子句 (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 可以是一個數字,也可以是資料列的百分比。SELECT、INSERT、UPDATE 和 DELETE 陳述式可以使用 TOP 子句。TOP 中用來分隔 expression 的括號,在 INSERT、UPDATE 和 DELETE 陳述式中是必要的。支援在 SELECT 陳述式中使用不含括號的 TOP expression 之目的,是為了與舊版相容,但我們不建議您這麼做。如需詳細資訊,請參閱<TOP (Transact-SQL)>。
- < select_list >
要選給結果集的資料行。選取清單是一系列運算式 (以逗號分隔)。選取清單中所能指定的最大運算式數目是 4096。
- *
指定應該傳回 FROM 子句中所有資料表和檢視的所有資料行。依照 FROM 子句所指定,資料表或檢視會傳回這些資料行,且會遵照它們在資料表或檢視中的順序。
- table_ name| view_ name| table_ alias.*
將 * 的範圍限制為指定的資料表或檢視。
- column_ name
這是要傳回的資料行名稱。請限定 column_name 來防止模糊不清的參考,例如,當 FROM 子句中的兩份資料表有名稱重複的資料行時,便是如此。例如,AdventureWorks 資料庫中的 SalesOrderHeader 和 SalesOrderDetail 資料表有名稱為 ModifiedDate 的資料行。如果在查詢中聯結兩份資料表,您可以在選取清單中,將 SalesOrderDetail 項目的修改日期指定為 SalesOrderDetail.ModifiedDate。
- expression
這是一個常數、函數,或由一或多個運算子連接之資料行名稱、常數和函數的任意組合,或子查詢。
$IDENTITY
傳回識別資料行。如需詳細資訊,請參閱<IDENTITY (屬性) (Transact-SQL)>、<ALTER TABLE (Transact-SQL)>和<CREATE TABLE (Transact-SQL)>。如果 FROM 子句中有多份資料表有含 IDENTITY 屬性的資料行,就必須利用特定資料表名稱來限定 $IDENTITY,例如 T1.$IDENTITY。
$ROWGUID
傳回資料列 GUID 資料行。如果 FROM 子句中有多份資料表含有 ROWGUIDCOL 屬性,就必須利用特定資料表名稱來限定 $ROWGUID,例如 T1.$ROWGUID。
udt_column_name
這是要傳回的 Common Language Runtime (CLR) 使用者自訂類型資料行名稱。附註: SQL Server Management Studio 會傳回二進位表示法的使用者自訂類型值。若要傳回字串或 XML 格式的使用者自訂類型值,請使用 CAST 或 CONVERT。
- { . | :: }
指定 CLR 使用者自訂類型的方法、屬性或欄位。如果是執行個體 (非靜態) 方法、屬性或欄位,請使用 .。如果是靜態方法、屬性或欄位,請使用 ::。若要叫用 CLR 使用者自訂類型的方法、屬性或欄位,您必須具有類型的 EXECUTE 權限。
- property_name
這是 udt_column_name 的公用屬性。
- field_name
這是 udt_column_name 的公用資料成員。
method_name
這是 udt_column_name 有一或多個引數的公用方法。method_name 不能是 mutator 方法。下列範例會叫用稱為
Distance
之類型的方法,從Cities
資料表中選取定義為point
類型的Location
資料行值: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 的資料行,可以指定 quantity 或 Quantity to Date 或 Qty 之類的別名。另外,別名也用來指定運算式結果的名稱,例如:
USE AdventureWorks
;GO
SELECT AVG(UnitPrice) AS 'Average Price'
FROM Sales.SalesOrderDetail;
column_alias 可用在 ORDER BY 子句中。不過,它不能用在 WHERE、GROUP BY 或 HAVING 子句中。如果查詢運算式是 DECLARE CURSOR 陳述式的一部分,column_alias 就不能用在 FOR UPDATE 子句中。
備註
SELECT 陳述式中的子句順序很重要。您可以省略任何選擇性的子句,但當使用選擇性的子句時,它們必須以適當的順序顯示。
只有在這些 SELECT 陳述式的選取清單包含指派使用者自訂函數之本機變數值的運算式時,才能在使用者自訂函數中,允許 SELECT 陳述式。
檢視不允許使用 OPTION 子句。
table 變數在它本身的範圍內,可以依照正規資料表的方式來存取,因此,可用來作為 SELECT 陳述式中的資料表來源。
利用 OPENDATASOURCE 函數來建構成伺服器名稱部分的四部分名稱,每當 SELECT 陳述式中出現資料表名稱時,都可用來作為資料表來源。
部分語法限制只適用於牽涉到遠端資料表的 SELECT 陳述式。如需詳細資訊,請參閱<使用分散式查詢的指導方針>。
選取清單所包含之 text 或 ntext 資料行的傳回資料長度會設為下列各項中的最小值:text 資料行的實際大小、預設的 TEXTSIZE 工作階段設定值,或硬式編碼應用程式限制。若要變更工作階段傳回文字的長度,請使用 SET 陳述式。依預設,SELECT 陳述式傳回的文字資料長度限制是 4,000 個位元組。
如果發生下列中的任何行為,SQL Server 2005 Database Engine 會引發 511 例外狀況,且會回復目前在執行中的陳述式:
- SELECT 陳述式產生超出 8,060 位元組的結果資料列或中繼工作資料表資料列。
- DELETE、INSERT 或 UPDATE 陳述式試圖處理超出 8,060 位元組的資料列。
如果 SELECT INTO 或 CREATE VIEW 陳述式所建立的資料行未指定資料行名稱,便會發生錯誤。
選取識別資料行
當您將現有的識別資料行選到新資料表中,除非出現下列情況之一,否則,新資料行會繼承 IDENTITY 屬性:
- SELECT 陳述式包含聯結、GROUP BY 子句或彙總函數。
- 利用 UNION 來聯結多個 SELECT 陳述式。
- 在選取清單中,重複列出識別資料行。
- 識別資料行是運算式的一部分。
如果出現任何一種這些狀況,都會將資料行建立成 NOT NULL,而不是繼承 IDENTITY 屬性。識別資料行的所有規則和限制都適用於新資料表。
舊式外部聯結
舊版 SQL Server 支援在 WHERE 子句中使用 *= 和 =* 運算子之外部聯結的定義。SQL Server 7.0 版支援 SQL-92 標準。這會在 FROM 子句中提供聯結運算子。當資料庫的相容性層級設為 90 時,不支援外部聯結運算子 (*= 和 =*)。
WHERE、GROUP BY 和 HAVING 子句的處理順序
下列步驟顯示含 WHERE 子句、GROUP BY 子句和 HAVING 子句之 SELECT 陳述式的處理順序:
- FROM 子句傳回初始結果集。
- WHERE 子句排除不符合其搜尋條件的資料列。
- GROUP BY 子句將所選的資料列收集到一個群組中,GROUP BY 子句中每個唯一值各一個群組。
- 選取清單中所指定的彙總函數計算每個群組的摘要值。
- HAVING 子句額外排除不符合其搜尋條件的資料列。
權限
需要系統管理員 (sysadmin) 固定伺服器角色、db_owner 和 db_datareader 固定資料庫角色中的成員資格,以及資料表的擁有權。系統管理員 (sysadmin)、db_owner 和 db_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)
其他資源
全文檢索搜尋查詢
聯結基礎觀念
子查詢基本原則
使用變數和參數 (Database Engine)
將識別碼當成物件名稱使用