这应该是INNER JOIN还是LEFT Join?

时间:2018-04-23 21:37:29

标签: mysql sql database rdbms

我的目标是选择猫和亚马逊鸟的名单,包括他们的性别,他们的speecie(拉丁名字)和他们的种族(如果存在)并将猫组合在一起,将亚马逊鸟组合在一起,并在他们的内部speecie,聚集在一起。

我首先没有得到正确的查询,但后来我看到了解决方案并且不太了解它。

所以这是解决方案:

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;

因为据我所知:我只需要选择动物

GROUP BY和ORDER BY的实际用途是什么以及如何知道使用哪一个以及何时使用?

该查询已从法语来源复制。

1 个答案:

答案 0 :(得分:1)

它与创建数据库和存储数据的方式有关。

如果所有动物都有种族那么根本没关系。但似乎并非你的例子。

对于某些动物来说,似乎Animal.race_id为空。当发生这种情况时,你想用种族来展示动物吗?

  • 如果是这样,请使用LEFT JOIN:显示所有动物,无论它们是否有种族。
  • 否则,使用INNER JOIN:显示所有种族的动物;如果动物没有种族,则不会显示。

第二个问题:ORDER BY与GROUP BY

这两者完全不同:

  • ORDER BY对返回的行进行排序,以便按特定顺序显示。
  • GROUP BY会做一些完全不同的事情。它将显示可能更少的行:每个物种/种族组合仅一行。所以两只猫会被显示为一排;可能你不想要这个。获得总计和小计很有用。