CHAPTER 12: HAVING句


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

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

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