mysql - 这应该是 INNER JOIN 还是 LEFT Join?

标签 mysql sql database rdbms

我的目标是选择猫和亚马逊鸟的列表,包括它们的性别、物种(拉丁名)和种族(如果存在),并将猫分组在一起,将亚马逊鸟分组在一起,并在它们的内部具体来说,将种族分组在一起。

我一开始没有找到正确的查询,但后来我看到了解决方案,但不太理解它。

所以这是解决方案:

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 的实际用途是什么?如何知道何时使用哪一个?

该查询是从法国来源复制的。

最佳答案

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

如果所有动物都有种族,那么这根本就不重要。但您的示例似乎并非如此。

对于某些动物来说,Animal.race_id 似乎为空。当这种情况发生时,您是否想通过比赛来展示动物?

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

第二个问题:ORDER BY 与 GROUP BY

这两个是完全不同的:

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

关于mysql - 这应该是 INNER JOIN 还是 LEFT Join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49990355/

相关文章:

mysql - 有没有办法按组更新 MySQL v5.5 表的行号?

mysql - root 用户访问被拒绝,mysql 数据库

php - 如何删除错误 "Trying to get property of non-object"?

sql - Liquibase 是否支持试运行?

mysql - BETWEEN 无法正常工作

类似 SQL 的搜索字符串开头为

database - Node Mongoose,转换为 ObjectId 失败,路径 "N"处的值 "PATH"

php - 如何使用 PHP/MYSQL 在单个查询中执行 SELECT 和 INSERT?

mysql - 是否可以通过单个查询从不同数据库检索数据?

java - 我应该如何使用 2 个线程从数据库中收集数据?