我觉得我总是被教导使用LEFT JOIN
,我经常看到它们与INNER
混合在一起,以完成相同类型的查询,这些代码应该用于同样的代码不同页面上的东西。这是:
SELECT ac.reac, pt.pt_name, soc.soc_name, pt.pt_soc_code
FROM
AECounts ac
INNER JOIN 1_low_level_term llt on ac.reac = llt.llt_name
LEFT JOIN 1_pref_term pt ON llt.pt_code = pt.pt_code
LEFT JOIN 1_soc_term soc ON pt.pt_soc_code = soc.soc_code
LIMIT 100,10000
那是我正在做的一个:
我看到很多:
SELECT COUNT(DISTINCT p.`case`) as count
FROM FDA_CaseReports cr
INNER JOIN ae_indi i ON i.isr = cr.isr
LEFT JOIN ae_case_profile p ON cr.isr = p.isr
这看起来像LEFT也可能是INNER有没有捕获?
答案 0 :(得分:98)
有没有捕获?是的 - 左连接是外连接的一种形式,而内连接是一种形式的内连接。
以下是显示差异的示例。我们将从基础数据开始:
mysql> select * from j1;
+----+------------+
| id | thing |
+----+------------+
| 1 | hi |
| 2 | hello |
| 3 | guten tag |
| 4 | ciao |
| 5 | buongiorno |
+----+------------+
mysql> select * from j2;
+----+-----------+
| id | thing |
+----+-----------+
| 1 | bye |
| 3 | tschau |
| 4 | au revoir |
| 6 | so long |
| 7 | tschuessi |
+----+-----------+
在这里,我们将看到内部联接和左联接之间的区别:
mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing | id | thing |
+----+-----------+----+-----------+
| 1 | hi | 1 | bye |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
+----+-----------+----+-----------+
嗯,3排。
mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing | id | thing |
+----+------------+------+-----------+
| 1 | hi | 1 | bye |
| 2 | hello | NULL | NULL |
| 3 | guten tag | 3 | tschau |
| 4 | ciao | 4 | au revoir |
| 5 | buongiorno | NULL | NULL |
+----+------------+------+-----------+
哇,5排!发生了什么事?
left join
等外连接会保留不匹配的行 - 因此左连接查询会保留id为2和5的行。其余列用NULL填充。
换句话说,左连接和内连接不可互换。
答案 1 :(得分:12)
这是一个粗略的答案,这就是我对连接的看法。由于前面提到的数学问题,希望这比非常精确的答案更有帮助......; - )
内部联接缩小了行集返回。外连接(左侧或右侧)不会更改返回的行数,但如果可能,只需“拾取”其他列。
在第一个示例中,结果将是AECounts
中与1_low_level_term
表指定的条件匹配的行。然后,对于这些行,尝试加入1_pref_term
和1_soc_term
。但是如果没有匹配,则行保持不变,并且连接的列为空。
答案 2 :(得分:5)
INNER JOIN只返回两个表中匹配值的行,而LEFT JOIN将返回LEFT表中的所有行,即使RIGHT表中没有匹配的行
一个简单的例子
TableA
ID Value
1 TableA.Value1
2 TableA.Value2
3 TableA.Value3
TableB
ID Value
2 TableB.ValueB
3 TableB.ValueC
INNER JOIN产生:
SELECT a.ID,a.Value,b.ID,b.Value
FROM TableA a INNER JOIN TableB b ON b.ID = a.ID
a.ID a.Value b.ID b.Value
2 TableA.Value2 2 TableB.ValueB
3 TableA.Value3 3 TableB.ValueC
LEFT JOIN产生:
SELECT a.ID,a.Value,b.ID,b.Value
FROM TableA a LEFT JOIN TableB b ON b.ID = a.ID
a.ID a.Value b.ID b.Value
1 TableA.Value1 NULL NULL
2 TableA.Value2 2 TableB.ValueB
3 TableA.Value3 3 TableB.ValueC
如您所见,LEFT JOIN包含TableA中ID = 1的行,即使TableB中没有匹配的行ID = 1,而INNER JOIN特别排除了行,因为TableB中没有匹配的行
HTH
答案 3 :(得分:1)
如果只希望两个表中显示的结果与Join条件匹配,请使用内部联接。
如果需要表A中的所有结果,请使用左连接,但如果表B具有与表A的某些记录相关的数据,那么您还希望在同一查询中使用该数据。
如果您想要两个表中的所有结果,请使用完整联接。
答案 4 :(得分:0)
对于新手来说,因为它对我的帮助很大:INNER JOIN始终是LEFT或RIGHT JOIN的子集,而所有这些始终都是FULL JOIN的子集。它帮助我理解了基本思想。