我感觉好像总是被教导要使用LEFT JOINs,并且我经常看到它们与INNERs 混合使用,以在应该在不同页面上执行相同操作的几段代码中完成相同类型的查询。开始:
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,有没有抓住的机会?
有收获吗?是的-左联接是外联接的一种形式,而内联接是内联接的一种形式。
这是显示差异的示例。我们将从基本数据开始:
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填充。
left join
换句话说,左连接和内部连接不可互换。