SELECT (Transact-SQL)

適用範圍: 是SQL Server (所有支援的版本) 是Azure SQL Database 是Azure SQL 受控執行個體 是Azure Synapse Analytics 是平行處理資料倉儲

從資料庫中擷取資料列,並可讓您從 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 ]

[ ORDER BY order_expression [ ASC | DESC ]]

您可在查詢之間使用 UNIONEXCEPT 及 INTERSECT 運算子來將其結果結合成單一結果集或加以比較。

主題連結圖示 Transact-SQL 語法慣例

語法

-- Syntax for SQL Server and 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 > ]   
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ 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 ] ) ]  
  

注意

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

備註

由於 SELECT 陳述式十分複雜,因此將會依子句顯示詳細的語法元素及引數:

子句順序對 SELECT 陳述式而言十分重要。 您可以省略任何選擇性的子句,但當使用選擇性的子句時,它們必須以適當的順序顯示。

只有在這些 SELECT 陳述式的選取清單包含指派使用者自訂函數之本機變數值的運算式時,才能在使用者自訂函數中,允許 SELECT 陳述式。

利用 OPENDATASOURCE 函數來建構成伺服器名稱部分的四部分名稱,每當 SELECT 陳述式中出現資料表名稱時,都可用來做為資料表來源。 針對 Azure SQL Database,不可指定四部分名稱。

部分語法限制只適用於牽涉到遠端資料表的 SELECT 陳述式。

SELECT 陳述式的邏輯處理順序

下列步驟顯示 SELECT 陳述式的邏輯處理順序或繫結順序。 此順序會決定在某個步驟中定義的物件提供給後續步驟之子句使用的時間。 例如,如果查詢處理器可繫結至 (存取) FROM 子句中定義的資料表或檢視表,這些物件及其資料行就會提供給所有後續步驟使用。 反之,因為 SELECT 子句是步驟 8,所以前面的子句無法參考該子句中定義的任何資料行別名或衍生資料行。 不過,ORDER BY 子句等後續子句都可以參考它們。 陳述式的實際執行方式由查詢處理器決定,其順序可能與此清單不同。

  1. FROM
  2. 開啟
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE 或 WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. 排序依據
  11. 頂端

警告

通常會按照上述順序。 不過,在一些不常見的情況下,順序可能會有不同。

例如,假設您在檢視表上有叢集索引,而該檢視表排除某些資料表資料列,且檢視表的 SELECT 資料行清單使用 CONVERT 將資料類型從 varchar 變更為 integer。 在此情況下,CONVERT 的執行順序可能會在 WHERE 子句之前。 這確實是不常見的情況。 如果在您的案例中順序相當重要,通常可以修改您的檢視表來避免順序不同。

權限

選取資料需要資料表或檢視的 SELECT 權限;此權限可從較高的範圍繼承而來,例如結構描述的 SELECT 權限或資料表的 CONTROL 權限。 或是需要 db_datareaderdb_owner 固定資料庫角色中的成員資格,或 sysadmin 固定伺服器角色中的成員資格。 使用 SELECTINTO 來建立新資料表也需要 CREATE TABLE 權限,以及擁有新資料表結構描述上的 ALTERSCHEMA 權限。

範例:

下列範例使用 AdventureWorksPDW2012 資料庫。

A. 使用 SELECT 擷取資料列和資料行

本節將示範三個程式碼範例。 第一個程式碼範例會從 DimEmployee 資料表中,傳回所有資料列 (未指定 WHERE 子句) 和所有資料行 (使用 *)。

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

這個接下來的範例會使用資料表別名來達到相同的結果。

SELECT e.*  
FROM DimEmployee AS e  
ORDER BY LastName;  

此範例會從 AdventureWorksPDW2012 資料庫的 DimEmployee 資料表中,傳回所有資料列 (未指定 WHERE 子句),以及資料行子集 (FirstNameLastNameStartDate)。 第三個資料行標題會重新命名為 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;  

另請參閱

SELECT 範例 (Transact-SQL)
提示 (Transact-SQL)