LEFT JOIN返回与左表相同的行数吗?

时间:2019-07-11 08:30:28

标签: sql

SELECT * 
FROM t1
LEFT JOIN t2 ON t1.fk = t2.id;

它将总是返回与t1相同的行计数吗?

4 个答案:

答案 0 :(得分:2)

左联接的契约规定,如果没有WHERE子句可能会从结果集中删除记录,则出现在联接左侧的所有记录将至少出现一次。考虑以下数据集:

t1
id | fk
1  | 1
2  | 2

t2
id | value
1  | 1
1  | 2

您的查询将返回此结果集:

id | fk | id   | value
1  | 1  | 1    | 1
1  | 1  | 1    | 2
2  | 2  | NULL | NULL

请注意,第一个表的fk = 2与第二个表没有任何匹配。该记录仍显示在结果集中,但来自第二个表的所有列均为NULL。另外,请注意,fk = 1记录出现两次,因为第一张表中的单个记录与第二张表中的记录匹配两次。

答案 1 :(得分:2)

如果t2.id具有唯一约束,则行数将始终与没有联接的行数相同。如果不是唯一的,则将获得同一t1行的多个重复项,每个重复项都有其自己的对应的t2行。对于您来说是否足够好取决于您的数据库设计。

答案 2 :(得分:1)

不一定:

CREATE TABLE t1(id int, fk int);
INSERT INTO t1 VALUES (1,1);

CREATE TABLE t2(id int, value int);
INSERT INTO t2 VALUES(1,1),(1,2);


SELECT * 
FROM t1
LEFT JOIN t2 ON t1.fk = t2.id;

返回2行:

id  fk  id  value

1   1   1   1

1   1   1   2

答案 3 :(得分:1)

  

它将总是返回与t1相同的行计数吗?

否。

LEFT JOIN是一个联接,因此将一个表的一行与另一表的多行匹配。结果集可能具有相同的行数或更多的行。