HAVING句はクエリで何をするのか
HAVING句はWHEREと似ていますが、GROUP BYによって返されたグループ化されたレコードを操作するものです。
HAVINGはグループの要約レコードに適用され、WHEREは個々のレコードに適用されます。
HAVINGの条件を満たすグループのみが返されます。
HAVINGはGROUP BY句が存在することが必要です。
WHEREとHAVINGの両方を同じクエリで同時に使用することができます。
SQLのHAVING構文
一般的な構文は
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition
ORDER BYを使った一般的な構文は以下の通りです。
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition ORDER BY column-names
Id
FirstName
LastName
City
Country
Phone
となります。
SQL GROUP BYの例
問題です。 各国の顧客数をリストアップする。
顧客数が10人以上の国のみを対象とします。
顧客数が10人以上の国のみを対象とします。
SELECT COUNT(Id), Country FROM Customer GROUP BY CountryHAVING COUNT(Id) > 10
結果。 3件のレコード
カウント | 国 |
---|---|
11 | フランス |
11 | ドイツ |
13 | アメリカ |
Id
FirstName
LastName
City
Country
Phone
問題です。 アメリカを除く各国の顧客数を、
多い順に並べてください。
顧客数が9人以上の国のみを対象とする。
多い順に並べてください。
顧客数が9人以上の国のみを対象とする。
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
結果。 3件のレコード
カウント | 国 |
---|---|
11 | フランスtd |
11 | ドイツ |
9 | ブラジル |
Id
OrderDate
OrderNumber
CustomerId
TotalAmount
Id
FirstName
LastName
City
Country
Phone
div
問題です。 平均注文額が
1000ドルから1200ドルの顧客をすべてリストアップします。
1000ドルから1200ドルの顧客をすべてリストアップします。
SELECT AVG(TotalAmount), FirstName, LastName FROM O JOIN Customer C ON O.CustomerId = C.Id GROUP BY FirstName, LastNameHAVING AVG(TotalAmount) BETWEEN 1000 AND 1200
結果:10件
Average | FirstName | LastName |
---|---|---|
1081.215000 | ミゲル | アンヘル・パオリーノ |
1063.420000 | イサベル | デ・カストロ |
1008.440000 | Alexander | Feuer |
1062.038461 | Thomas | Hardy |
Pirkko | Koskitalo | |
1174.945454 | Janete | Limeira |
1073.621428 | Antonio | Moreno |
1065.385000 | Rita | Müller |
1183.010000 | José | Pedro Freyre |
1057.386666 | Carine | Schmitt |
iv