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 join
和 left 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 *
(通常:它使查询明确返回数据集的结构,让您有机会别名列)
了解联接,我了解内部联接和左联接的区别,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 join
和 left 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 *
(通常:它使查询明确返回数据集的结构,让您有机会别名列)