1 つ以上の制限条件を指定する SELECT 節です。
Synopsis
SELECT fields
FROM table
HAVING condition-expression

SELECT aggregatefunc(field %AFTERHAVING)
FROM table
WHERE condition-expression
引数
condition-expression 検索するデータにパラメータを指定する修飾子。
概要
オプションの HAVING 節は、FROM 節とオプションの WHERE 節および GROUP BY 節の後、オプションの ORDER BY 節の前に記述されます。
SELECT 文の HAVING 節は、クエリで選択された特定の行の適格/不適格を決めます。適格な行とは、condition-expression が真である行です。condition-expression は、AND、OR、および NOT 演算子によってリンク可能な論理テスト (述語) のリストです。
HAVING 節は、データ・セット全体ではなく、グループに対して処理を実行できる WHERE 節に似ています。そのため、ほとんどの場合、HAVING 節は、%AFTERHAVING キーワードと共に使用するか、GROUP BY 節と組み合わせて使用されます。詳細は、"WHERE" 節を参照してください。
HAVING 節は、サブ母集団の集約と、全体の母集団の集約とを頻繁に比較します。
%AFTERHAVING
%AFTERHAVING キーワードは集約関数と共に使用して、HAVING 条件の適用後に、集約演算を実行することを指定します。
SELECT Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40
 ORDER BY Age
SELECT DISTINCT Age,AVG(Age) AS AvgAge,
 AVG(Age %AFTERHAVING) AS AvgMiddleAge
 FROM Sample.Person
 HAVING Age > 40
 ORDER BY Age
SELECT DISTINCT Age,LIST(Age) AS AllAges,
 LIST(Age %AFTERHAVING) AS AllOlder
 FROM Sample.Person
 HAVING Age > 55
 ORDER BY Age
論理述語
SQL の述語は以下のカテゴリーに分類されます。
比較述語
以下は、使用できる比較述語です。
SQL 比較述語
述語 処理
= 等しい
<> 等しくない
> より大きい
< より小さい
>= 以上
<= 以下
以下の例は、比較述語を使用しています。21 より小さい Age ごとに 1 つのレコードが返されます。
SELECT Name, Age FROM Sample.Person
GROUP BY Age
HAVING Age < 21
ORDER BY Age
Caché の %STARTSWITH 拡張子も利用できるので、部分的一致も実行できます。以下の例は、%STARTSWITH を使用します。2 で始まる Age ごとに 1 つのレコードが返されます。
SELECT Name, Age FROM Sample.Person
GROUP BY Age
HAVING Age %STARTSWITH '2'
ORDER BY Age
SQL は照合 (値がソートされる順番) という点から比較演算子を定義します。まったく同様の方法で照合する場合の 2 つの値は等しくなります。2 つ目の値の後に照合される場合、値は別の値よりも大きくなります。例えば、文字列値に対する既定照合は大文字と小文字を区別しません。以下はその例です。
'AAA' = 'AAA'
'AAA' = 'aaa'
'AAA' = 'Aaa'
'BBB' > 'aaa'
BETWEEN 述語
これは、「以上」と「以下」の組み合わせと同じ働きをします。以下の例は、BETWEEN 述語を使用しています。18 と 35 を含む、18 から 35 までの Age ごとに 1 つのレコードが返されます。
SELECT Name, Age FROM Sample.Person
GROUP BY Age
HAVING Age BETWEEN 18 AND 35
ORDER BY Age
LIKE 述語
これにより、以下のワイルドカード文字を使用してパターン・マッチングを実行できます。
LIKE ワイルドカード文字
文字 以下と一致
“_” 単独の文字
“%” 0 かそれ以上の文字のシーケンス
以下はその例です。
SELECT Name, Address FROM Sample.Vendor
GROUP BY Name
HAVING Name LIKE '%Com%'
文字列 'Com' を含む企業名ごとに 1 つのレコードが返されます。
LIKE 比較演算子は、大文字と小文字を区別します。上記の例で 'com' のような文字列を受け入れるには、%SQLUPPER を使用します。
SELECT Name, Address FROM Sample.Vendor
GROUP BY Name
HAVING %SQLUPPER(Name) LIKE '%COM%'
Note:
LIKE は照合を使用しません
LIKE ESCAPE は、LIKE 述語のエスケープ文字として任意の 1 文字の定義をサポートします。このエスケープ文字は、直後の文字をワイルドカードやフォーマッティング文字ではなくリテラル文字として解釈するよう指示します。以下の例では、LIKE ESCAPE を使用して '%_' の値を返しています。
SELECT * FROM MyTable
HAVING symbol_field LIKE '#%#_' ESCAPE '#'
NULL 述語
定義されていない値を見つけます。すべての NULL 値またはすべての非 NULL 値を検出できます。
SELECT Name, FavoriteColors FROM Sample.Person
HAVING FavoriteColors IS NULL 
SELECT Name, FavoriteColors FROM Sample.Person
HAVING FavoriteColors IS NOT NULL 
ORDER BY FavoriteColors
GROUP BY 節を使用すると、指定されたフィールドの非 NULL 値ごとに 1 つのレコードを取り出すことができます。
SELECT Name, FavoriteColors FROM Sample.Person
GROUP BY FavoriteColors
HAVING FavoriteColors IS NOT NULL 
ORDER BY FavoriteColors
IN 述語
IN には 2 つの形式があります。1 つ目は、OR 演算子で複数の等値比較を結合する省略表現として使用します。以下はその例です。
SELECT Name, Home_State FROM Sample.Person
GROUP BY Home_State
HAVING Home_State IN ('ME','NH','VT','MA','RI','CT')
以上の文は、state が括弧のリスト内の値と等しい場合、真と評価します。リストの要素は定数または式です。等式テストと同様に、照合が IN 比較に適用されます。
IN 述語の等値比較に日付または時刻を使用すると、適切なデータ型変換が自動的に実行されます。HAVING 節フィールドが TimeStamp 型の場合、Date 型または Time 型の値は Timestamp に変換されます。HAVING 節フィールドが Date 型の場合、TimeStamp 型または String 型の値は Date に変換されます。HAVING 節フィールドが Time 型の場合、TimeStamp 型または String 型の値は Time に変換されます。
以下の 2 つの例は、同じ等値比較を実行し、同じデータを返します。GROUP BY フィールドは、成功した等値比較ごとに 1 つのレコードのみを返すことを指定しています。DOB フィールドは Date データ型です。
SELECT Name,DOB FROM Sample.Person 
GROUP BY DOB
HAVING DOB IN ({d '1951-02-02'},{d '1987-02-28'})
SELECT Name,DOB FROM Sample.Person
GROUP BY DOB
HAVING DOB IN ({ts '1951-02-02 02:37:00'},{ts '1987-02-28 16:58:10'})
詳細は、"日付/時刻文" を参照してください。
サブクエリで IN を使用し、列の値 (あるいは他の式) がサブクエリの行の値と等しいかどうかをテストできます。以下はその例です。
SELECT Name,Home_State FROM Sample.Person
HAVING Name IN 
 (SELECT Name FROM Sample.Employee
 HAVING Salary < 50000)
サブクエリは、SELECT リスト内に必ず 1 項目を持ちます。
EXISTS 述語
サブクエリが空のセットを評価するか否かをテストするために、サブクエリを使用して処理します。
SELECT t1.disease FROM illness_tab t1 WHERE EXISTS 
 (SELECT t2.disease FROM disease_registry t2 
 WHERE t1.disease = t2.disease 
 HAVING COUNT(t2.disease) > 100) 
SELECT Name,Salary,AVG(Salary) AS AvgPay,
 AVG(Salary %AFTERHAVING) AS AvgTopPay
 FROM Sample.Employee
 WHERE Home_City = 'Boston' 
 HAVING Salary > AVG(Salary)
このクエリは、Boston の全従業員の名前や平均給与と、同じく Boston で給与が平均以上である従業員の給与の平均を検索します。
関連項目