適用於:SQL Server
Azure SQL Database
Azure SQL 受控實例
Azure Synapse Analytics
Analytics 平台系統 (PDW)
在某些情況下,您可能會想要在將條件套用至整體群組(使用 WHERE 子句)之前,先從群組中排除個別的數據列(使用 HAVING 子句)。
HAVING 子句就像 WHERE 子句,但只適用於整個群組(也就是代表群組的結果集中的數據列),而 WHERE 子句則適用於個別的數據列。 查詢可以同時包含 WHERE 子句和 HAVING 子句。 在此情況下:
WHERE子句會首先應用於 [Diagram] 窗格中的表格或表格值物件中的各個欄。 只有符合WHERE子句中條件的列會被分組。然後,
HAVING子句會套用至結果集中的數據列。 只有符合HAVING條件的群組會出現在查詢輸出中。 您只能將HAVING子句套用至同時出現在GROUP BY子句或聚合函數中的數據行。
在兩個聯結數據表上指定 WHERE 和 HAVING 子句
注意
本文中使用的資料庫是 pubs 資料庫,可從 Northwind 取得,並在 GitHub 上發佈適用於 Microsoft SQL Server 的範例資料庫。
例如,假設您要聯結 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 子句。 若要這樣做,您必須將數據行兩次新增至 [Criteria] 窗格,然後將一個實例指定為 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;