適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
場合によっては、グループ全体に条件を適用する (WHERE
句を使用する) 前に、グループから (HAVING
句を使用して) 個々の行を除外したい場合があります。
HAVING
句は WHERE
句に似ていますが、グループ全体 (つまり、グループを表す結果セット内の行) にのみ適用されますが、WHERE
句は個々の行に適用されます。 クエリには、WHERE
句と HAVING
句の両方を含めることができます。 その場合:
WHERE
句は、ダイアグラム ペインのテーブルまたはテーブル値オブジェクトの個々の行に最初に適用されます。WHERE
句の条件を満たす行のみがグループ化されます。その後、
HAVING
句が結果セット内の行に適用されます。 クエリ出力には、HAVING
条件を満たすグループのみが表示されます。HAVING
句は、GROUP BY 句または集計関数にも表示される列にのみ適用できます。
2 つの結合テーブルに WHERE 句と HAVING 句を指定する
手記
この記事で使用するデータベースは pubs
データベースであり、GitHub の Microsoft SQL Server 用の Northwind および pubs サンプル データベース から入手できます。
たとえば、titles
テーブルと publishers
テーブルを結合して、一連のパブリッシャーの平均書籍価格を示すクエリを作成するとします。 特定の発行元のセット (おそらくカリフォルニア州の発行元のみ) の平均価格を表示する必要があります。 その場合でも、10.00 ドルを超える場合にのみ、平均価格を表示する必要があります。
最初の条件を設定するには、平均価格を計算する前に、カリフォルニア州に所在しない発行元を除外する WHERE
句を含めます。 2 番目の条件では、データのグループ化と集計の結果に基づいているため、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
句を作成できます。 そのためには、抽出条件 ペインに列を 2 回追加し、HAVING
句の一部として 1 つのインスタンスを指定し、もう一方のインスタンスを WHERE
句の一部として指定する必要があります。
集計クエリで WHERE 条件を指定する
クエリのグループを指定します。 詳細については、「クエリ結果 (Visual Database Tools) での行のグループ化の」を参照してください。
抽出条件 ペインにまだ表示されていない場合は、
WHERE
条件の基にする列を追加します。データ列が GROUP BY 句の一部であるか、集計関数に含まれていない場合は、Output 列をクリアします。
フィルター 列 で、条件
WHERE
を指定します。 クエリおよびビュー デザイナーは、SQL ステートメントのHAVING
句に条件を追加します。手記
このプロシージャの例に示すクエリは、
titles
とpublishers
の 2 つのテーブルを結合します。クエリのこの時点で、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'
[グループ化] 列で、グループと概要のオプションの一覧から [場所] を選択します。 クエリおよびビュー デザイナーは、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;