在相同的查詢使用 HAVING 和 WHERE 子句 (Visual Database Tools)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
在某些情況下,將條件套用到整個群組 (使用 HAVING
子句) 之前,不妨先排除群組中的個別資料列 (使用 WHERE
子句)。
HAVING
子句類似 WHERE
子句,但是只適用於整個群組 (也就是在結果集代表群組的資料列),而 WHERE
子句則適用於個別資料列。 查詢可同時包含 WHERE
子句和 HAVING
子句。 在此情況下:
WHERE
子句會先套用到 [圖表] 窗格內資料表或資料表值物件的個別資料列。 只有符合WHERE
子句內條件的資料列才會被分組。HAVING
子句於是會套用到結果集內的資料列。 只有符合HAVING
條件的群組才會出現在查詢輸出。 您只能將HAVING
子句套用到也出現在 GROUP BY 子句或彙總函式的資料行。
在兩份聯結的資料表指定 WHERE 和 HAVING 子句
注意
本文使用的資料庫是 pubs
資料庫 (從 Northwind 即可取得),以及 GitHub 上適用於 Microsoft SQL Server 的 pubs 範例資料庫。
例如,想像您將 titles
和 publishers
資料表加以聯結,建立能顯示不同出版商平均書價的查詢。 您只想看到某一群特定出版商的平均價格,也許是加州的出版商。 即便如此,唯有超過 $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,在 [準則] 窗格可同時建立 HAVING
和 WHERE
子句。 依照預設,如果為資料行指定搜尋條件,條件會成為 HAVING
子句的一部分。 然而,您可以將條件變更為 WHERE
子句。
您可以建立需要相同資料行的 WHERE
子句和 HAVING
子句。 若要建立,您必須在 [準則] 窗格新增資料行兩次,然後指定一個準則做為 HAVING
子句的一部分,另外一個準則做為 WHERE
子句的一部分。
在彙總查詢指定 WHERE 條件
為您的查詢指定群組。 如需詳細資訊,請參閱 群組查詢結果中的資料列 (Visual Database Tools)。
如果 [準則] 窗格中沒有您要做為
WHERE
條件基礎的資料行,請新增。除非資料的資料行是 GROUP BY 子句的一部分,或包含在彙總函式中,否則清除 [輸出] 資料行。
在 [篩選條件] 資料行指定
WHERE
條件。 [查詢和檢視設計師] 會將條件加入到 SQL 陳述式的HAVING
子句。注意
在這個程序中所顯示的查詢範例聯結了兩個資料表,
titles
和publishers
。查詢此時的 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'
在 [群組依據] 資料行中,從群組和摘要選項清單中選擇 [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;