我想知道如何区分所有这些不同的连接...
#1楼
内连接:仅显示行,何时从两个表中获取数据。
外连接(左/右):显示从与配对行(S)的左/右表中的所有结果,如果它存在与否。
#2楼
只有4种:
内连接:最常见的类型。 为连接条件匹配的每对输入行生成输出行。左外连接:与内连接相同,只是如果有任何行可以找到右边表中没有匹配的行,则输出一行包含左边表中的值,其中包含NULL
右边表格中的每个值。 这意味着左侧表格中的每一行在输出中至少出现一次。右外连接:与左外连接相同,除了表的角色颠倒。全外连接:左外连接和右外连接的组合。 两个表中的每一行都将至少出现一次输出。
“交叉连接”或“笛卡尔连接”只是一个内部连接,没有指定连接条件,导致输出所有行对。
感谢RusselH指出FULL join,我省略了。
#3楼
LEFT JOIN
和RIGHT JOIN
是OUTER JOIN
的类型。
INNER JOIN
是默认值 - 两个表中的行必须与连接条件匹配。
#4楼
在Wikipedia上查看Join(SQL)
内连接 - 给定两个表,内连接返回两个表中存在的所有行
left / right(outer)join - 给定两个表返回连接的左表或右表中存在的所有行,当join子句匹配时将返回另一侧的行,否则将返回null那些专栏
Full Outer - 给定两个表返回所有行,并且当左列或右列不存在时将返回空值
交叉连接 - 笛卡尔连接,如果不小心使用可能会很危险
#5楼
简单示例:假设您有一个Students
表和一个Lockers
表。 在SQL中,你的加盟,指定的第一个表Students
,在左表,第二个,Lockers
,是右表。
每个学生都可以分配到一个储物柜,因此Student
表中有一个LockerNumber
列。 不止一个学生可能会在一个储物柜中,但特别是在学年开始时,你可能有一些没有储物柜的入学学生和一些没有学生分配的储物柜。
为了这个例子,假设您有100名学生,其中70名有储物柜。 您共有50个储物柜,其中40个至少有1个学生,10个储物柜没有学生。
INNER JOIN相当于“给我所有带储物柜的学生”。
没有储物柜的学生或没有学生的任何储物柜都不见了。
返回70行
LEFT OUTER JOIN将“向我展示所有学生,如果他们有一个相应的储物柜”。
这可能是一般学生列表,或者可用于识别没有储物柜的学生。
返回100行
RIGHT OUTER JOIN将“向我展示所有储物柜,如果有任何储物柜,则分配给他们”。
这可用于识别没有学生分配的储物柜,或者有太多学生的储物柜。
返回80行(40个储物柜中的70名学生名单,以及没有学生的10个储物柜)
FULL OUTER JOIN会很傻,可能用处不大。
像“向我展示所有学生和所有储物柜,并在可能的地方匹配他们”之类的东西
返回110行(所有100名学生,包括那些没有储物柜的学生。加上没有学生的10个储物柜)
在这种情况下,CROSS JOIN也相当愚蠢。
它不使用学生表中的链接lockernumber
字段,因此您基本上会得到一个巨大的列表,其中包含每个可能的学生到锁定器配对,无论它是否确实存在。
返回5000行(100名学生x 50个储物柜)。 可能有用(带过滤)作为一个起点,以匹配新学生与空储物柜。
#6楼
让它更明显可能会有所帮助。 一个例子:
表格1:
ID_STUDENT STUDENT_NAME
1Raony2Diogo3Eduardo4Luiz
表2:
ID_STUDENT LOCKER
3l14l25l3
我做的是:
-Inner join of Table 1 and Table 2: - Inner join returns both tables merged only when the key (ID_STUDENT) exists in both tablesID_STUDENT STUDENT_NAMELOCKER 3Eduardol14Luiz l2-Left join of Table 1 and Table 2:- Left join merges both tables with all records form table 1, in other words, there might be non-populated fields from table 2ID_ESTUDANTE NOME_ESTUDANTELOCKER 1Raony -2Diogo -3Eduardol14Luiz l2-Right join of table 1 and table 2:- Right join merges both tables with all records from table 2, in other words, there might be non-populated fields from table 1ID_STUDENT STUDENT_NAMELOCKER 3Eduardol14Luiz l25-l3-Outter join of table 1 and table 2:- Returns all records from both tables, in other words, theremight be non-populated fields either from table 1 or 2.ID_STUDENT STUDENT_NAMELOCKER 1Raony -2Diogo -3Eduardol14Luiz l25-l3
#7楼
有三种基本类型的连接:
INNER
连接比较两个表,仅返回匹配存在的结果。 第一个表中的记录在第二个表中匹配多个结果时会重复。 INNER连接倾向于使结果集更小,但由于记录可以重复,因此无法保证。CROSS
join比较两个表并返回两个表中每个可能的行组合。 您可以从这种可能甚至没有意义的联接中获得大量结果,因此请谨慎使用。OUTER
join比较两个表并在匹配可用时返回数据,否则返回NULL值。 与INNER join一样,当它匹配另一个表中的多个记录时,这将复制一个表中的行。 OUTER连接倾向于使结果集更大,因为它们本身不会从集合中删除任何记录。 您还必须限定OUTER连接以确定添加NULL值的时间和位置:LEFT
表示保留第1个表中的所有记录,无论如何,当第2个表不匹配时插入NULL值。RIGHT
意味着相反:无论如何都保留第二个表中的所有记录,并在第一个表不匹配时插入NULL值。FULL
表示保留两个表中的所有记录,如果没有匹配则在任一表中插入NULL值。
通常您会看到语法中省略了OUTER
关键字。 相反,它只是“LEFT JOIN”,“RIGHT JOIN”或“FULL JOIN”。 这样做是因为INNER和CROSS连接对于LEFT,RIGHT或FULL没有任何意义,因此这些连接本身足以明确指示OUTER连接。
以下是您可能希望使用每种类型的示例:
INNER
:您想要从“Invoice”表中返回所有记录,以及相应的“InvoiceLines”。 这假定每个有效的发票至少有一行。OUTER
:您希望返回特定发票的所有“InvoiceLines”记录及其对应的“InventoryItem”记录。 这是一个也销售服务的企业,因此并非所有InvoiceLines都有IventoryItem。CROSS
:你有一个包含10行的数字表,每行包含值'0'到'9'。 您希望创建要加入的日期范围表,以便最终在该范围内的每一天都有一条记录。 通过CROSS将该表与其自身重复连接,您可以根据需要创建任意数量的连续整数(假设从10到1次幂开始,每个连接将1加到指数中)。 然后使用DATEADD()函数将这些值添加到范围的基准日期。
#8楼
首先你必须了解加入做什么? 我们连接多个表并从连接表中获取特定结果。 最简单的方法是交叉连接。
让我们说tableA有两列A和B.而tableB有三列C和D.如果我们应用交叉连接它会产生很多无意义的行。 然后我们必须使用主键匹配来获取实际数据。
左:它将返回左表中的所有记录和右表中的匹配记录。
右:它将返回与左连接相反的方向。 它将返回右表中的所有记录和左表中的匹配记录。
内心:这就像十字路口。 它只返回两个表中匹配的记录。
外面:这就像工会一样。 它将返回两个表中的所有可用记录。
有时我们不需要所有数据,而且我们只需要通用数据或记录。 我们可以使用这些连接方法轻松获取它。 记住左右连接也是外连接。
您只需使用交叉连接即可获取所有记录。 但是,涉及数百万条记录时,它可能会很昂贵。 因此,通过使用左,右,内或外连接使其变得简单。
谢谢
#9楼
SQL JOINS的区别:
很容易记住:
INNER JOIN
仅显示两个表INNER JOIN
记录。
OUTER JOIN
将两个表的所有内容合并在一起,无论它们是否匹配。
LEFT JOIN
与LEFT OUTER JOIN
相同 - (从第一个(最左侧)表中选择具有匹配的右表记录的记录。)
RIGHT JOIN
与RIGHT OUTER JOIN
相同 - (从第二个(最右侧)表中选择具有匹配左表记录的记录。)