Mysql 何时使用左联接,何时使用内联接?

Mysql 何时使用左联接,何时使用内联接?,mysql,join,Mysql,Join,我觉得我总是被教导使用LEFT JOINs,我经常看到它们与internals混合在一起,在不同页面上执行相同操作的几段代码中完成相同类型的查询。下面是: 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

我觉得我总是被教导使用
LEFT JOIN
s,我经常看到它们与
internal
s混合在一起,在不同页面上执行相同操作的几段代码中完成相同类型的查询。下面是:

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

这似乎左侧也可以是内部的。是否有捕获?

内部联接只返回两个表中都有匹配值的行,而左侧联接将返回左侧表中的所有行,即使右侧表中没有匹配行

一个简单的例子

TableA
ID   Value
1    TableA.Value1
2    TableA.Value2
3    TableA.Value3

TableB
ID   Value
2    TableB.ValueB
3    TableB.ValueC
内部联接产生:

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
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
左联接产生:

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
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
如您所见,尽管在ID=1的TableB中没有匹配的行,但左侧联接包括TableA中ID=1的行,而内部联接排除了该行,因为TableB中没有匹配的行


有什么收获吗?是的,有左连接是外连接的一种形式,而内连接是内连接的一种形式

下面的例子说明了不同之处。我们将从基本数据开始:

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 |
+----+-----------+----+-----------+
嗯,三排

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      |
+----+------------+------+-----------+
哇,五排!发生了什么事

外部联接(如
left join
会保留不匹配的行——因此id为2和5的行将由left join查询保留。其余列用NULL填充


换句话说,左连接和内连接是不可互换的。

这里有一个粗略的答案,这就是我对连接的看法。由于前面提到的数学问题,希望这比一个非常精确的答案更有帮助…;-)

内部联接缩小了行返回集的范围。外部联接(左或右)不会更改返回的行数,只要在可能的情况下“拾取”其他列即可


在第一个示例中,结果将是
AECounts
中与
1_low_level_term
表中指定的条件相匹配的行。然后,对于这些行,它尝试连接到
1\u pref\u term
1\u soc\u term
。但是,如果没有匹配项,则保留行,并且连接的列为空

如果只希望两个表中显示的结果与联接条件匹配,请使用内部联接

当需要表a中的所有结果时,请使用左联接,但如果表B中有与表a的某些记录相关的数据,则还需要在同一查询中使用该数据


当您需要两个表的所有结果时,请使用完全联接。

对于新手来说,因为这在我还是一个新手时对我很有帮助:内部联接始终是左联接或右联接的子集,所有这些始终是完全联接的子集。它帮助我理解了基本的想法。

谢谢你的代码清理,michael刚刚又回到那一点,非常感谢。May应该补充一点,如果使用非唯一键连接,则外部连接可以添加行,但是…“外部连接(如左连接)保留不匹配的行”每个学校的每个数据库课程都需要单独使用此注释。我一直在寻找的最佳答案。谢谢你,越简单越好!你能用一些代码片段或参考来支持你的答案吗?现在听起来有点太笼统了。。