SELECT (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲
從資料庫擷取數據列,並從SQL Server 資料庫引擎中的一或多個數據表選取一或多個數據列或數據行。 語句的完整語法 SELECT
很複雜,但主要子句可以摘要如下:
[ WITH { [ XMLNAMESPACES , ] [ common_table_expression ] } ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ ORDER BY order_expression [ ASC | DESC ]]
UNION、EXCEPT 和 INTERSECT 運算元可以在查詢之間使用,將結果合併或比較成一個結果集。
語法
SQL Server 和 Azure SQL Database 的語法:
<SELECT statement> ::=
[ WITH { [ XMLNAMESPACES , ] [ <common_table_expression> [ , ...n ] ] } ]
<query_expression>
[ ORDER BY <order_by_expression> ]
[ <FOR Clause> ]
[ OPTION ( <query_hint> [ , ...n ] ) ]
<query_expression> ::=
{ <query_specification> | ( <query_expression> ) }
[ { UNION [ ALL ] | EXCEPT | INTERSECT }
<query_specification> | ( <query_expression> ) [ ...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
<select_list>
[ INTO new_table ]
[ FROM { <table_source> } [ , ...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING <search_condition> ]
[ ; ]
Azure Synapse Analytics 和平行處理數據倉儲和Microsoft網狀架構的語法:
[ WITH <common_table_expression> [ , ...n ] ]
SELECT <select_criteria>
[ ; ]
<select_criteria> ::=
[ TOP ( top_expression ) ]
[ ALL | DISTINCT ]
{ * | column_name | expression } [ , ...n ]
[ FROM { table_source } [ , ...n ] ]
[ WHERE <search_condition> ]
[ GROUP BY <group_by_clause> ]
[ HAVING <search_condition> ]
[ ORDER BY <order_by_expression> ]
[ OPTION ( <query_option> [ , ...n ] ) ]
備註
由於語句的複雜性 SELECT
,每個子句會顯示詳細的語法元素和自變數:
- WITH XMLNAMESPACES
- HAVING
- WITH common_table_expression
- UNION
- SELECT 子句
- EXCEPT 和 INTERSECT
- INTO 子句
- ORDER BY
- FROM
- FOR 子句
- WHERE
- OPTION 子句
- GROUP BY
語句中的 SELECT
子句順序相當重要。 您可以省略任何選擇性的子句,但當使用選擇性的子句時,它們必須以適當的順序顯示。
SELECT
只有在這些語句的選取清單包含將值指派給函式局部變數的表達式時,使用者定義函式才允許語句。
以 OPENDATASOURCE
函式作為伺服器名稱部分建構的四部分名稱,可以做為數據表來源使用,無論數據表名稱出現在語句中 SELECT
的位置。 無法為 Azure SQL 資料庫 指定四部分名稱。
某些語法限制適用於 SELECT
涉及遠端數據表的語句。
SELECT 陳述式的邏輯處理順序
下列步驟顯示語句的 SELECT
邏輯處理順序或系結順序。 此順序會決定在某個步驟中定義的物件提供給後續步驟之子句使用的時間。 例如,如果查詢處理器可以系結至子句中 FROM
定義的數據表或檢視表,這些物件及其數據行就可供所有後續步驟使用。 相反地,因為 SELECT
子句是步驟 8,因此上述子句無法參考該子句中定義的任何數據行別名或衍生數據行。 不過,後續子句可以參考這些子句,例如 ORDER BY
子句。 查詢處理器會決定語句的實際實際執行,而且順序可能會與這份清單不同。
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
或WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
警告
在前一個序列可能會有所不同的情況下,這種情況並不常見。 假設您在檢視上有叢集索引,而檢視表會排除某些數據表數據列,而檢視的數據 SELECT
行清單會使用 CONVERT
將資料類型從 varchar 變更為 int 的 。在這裡情況下, CONVERT
可以在 子句執行之前 WHERE
執行 。 如果您的情況很重要,通常有一種方式可以修改檢視以避免不同的順序。
權限
選取數據需要 SELECT
數據表或檢視表的許可權,這可以繼承自較高範圍,例如 SELECT
架構的許可權或 CONTROL
數據表的許可權。 或是需要 db_datareader 或 db_owner 固定資料庫角色中的成員資格,或 sysadmin 固定伺服器角色中的成員資格。 使用 SELECT INTO
建立新的數據表也需要 CREATE TABLE
許可權,以及 ALTER SCHEMA
擁有新數據表之架構的許可權。
範例
下列範例使用 AdventureWorksPDW2022 資料庫。
A. 使用 SELECT 擷取資料列和資料行
本節將示範三個程式碼範例。 第一個程式代碼範例會從DimEmployee
數據表傳回所有數據列(未WHERE
指定子句)和所有數據行(使用 *
)。
SELECT *
FROM DimEmployee
ORDER BY LastName;
這個接下來的範例會使用資料表別名來達到相同的結果。
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
這個範例會從 DimEmployee
AdventureWorksPDW2022 資料庫中的數據表傳回所有數據列(未WHERE
指定子句)和數據行的子集。FirstName
LastName
StartDate
第三個資料行標題會重新命名為 FirstDay
。
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
這個範例只會傳回具有 EndDate
不是 NULL
且 MaritalStatus
為 之的數據M
列DimEmployee
。已婚。
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
AND MaritalStatus = 'M'
ORDER BY LastName;
B. 使用 SELECT 與資料行標題及計算
下列範例會從 DimEmployee
資料表中傳回所有資料列,並根據每位員工的 BaseRate
和 40 小時工作週來計算其總薪資。
SELECT FirstName,
LastName,
BaseRate,
BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;
C. 使用 DISTINCT 與 SELECT
下列範例會使用 DISTINCT
來產生 DimEmployee
資料表中所有唯一職稱的清單。
SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;
D. 使用 GROUP BY
下列範例會尋找每天的所有銷售總額。
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
由於 GROUP BY
子句的緣故,因此只會針對每天,傳回一個包含所有銷售總和的資料列。
E. 使用 GROUP BY 與多個群組
下列範例會尋找每天網際網路銷售的平均價格和總和,並依照訂單日期和促銷索引鍵分組。
SELECT OrderDateKey,
PromotionKey,
AVG(SalesAmount) AS AvgSales,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;
F. 使用 GROUP BY 與 WHERE
下列範例會在只擷取訂單日期晚於 2002 年 8 月 1 日的資料列之後,將結果分組。
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. 使用 GROUP BY 與運算式
下列範例會依運算式來分組。 如果表達式不包含聚合函數,您可以依表示式分組。
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. 使用 GROUP BY 與 ORDER BY
下列範例會尋找每天的銷售總和,然後依照日期排序。
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
I. 使用 HAVING 子句
此查詢會使用 HAVING
子句來限制結果。
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;