Menu
CoddyTech

分组(二)

本课属于 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 的所有类别。

如果我们想结合 HAVING 子句和 WHERE 子句,可以这样写:

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

这会先逐条检查记录,筛选出价格大于 25 的所有记录,然后才运行 GROUP BY 子句,并筛选出平均价格大于 40 的所有类别。

challenge icon

挑战

中等

可用的表和列:

  • earthquakes: location, amplitude, period

里氏震级是一种用于测量地震震级的对数刻度。

我们需要返回所有大地震中每个地点的平均震级。

大地震定义如下:

  • 振幅大于或等于 1
  • 波的周期大于或等于 1 分钟

本次挑战将使用一个不同的公式:M = (A/T)^2 / T,它等价于 M = ((A/T)*(A/T)) / T。这里,M 表示震级,A 表示 amplitude 列,T 表示 period 列。

返回每个地点及其平均震级,只包含大地震(将列命名为 avg_magnitude)。结果中只包含 avg_magnitude 大于 1 的地点。

将结果四舍五入到小数点后 2 位。

亲手试试

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: SQL 在线编辑器