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

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

在某些情況下,將條件套用到整個群組 (使用 HAVING 子句) 之前,不妨先排除群組中的個別資料列 (使用 WHERE 子句)。

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

  • WHERE 子句會先套用到 [圖表] 窗格內資料表或資料表值物件的個別資料列。 只有符合 WHERE 子句內條件的資料列才會被分組。

  • HAVING 子句於是會套用到結果集內的資料列。 只有符合 HAVING 條件的群組才會出現在查詢輸出。 您只能將 HAVING 子句套用到也出現在 GROUP BY 子句或彙總函式的資料行。

在兩份聯結的資料表指定 WHERE 和 HAVING 子句

例如,想像您將 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,在 [準則] 窗格可同時建立 HAVINGWHERE 子句。 依照預設,如果為資料行指定搜尋條件,條件會成為 HAVING 子句的一部分。 然而,您可以將條件變更為 WHERE 子句。

您可以建立需要相同資料行的 WHERE 子句和 HAVING 子句。 若要建立,您必須在 [準則] 窗格新增資料行兩次,然後指定一個準則做為 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;