这是我的第一个问题。请放轻松!
我正在执行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');
我不确定第二个查询出了什么问题。如果可以的话请帮忙。
此查询:
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
我尝试
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