我理解内连接但是当涉及外连接时我很困惑。 表1有两行,如下所示:
tbl1:
1
1
表2有两行,如下所示:
tbl2:
1
2
内部联接:2行(据我所知,tbl1
中的2行与tbl2
中的值匹配)
左外连接:它将是3行(全部在tbl1
上并且在两个表之间是通用的)
答案 0 :(得分:1)
以下是使用SQLite的示例:
sqlite> create table tbl1(value int);
sqlite> insert into tbl1 values(1);
sqlite> insert into tbl1 values(1);
sqlite> create table tbl2(value int);
sqlite> insert into tbl2 values(1);
sqlite> insert into tbl2 values(2);
如果tbl2
已加入tbl1
,则会得到两个结果:
sqlite> SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.value = tbl2.value;
1|1
1|1
这是因为tbl1
是“左”表,因此tbl1
中的每一行都会被包含在内,无论它是否与tbl2
匹配。
如果tbl1
与tbl2
保持联系,您将得到三个结果:
sqlite> SELECT * FROM tbl2 LEFT JOIN tbl1 ON tbl1.value = tbl2.value;
1|1
1|1
2|
这是因为:
tbl2
中的每一行都会被包含在内,无论tbl1
tbl2
中的行可能会匹配tbl1
中的多行。在这种情况下,tbl2
有两行匹配tbl1
加一行没有匹配,总共产生三行。
答案 1 :(得分:0)
当LEFT OUTER JOIN右侧的表或结果集具有匹配值时,OUTER和INNER JOIN之间没有区别。这是你的例子中的情况 - 你得到两行
SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number
:
tbl1.number tbl2.number
1 1
1 1
但是使用SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number
得到相同的结果。
区别在LEFT OUTER JOIN的左侧 - 你说我想要tbl1
中的所有行,而不管tbl2
中是否有匹配的行。
因此,如果您使用tbl2
从DELETE FROM tbl2 WHERE number = 1
删除第一行并使用INNER JOIN SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number
运行命令 - 您将得到0条记录,因为{{1}中没有匹配的记录}。
如果你然后运行tbl2
,你会得到:
SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number