在某些情況下,您可能會想要在將條件套用至整體群組(使用 HAVING 子句)之前,先從群組中排除個別的數據列(使用 WHERE 子句)。
HAVING 子句就像 WHERE 子句,但只適用於整體群組(也就是代表群組的結果集中的數據列),而 WHERE 子句則適用於個別的數據列。 查詢可以同時包含 WHERE 子句和 HAVING 子句。 在此情況下:
WHERE 子句會先套用至 [圖表] 窗格中數據表或數據表值物件中的個別數據列。 只有符合 WHERE 子句條件的數據列會分組。
然後,HAVING 子句會套用至結果集中的數據列。 只有符合 HAVING 條件的群組才會出現在查詢輸出中。 您只能將 HAVING 子句套用至同時出現在 GROUP BY 子句或聚合函數中的數據行。
例如,假設您要聯結 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
您可以在 [條件] 窗格中建立 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
另請參閱
排序和群組查詢結果 (Visual Database Tools)
摘要查詢結果 (Visual Database Tools)