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