Menu
Coddy logo textTech

Grouping Part 2

CoddyのSQLジャーニー「基礎」セクションの一部 — レッスン 37/72。

WHERE キーワードは、各レコードに対して個別に条件を実行します。例えば:

SELECT * FROM table1
WHERE col1 > col2

col1 > col2 はすべてのレコードで実行され、それが満たされているかをチェックします。

しかし、集計結果をフィルタリングしたい場合はどうでしょうか? たとえば:

SELECT category, AVG(price) FROM table1
WHERE AVG(price) > 40
GROUP BY category

これは動作しません なぜなら WHERE は集計をチェックできないからです。そのために、HAVING キーワードがあります。それは集計条件でデータをフィルタリングします。

SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40

これにより、平均価格が 40 を超えるすべてのカテゴリをフィルタリングします。

HAVINGWHERE 句を組み合わせたい場合、以下のように記述します:

SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40

これはまずレコードごとに処理し、価格が 25 より大きいすべてのレコードをフィルタリングしてから、GROUP BY 句を実行し、平均価格が 40 より大きいすべてのカテゴリをフィルタリングします。

challenge icon

チャレンジ

中級

利用可能なテーブルと列:

  • <strong>earthquakes</strong>: <strong>location</strong>, <strong>amplitude</strong>, <strong>period</strong>

リヒター・スケールは、地震のマグニチュードを測定するために使用される対数スケールです。

すべての主要地震の各場所の平均マグニチュードを返します。

主要地震は次のように定義されます:

  • 振幅が 1 以上
  • 波の周期が 1 分以上

このチャレンジでは、異なる式を使用します:M = (A/T)<sup>2</sup> / T。これはM = ((A/T)*(A/T)) / Tと同等です。

主要地震のみを含めて、各場所の場所と平均マグニチュードを返します(列名をavg_magnitudeとします)。結果にはavg_magnitudeが 1 より大きい場所のみを含めます。

結果を小数点以下 2 桁に丸めます。

チートシート

WHERE キーワードは個々のレコードをフィルタリングし、HAVING はグループ化後の集計結果をフィルタリングします:

SELECT category, AVG(price) FROM table1
GROUP BY category
HAVING AVG(price) > 40

両方の句を組み合わせるには:

SELECT category, AVG(price) FROM table1
WHERE price > 25
GROUP BY category
HAVING AVG(price) > 40

WHERE が最初にレコードをフィルタリングし、次に GROUP BY が残りのデータをグループ化し、最後に HAVING がグループ化された結果をフィルタリングします。

自分で試してみよう

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン