首页 > 解决方案 > 有 Statement 和 Where 语句对 Pokemon 数据产生不一致的结果

问题描述

这是我的第一个问题。请放轻松!

我正在KhanAcademy 做一个 SQL 项目。我的源数据是这个pokemon 数据库的第 1-181 行(即所有 gen 1 pokemon),我正在运行一些关于 pokemon 攻击统计的查询。

运行SELECT Type_1, COUNT(*) FROM pokemon WHERE "Attack" > 120 GROUP BY Type_1;,我得到了 15 个按 9 种不同类型分组的 Pokemon,这是我所期望的。

但是,当我尝试使用 HAVING 语句查找具有至少一个攻击力超过 120 的口袋妖怪的口袋妖怪类型数量时,它只返回 4 种类型。

这是代码:SELECT Type_1 AS "type" FROM pokemon GROUP BY type_1 HAVING "Attack" > 120;

举个例子,我的第二个查询中缺少的一个口袋妖怪是 Machamp:INSERT INTO pokemon(Number,Name,Type_1,Type_2,Total,HP,Attack,Defense,Sp_Atk,Sp_Def,Speed,Generation,Legendary) VALUES (68,'Machamp','Fighting',NULL,505,90,130,80,65,85,55,1,'False');

我不确定我的第二个查询出了什么问题。如果可以的话请帮忙。

标签: sqlgroup-bywhere-clausehaving

解决方案


这个查询:

SELECT Type_1 AS "type"
FROM pokemon
GROUP BY type_1
HAVING "Attack" > 120;

不是有效的 SQL,应该返回错误。为什么?因为HAVING发生在之后GROUP BY。并且Attack没有定义。它需要在一个激活函数中,例如:

HAVING MAX(Attack) > 120

此版本的查询在逻辑上等价于:

SELECT p.type
FROM (SELECT Type_1 AS "type", MAX(Attack) as max_attack
      FROM pokemon
      GROUP BY type_1
     ) p
WHERE max_Attack > 120

推荐阅读