適用対象: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句の一部であるか、集計関数に含まれている場合を除いて、出力 列をクリアします。フィルター 列 で、条件
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;