共用方式為


在相同的查詢中使用 HAVING 和 WHERE 子句 (Visual Database Tools)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控實例Azure Synapse AnalyticsAnalytics 平台系統 (PDW)

在某些情況下,您可能會想要在將條件套用至整體群組(使用 HAVING 子句)之前,先從群組中排除個別的數據列(使用 WHERE 子句)。

HAVING 子句就像 WHERE 子句,但只適用於整個群組(也就是代表群組的結果集中的數據列),而 WHERE 子句則適用於個別的數據列。 查詢可以同時包含 WHERE 子句和 HAVING 子句。 在此情況下:

  • WHERE 子句會首先應用於 [Diagram] 窗格中的表格或表格值物件中的各個欄。 只有符合 WHERE 子句中條件的列會被分組。

  • 然後,HAVING 子句會套用至結果集中的數據列。 只有符合 HAVING 條件的群組會出現在查詢輸出中。 您只能將 HAVING 子句套用至同時出現在 GROUP BY 子句或聚合函數中的列。

在兩個聯結數據表上指定 WHERE 和 HAVING 子句

注意

本文中使用的資料庫是 pubs 資料庫,可從 Northwind 取得,並在 GitHub 上發佈適用於 Microsoft SQL Server 的範例資料庫。

例如,假設您要聯結 titlespublishers 數據表,以建立查詢,以顯示一組發行者的平均書籍價格。 您想要只看到一組特定發行者的平均價格,也許只有加州的出版商。 即便如此,只有當平均價格超過10.00美元時,您才會看到平均價格。

您可以藉由包含 WHERE 子句來建立第一個條件,該子句會在計算平均價格之前捨棄任何不在加州的發行者。 第二個條件需要 HAVING 子句,因為條件是以分組和摘要數據的結果為基礎。 產生的 SQL 語句看起來可能像這樣:

SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;

在 SQL Server Management Studio 的 Visual Database Tools 中,您可以在 [Criteria] 窗格中建立 HAVINGWHERE 子句。 根據預設,如果您指定數據行的搜尋條件,條件就會成為 HAVING 子句的一部分。 不過,您可以將條件變更為 WHERE 子句。

您可以建立 WHERE 子句和涉及相同欄位的 HAVING 子句。 若要這樣做,您必須將數據行兩次新增至 [Criteria] 窗格,然後將一個實例指定為 HAVING 子句的一部分,另一個實例做為 WHERE 子句的一部分。

在匯總查詢中指定 WHERE 條件

  1. 指定查詢的群組。 如需詳細資訊,請參閱 查詢結果中的群組資料列 (Visual Database Tools)

  2. 如果 準則 窗格中還沒有,請新增您要用來設定 WHERE 條件的欄位。

  3. 清除 輸出 數據行,除非數據行是 GROUP BY 子句的一部分,或包含在聚合函數中。

  4. 在 [篩選] 欄位中,指定 WHERE 條件。 查詢和檢視表設計工具會將條件新增至 SQL 語句的 HAVING 子句。

    注意

    此程式範例中顯示的查詢會聯結兩個數據表,titlespublishers

    此時,在查詢中,SQL 語句包含 HAVING 子句:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    GROUP BY titles.pub_id
    HAVING publishers.state = 'CA'
    
  5. 群組依據 欄中,從群組和摘要選項清單中選取 Where。 查詢和檢視設計工具會從 SQL 語句中的 HAVING 子句中移除條件,並將其新增至 WHERE 子句。

    SQL 語句的語法將改為包括 WHERE 子句:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id;