具有关于宠物小精灵数据的陈述和Where陈述产生不一致的结果

问题描述 投票:0回答:2

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

我正在执行SQL project in KhanAcademy。我的源数据是此pokemon database的第1-181行(也就是所有第1代神奇宝贝),我正在运行一些有关神奇宝贝攻击统计信息的查询。

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

但是,当我尝试用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');

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

sql group-by where-clause having
2个回答
0
投票

此查询:

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

0
投票

我尝试HAVING语句查找至少一个攻击力超过120的口袋妖怪的类型的数量

[如果要计算至少一种宠物小精灵受到超过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
© www.soinside.com 2019 - 2024. All rights reserved.