簡體   English   中英

SQL服務器中Group By、Have和Where子句的執行順序?

[英]Execution sequence of Group By, Having and Where clause in SQL Server?

當我們將GROUP BYHAVINGWHERE子句一起使用時,我只是對 SQL 查詢的執行順序感到困惑。 哪個先被執行? 順序是什么?

為了:

FROM & JOIN確定和過濾行
WHERE行上的更多過濾器
GROUP BY將這些行組合成組
HAVING過濾器組
ORDER BY排列剩余的行/組
對剩余的行/組進行LIMIT過濾

這是 sql server 的完整序列:

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

所以從上面的列表中,你可以很容易的理解GROUP BY, HAVING and WHERE的執行順序,即:

1.  WHERE
2.  GROUP BY
3.  HAVING

從 Microsoft 獲取有關它的更多信息

WHERE 是第一個,然后您對查詢的結果進行分組,最后但並非最不重要的 HAVING 子句用於過濾分組結果。 這是“邏輯”順序,我不知道這是如何在引擎中技術實現的。

我認為它是在引擎中實現的,正如 Matthias 所說:WHERE、GROUP BY、HAVING

試圖在網上找到一個列出整個序列的參考(即“SELECT”在底部),但我找不到它。 不久前,Solid Quality Learning 所著的“Inside Microsoft SQL Server 2005”一書中對此進行了詳細介紹

編輯:找到一個鏈接: http : //blogs.x2line.com/al/archive/2007/06/30/3187.aspx

在 Oracle 12c 中,您可以按以下任一順序運行代碼:

Where
Group By
Having

或者

Where 
Having
Group by

想一想如果你想實施你需要做什么:

  • WHERE :它需要執行 JOIN 操作。
  • GROUP BY :您指定 Group by 對連接的結果進行“分組”,然后它必須在 JOIN 操作之后,在 WHERE 用法之后。
  • HAVING :HAVING 用於按照 GROUP BY 表達式進行過濾。 然后,它在 GROUP BY 之后執行。

順序是 WHERE、GROUP BY 和 HAVING。

按以下順序

  1. 來自 & 加入
  2. 在哪里
  3. 通過...分組
  4. 選擇
  5. 訂購者
  6. 限制

這是執行查詢的 SQL 順序,

在此處輸入圖片說明

您可以使用本文中的示例檢查執行順序。

對於您以下幾行的問題可能會有所幫助,並且可以直接從本文中獲得

  1. GROUP BY --> 應用 WHERE 約束后的剩余行然后根據 GROUP BY 子句中指定的列中的公共值進行分組。 作為分組的結果,只有該列中有唯一值的行數。 隱含地,這意味着您應該只在查詢中有聚合函數時才需要使用它。
  1. HAVING --> 如果查詢有 GROUP BY 子句,則 HAVING 子句中的約束將應用於分組行,丟棄不滿足約束的分組行。 與 WHERE 子句一樣,在大多數數據庫中也無法通過此步驟訪問別名。

參考:-

Have Clause 可能出現在 group by 子句之前/之前。

示例: select * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

已選擇 9 行。

從 test_std 中選擇教學、計數( )計數,通過 TEACH具有計數( )> 1 組;

教數


蘭格 2 遺囑 4

  • SELECT
  • 聯接(內、左、右、全外聯接)
  • 在哪里
  • 通過...分組
  • 擁有
  • 訂購方式
  • 限制;

選擇

加入
在哪里
通過...分組

訂購者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM