HOW TO:在相同查詢中使用 HAVING 和 WHERE 子句
更新:2007 年 11 月
在某些情況下,將條件套用到整個群組 (使用 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 子句的一部分。
注意事項: |
---|
根據目前使用的設定與版本,您所看到的對話方塊與功能表命令可能會與 [說明] 中所描述的不同。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
若要在彙總查詢指定 WHERE 條件
為您的查詢指定群組。如需詳細資訊,請參閱 HOW TO:對查詢結果中的資料列進行群組。
如果沒有出現在 [準則] 窗格中,加入您想要組成 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