一尘不染

何时使用LEFT JOIN和何时使用INNER JOIN?

mysql

我感觉好像总是被教导要使用LEFT JOINs,并且我经常看到它们与INNERs
混合使用,以在应该在不同页面上执行相同操作的几段代码中完成相同类型的查询。开始:

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,有没有抓住的机会?


阅读 970

收藏
2020-05-17

共1个答案

一尘不染

有收获吗?是的-左联接是外联接的一种形式,而内联接是内联接的一种形式。

这是显示差异的示例。我们将从基本数据开始:

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的行由左联接查询保留。其余的列用NULL填充。

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

2020-05-17