在相同的查詢中使用 HAVING 和 WHERE 子句 (Visual Database Tools)
適用於:SQL Server
Azure SQL Database
Azure SQL 受控實例
Azure Synapse Analytics
Analytics 平台系統 (PDW)
在某些情況下,您可能會想要在將條件套用至整體群組(使用 HAVING
子句)之前,先從群組中排除個別的數據列(使用 WHERE
子句)。
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 中,您可以在 [Criteria] 窗格中建立 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;