我的目标是选择猫和亚马逊鸟的名单,以及它们的性别、种类(拉丁名)和种族(如果有的话),并将猫和亚马逊鸟分组在一起,在它们的种类内,将种族分组在一起。
我首先没有找到正确的查询,但后来我看到了解决方案,不太理解它。
所以解决办法是:
SELECT Animal.nom as nom_animal, Animal.sexe, Espece.nom_latin as espece, Race.nom as race
FROM Animal
INNER JOIN Specie
ON Animal.specie_id = Specie.id
LEFT JOIN Race
ON Animal.race_id = Race.id
WHERE Specie.nom_courant IN ('Amazon birds', 'Cat')
ORDER BY Specie.nom_latin, Race.nom;
为什么不能这样:
FROM Animal
INNER JOIN Specie
ON Animal.specie_id = Specie.id
INNER JOIN JOIN Race
ON Animal.race_id = Race.id
WHERE Specie.nom_courant IN ('Amazon birds', 'Cat')
GROUP BY Specie.nom_latin, Race.nom;
因为据我所知:我只需要在有动物的时候选择它
另外,分组方式和排序方式的实际用法是什么?如何知道使用哪一种以及何时使用?
该查询已从法国来源复制。
1条答案
按热度按时间ev7lccsx1#
这与创建数据库和存储数据的方式有关。
如果所有的动物都有种族,那就不重要了。但你的例子似乎不是这样。
对某些动物来说
Animal.race_id
为空。当这种情况发生时,你想给动物看一个空的种族吗?如果是,请使用
LEFT JOIN
:显示所有动物,无论它们是否有种族。否则,请使用
INNER JOIN
:显示所有动物及其种族;如果一只动物没有种族,它就不会出现。第二个问题:order by vs group by
这两个是完全不同的:
按顺序对返回的行进行排序,以便按特定顺序显示它们。
分组会做一些完全不同的事情。它可能会显示更少的行:每个物种/种族组合只有一行。所以两只猫将显示为一行;也许你不想这样。得到总计和小计是很有用的。