共用方式為


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 ]

[ HAVING search_condition ]

[ WINDOW window_expression ]

[ ORDER BY order_expression [ ASC | DESC ]]

UNIONEXCEPTINTERSECT 運算元可以在查詢之間使用,將結果合併或比較成一個結果集。

Transact-SQL 語法慣例

語法

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 ,每個子句會顯示詳細的語法元素和自變數:

語句中的 SELECT 子句順序相當重要。 您可以省略任何選擇性的子句,但當使用選擇性的子句時,它們必須以適當的順序顯示。

SELECT 只有在這些語句的選取清單包含將值指派給函式局部變數的表達式時,使用者定義函式才允許語句。

OPENDATASOURCE 函式作為伺服器名稱部分建構的四部分名稱,可以做為數據表來源使用,無論數據表名稱出現在語句中 SELECT 的位置。 無法為 Azure SQL 資料庫 指定四部分名稱。

某些語法限制適用於 SELECT 涉及遠端數據表的語句。

SELECT 陳述式的邏輯處理順序

下列步驟顯示語句的 SELECT 邏輯處理順序或系結順序。 此順序會決定在某個步驟中定義的物件提供給後續步驟之子句使用的時間。 例如,如果查詢處理器可以系結至子句中 FROM 定義的數據表或檢視表,這些物件及其數據行就可供所有後續步驟使用。 相反地,因為 SELECT 子句是步驟 8,因此上述子句無法參考該子句中定義的任何數據行別名或衍生數據行。 不過,後續子句可以參考這些子句,例如 ORDER BY 子句。 查詢處理器會決定語句的實際實際執行,而且順序可能會與這份清單不同。

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBEWITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

警告

在前一個序列可能會有所不同的情況下,這種情況並不常見。 假設您在檢視上有叢集索引,而檢視表會排除某些數據表數據列,而檢視的數據 SELECT 行清單會使用 CONVERT 將資料類型從 varchar 變更為 int 的 。在這裡情況下, CONVERT 可以在 子句執行之前 WHERE 執行 。 如果您的情況很重要,通常有一種方式可以修改檢視以避免不同的順序。

權限

選取數據需要 SELECT 數據表或檢視表的許可權,這可以繼承自較高範圍,例如 SELECT 架構的許可權或 CONTROL 數據表的許可權。 或是需要 db_datareaderdb_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指定子句)和數據行的子集。FirstNameLastNameStartDate 第三個資料行標題會重新命名為 FirstDay

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;

這個範例只會傳回具有 EndDate 不是 NULLMaritalStatus 為 之的數據MDimEmployee。已婚。

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;