首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

T-SQL SELECT 語句執行順序完解:為何別名不能用在 HAVING

     編輯:關於SqlServer

邏輯執行順序 (非物理執行順序)

理解邏輯順序是撰寫正確查詢、排除語法錯誤的關鍵。以下為標準 SQL/TSQL 邏輯處理階段:

  1. FROM:確定資料來源,執行 JOIN、APPLY 等
  2. ON:JOIN 條件過濾 (僅外部聯結有效)
  3. OUTER:外部聯結補回未符合 ON 條件的資料列
  4. WHERE:列級過濾,移除不符合條件的資料列
  5. GROUP BY:分組彙總
  6. CUBE / ROLLUP:產生超級彙總行
  7. HAVING:群組級過濾,僅保留符合條件的群組
  8. SELECT:投影輸出欄位,**此處才產生別名**
  9. DISTINCT:移除重複列
  10. ORDER BY:排序,**可使用 SELECT 定義的別名**
  11. TOP / OFFSET-FETCH:限制輸出筆數

經典誤區:別名在 HAVING 中無效

-- 錯誤:HAVING 階段尚未產生別名 TotalAmt
SELECT CustomerID, SUM(Amount) AS TotalAmt
FROM Orders
GROUP BY CustomerID
HAVING TotalAmt > 10000;  -- Msg 207, Invalid column name 'TotalAmt'

-- 正確:重複運算式或使用子查詢/CTE
SELECT CustomerID, SUM(Amount) AS TotalAmt
FROM Orders
GROUP BY CustomerID
HAVING SUM(Amount) > 10000;

-- 或使用 CTE
WITH cte AS (
    SELECT CustomerID, SUM(Amount) AS TotalAmt
    FROM Orders
    GROUP BY CustomerID
)
SELECT * FROM cte WHERE TotalAmt > 10000;

為何 ORDER BY 可以用別名?

ORDER BY 執行於 SELECT 之後,此時結果集已包含別名欄位,故可直接引用。

實務提示

  • WHERE 不能使用彙總函數 (尚未 GROUP BY),HAVING 可以
  • GROUP BY 欄位必須出現在 SELECT 清單或彙總函數中
  • 優化器可能調整物理執行順序,但邏輯語意必須遵循上述順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved