这应该是内部连接还是左连接?

t0ybt7op  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(437)

我的目标是选择猫和亚马逊鸟的名单,以及它们的性别、种类(拉丁名)和种族(如果有的话),并将猫和亚马逊鸟分组在一起,在它们的种类内,将种族分组在一起。
我首先没有找到正确的查询,但后来我看到了解决方案,不太理解它。
所以解决办法是:

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;

因为据我所知:我只需要在有动物的时候选择它
另外,分组方式和排序方式的实际用法是什么?如何知道使用哪一种以及何时使用?
该查询已从法国来源复制。

ev7lccsx

ev7lccsx1#

这与创建数据库和存储数据的方式有关。
如果所有的动物都有种族,那就不重要了。但你的例子似乎不是这样。
对某些动物来说 Animal.race_id 为空。当这种情况发生时,你想给动物看一个空的种族吗?
如果是,请使用 LEFT JOIN :显示所有动物,无论它们是否有种族。
否则,请使用 INNER JOIN :显示所有动物及其种族;如果一只动物没有种族,它就不会出现。
第二个问题:order by vs group by
这两个是完全不同的:
按顺序对返回的行进行排序,以便按特定顺序显示它们。
分组会做一些完全不同的事情。它可能会显示更少的行:每个物种/种族组合只有一行。所以两只猫将显示为一行;也许你不想这样。得到总计和小计是很有用的。

相关问题