inner join 和 left join,当它们有反向语句时,这两个语句如何工作?

inner join and left join, how do these 2 statements work when they have inverted statements?

了解联接,我了解内部联接和左联接的区别,returns 行,当两个 table 都匹配时,左联接 returns左边的所有行 table,即使右边没有匹配项 table。我明白了。

然而在这个例子中我跟着一起,他们如何让我感到困惑:

select * from person join car on person.car_id = car.car_id;

给我数据库中每个人的 car_id 值不为空。

select * from person left join car on car.car_id = person.car_id;

给我数据库中的每个人,不管那些 car_id 值为空的人;

我不明白的是为什么这两个语句是相同的(除了左连接)但是这两个值是相反的:

内部联接:car on person.car_id = car.car_id;

左连接:car on car.car_id = person.car_id;

有人可以清楚地解释为什么这些语句在内连接和左连接中交换吗?

您确实了解 inner joinleft join 之间的区别,所以问题实际上是关于相等运算中操作数的顺序。相等是一种交换运算:操作数的顺序无关紧要:您可以反转操作数而不会对结果产生任何影响。

也就是说,这两个条件是绝对等价的:

person.car_id = car.car_id
car.car_id = person.car_id

不相关的旁注:using 语法在被连接的列使用相同名称时缩短了连接条件(并消除了结果集中列名的歧义)。所以:

select * 
from person 
left join car using(car_id)

其他不相关的良好做法:

  • table 别名使查询更易于编写和阅读

  • 枚举 select 子句中的列优于 select *(通常:它使查询明确返回数据集的结构,让您有机会别名列)