having语句和where语句产生关于pokemon数据的不一致结果

moiiocjp  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(427)

这是我的第一个问题。请放轻松!
我在khanacademy做一个sql项目。我的源数据是pokemon数据库的第1-181行(即所有gen1 pokemon),我正在运行一些关于pokemon攻击数据的查询。
跑步 SELECT Type_1, COUNT(*) FROM pokemon WHERE "Attack" > 120 GROUP BY Type_1; ,我一共得到15个口袋妖怪,按9种不同的类型分组,这就是我所期望的。
但是,当我尝试使用having语句来查找至少有一个pokemon受到120次以上攻击的pokemon的类型数时,它只返回4种类型。
代码如下: SELECT Type_1 AS "type" FROM pokemon GROUP BY type_1 HAVING "Attack" > 120; .
举个例子,我的第二个查询中缺少的pokemon是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'); 我不确定我的第二个问题出了什么问题。如果可以请帮忙。

uwopmtnx

uwopmtnx1#

此查询:

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
qco9c6ql

qco9c6ql2#

我试着 HAVING 声明中找到的pokemon的类型数至少有一个pokemon攻击超过120次
如果您想统计有多少类型的pokemon至少有一个pokemon具有120次以上的攻击,那么您可以在现有查询的基础上添加另一个聚合级别,如:

select count(*) no_types
from (select 1 from pokemon where attack > 120 group by type_1) t

注意,子查询使用 select 1 :我们实际上不需要它返回特定的列,我们只需要知道它包含多少行—因此 select 1 ,使意图明确。
或者,我们可以用 count(distinct) ,这样就不需要子查询:

select count(distinct type_1) no_types from pokemon where attack > 120

相关问题