# CHAPTER 12: HAVING句

`HAVING`句には、選択されるグループが、満たさなくてはならない条件を 指定します。これは`SELECT`コマンドで、最も深くネストしたグループに適用 されます。また検索する各項目が、`GROUP BY`を指定した集計関数か、定数の いずれかでなくてはならない。

`HAVING`句は、ブール演算式で構成されます。ブール演算式とは、真または 偽で評価する式です。 `HAVING`句では、`AND`と`OR`によって、結合されたブール式を 使用できます。

`HAVING`句は、`WHERE`句と似ていますが、`HAVING`句は レコードではなく、グループに基づいて処理されます。よって比較の対象は、レコード のフィールド値ではなく、以下の二つのクラスのいずれかになります。

1. グループを通じて、値が一定であるフィールド。すなわち`GROUP BY`句に 指定されたフィールドです。

2. 集計関数。関数はグループのレコードに適用されます。

Syntax

  `HAVING` | `|(b_expr) |b_expr |b_expr OR b_expr |b_expr AND b_expr |NOT b_expr` | `| | | | |`

  説明

  `b_expr` | `is a boolean expression. Details on the boolean expression is described below.`

注意

1. 2つのブール式を、`AND`で結合した場合に、ブール式全体が真になるには、 2つのブール式とも真でなくては なりません。

2. 2つのブール式を、`OR`で結合した場合に、ブール式全体が真になるのは、 2つのブール式のうち、少なくともどちらか一方が真でなくてはなりません。

3. `HAVING`句のパターンマッチは、`WHERE`句と同一です。 WHERE句を参照してください。

4. `HAVING`句には、以下の形式のブール式を指定できます。

   |  |  | `|gp_expr [ | | |NULL gp_expr` | `|IS |[IS] NOT` | `|] gp_condition |` | `| | | |`

   A `gp_expr` is one of:

   |  |  | `|gp_attr |string |number |gp_function |(gp_expr) |CONVERT gp_expr [TO] data_type |CONVERT gp_expr [TO] GENERIC data_type |gp_expr CONVERT TO data_type |gp_expr CONVERT [TO] GENERIC data_type |gp_expr operator gp_expr |gp_expr operator |built_in_function |user_defined_function` | `| | | | | | | | | | | | |`

   `gp_attr`は、`GROUP BY`句に指定するフィールド名です。 このフィールドを`GROUP BY`句に指定すると各グループにフィールド値が使用 されます。

   `gp_function`は、`GROUP BY`句に指定しないフィールドに対する、 集計関数です。

   演算子に関しては、Expressionsを、関数に関しては、組込み関数を 参照してください。

   `gp_condition`は、

   |  |  | `| | | | |` |
   `| = |!= | > | >= | <` | `| gp_expr | | | |`
   |  |  | `| | | | |`
   |  |  | `| | | | | |` |
   `|LIKE |MATCH |!MATCH |SMATCH | !SMATCH` | `| pattern | | | |`
   |  |  | `| | | | | |`
   |  |  | `|[ |` |
   `| = |!=` | `|] NULL |`
   |  |  | `| |`
   |  |  | `| |` | `BETWEEN gp_expr [` |
   `|EXCLUSIVE |INCLUSIVE` | `|] [AND] |`
   `gp_expr [` | `|EXCLUSIVE|] |INCLUSIVE|`
   | `| |`
   |  |  | `| |` | `RANGE gp_expr [` |
   `|EXCLUSIVE |INCLUSIVE` | `|] [TO] |`
   |  |  | `gp_expr [` | `|EXCLUSIVE|] |INCLUSIVE|`
   | `| |`

   `RANGE TO`の代わりに、`BETWEEN AND`を使用することができます。 グループが条件を満たすには、値が指定の範囲にあり、昇順に指定されている必要が あります。

例

1. `name`フィールド値の、先頭文字が"i"と"o"であるレコードを出力し ます。

          SELECT name, COUNT FROM loans GROUP BY name
             HAVING name match '?[io]*';

   以下を表示します。

          name          COUNT (*)

          Jones         3
          Kilroy        1
          Mosca         2

2. `loans`テーブルに、`name`フィールド値が重複している レコードを表示します。

          SELECT name, COUNT FROM loans GROUP BY name
             HAVING COUNT > 2;

   以下を表示します。

          name          COUNT (*)

          Jones         3
          Wladislaw     3

3. `loans`テーブルの、`amount`フィールドの合計が200を越す、 `name`フィールドの値とカウント数を表示します。

          SELECT name, SUM (amount) FROM loans GROUP BY name
             HAVING SUM (amount) > 200;

   以下を表示します。

          name          SUM (amount)

          Jones         358.95
          Kilroy        250.00
          Mosca         350.00
          Scarlatti     275.00

4. `loans`テーブルの、`amount`フィールドの平均値が、150未満 で合計値が300より大きな、`name`フィールド値と平均値、合計値を表示します。

          SELECT name, AVG (amount), SUM (amount) FROM loans
             GROUP BY name HAVING AVG (amount) < 150 AND
             SUM (amount) > 300;

   以下を表示します。

          name          AVG (amount)     SUM (amount)

          Jones         119.65           358.95