1 つ以上の制限条件を指定する SELECT 節です。
Synopsis
SELECT fields
FROM table
HAVING condition-expression
SELECT aggregatefunc(field %AFTERHAVING)
FROM table
WHERE condition-expression
HAVING 節は、データ・セット全体ではなく、グループに対して処理を実行できる
WHERE 節に似ています。そのため、ほとんどの場合、
HAVING 節は、%AFTERHAVING キーワードと共に使用するか、
GROUP BY 節と組み合わせて使用されます。詳細は、"
WHERE" 節を参照してください。
HAVING 節は、サブ母集団の集約と、全体の母集団の集約とを頻繁に比較します。
%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 比較述語
| 述語 |
処理 |
| = |
等しい |
| <> |
等しくない |
| > |
より大きい |
| < |
より小さい |
| >= |
以上 |
| <= |
以下 |
以下の例は、比較述語を使用しています。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 つ目の値の後に照合される場合、値は別の値よりも大きくなります。例えば、文字列値に対する既定照合は大文字と小文字を区別しません。以下はその例です。
これは、「以上」と「以下」の組み合わせと同じ働きをします。以下の例は、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 ワイルドカード文字
| 文字 |
以下と一致 |
| _ |
単独の文字 |
| % |
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%'
LIKE ESCAPE は、LIKE 述語のエスケープ文字として任意の 1 文字の定義をサポートします。このエスケープ文字は、直後の文字をワイルドカードやフォーマッティング文字ではなくリテラル文字として解釈するよう指示します。以下の例では、LIKE ESCAPE を使用して '%_' の値を返しています。
SELECT * FROM MyTable
HAVING symbol_field LIKE '#%#_' ESCAPE '#'
定義されていない値を見つけます。すべての 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 には 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 項目を持ちます。
サブクエリが空のセットを評価するか否かをテストするために、サブクエリを使用して処理します。
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 で給与が平均以上である従業員の給与の平均を検索します。