我想知道如何区分所有这些不同的连接......
简单示例:假设您有一张Students表和一张Lockers表。在 SQL 中,您在连接中指定的第一个表Students, 是LEFT表,第二个表Lockers, 是RIGHT表。
Students
Lockers
每个学生都可以分配到一个储物柜,因此表格LockerNumber中有一个列Student。一个储物柜可能有多个学生,但尤其是在学年开始时,您可能会有一些没有储物柜的新生和一些没有分配学生的储物柜。
LockerNumber
Student
为了这个例子,假设你有100 个学生,其中 70 个有储物柜。您总共有50 个储物柜,其中 40 个储物柜至少有 1 个学生,10 个储物柜没有学生。
INNER JOIN相当于“告诉我所有有储物柜的学生”。 任何没有储物柜的学生,或任何没有学生的储物柜都丢失了。 返回 70 行
INNER JOIN
LEFT OUTER JOIN将是“向我展示所有学生,如果他们有相应的储物柜的话”。 这可能是一个普通的学生名单,或者可以用来识别没有储物柜的学生。 返回 100 行
LEFT OUTER JOIN
RIGHT OUTER JOIN将是“向我展示所有储物柜,以及分配给它们的学生(如果有的话)”。 这可用于识别没有分配学生的储物柜,或有太多学生的储物柜。 返回 80 行(40 个储物柜中的 70 个学生的列表,加上没有学生的 10 个储物柜)
RIGHT OUTER JOIN
FULL OUTER JOIN会很愚蠢,可能没有多大用处。 类似“显示所有学生和所有储物柜,并在可以匹配的地方匹配它们” 返回 110 行(所有 100 名学生,包括没有储物柜的学生。加上没有学生的 10 个储物柜)
FULL OUTER JOIN
CROSS JOIN在这种情况下也相当愚蠢。 它不使用lockernumber学生表中的链接字段,因此您基本上最终会得到一个巨大的列表,其中包含每个可能的学生到储物柜配对,无论它是否真的存在。 返回 5000 行(100 个学生 x 50 个储物柜)。可能有用(通过过滤)作为将新学生与空储物柜匹配的起点。
CROSS JOIN
lockernumber