您的问题已得到解答,但从您的客户那里我了解到您是否完全理解了问题仍然没有安全感。所以,我想我只是添加另一个答案:-)
让我们从简单的开始
FROM a, b
这是一种过时的连接语法,在标准 SQL-1992 中已被显式连接所取代。使用上述方法,您必须将连接条件(如果有)放在 WHERE 子句中。如果 WHERE 子句中没有连接条件,这是一个交叉连接,您现在可以明确写为
FROM a CROSS JOIN b
这告诉读者您有意地想要 a 和 b 的所有组合(并且不仅忘记了连接条件或错误地删除了它)。一个例子是
FROM store CROSS JOIN product
在这里,您将每个商店与每种产品结合起来,无论商店是否真的有产品;您只需显示所有可能的组合。如果有两家商店和两种产品,结果可能如下所示:
商店产品
s1 p1
s1 p2
s2 p1
s2 p2
很少需要交叉连接。在上述情况下,我们可能想知道所有商店的产品/组合,并为每一行选择“是”或“否”,这样我们就可以看到哪些产品是商店的特色,哪些不是。
然而,在关系数据库中,我们通常处理表的关系,所以让我们添加连接条件:
FROM a, b
WHERE a.col1 = b.col2
这是一个内部连接,我们只寻找记录匹配。现在写成
FROM a
INNER JOIN b ON a.col1 = b.col2
或(省略可选关键字INNER,因为默认情况下连接是内连接):
FROM a
JOIN b ON a.col1 = b.col2
这是一个例子。我们有两个表格,分别包含每个部门和年度的费用和收入。
FROM dept_cost
JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no AND dept_gain.year = dept.cost.year
假设表格包含:
年份 dept_no total_cost
2015 d001 20000
2016 d001 25000
2016 d002 10000
和
年份 dept_no total_gain
2015 d001 40000
2015 d002 30000
2016 d001 50000
那么结果是:
年份 dept_no total_cost total_gain
2015 d001 20000 40000
2016 d001 25000 50000
因为在两个表中只能找到 2015/d001 和 d001/2016。
如果您也想查看其他数据,则必须外连接。您可以将 dept_gain 外部连接到 dept_cost,以便查看所有成本 - 以及它们的收益(如果有)。或者,反之亦然,您将 dept_cost 外连接到 dept_gain,以便查看 所有 收益 - 以及它们的成本(如果有)。或者你full outer join,以便查看所有数据:
FROM dept_cost
FULL OUTER JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no
AND dept_gain.year = dept.cost.year
年份 dept_no total_cost total_gain
2015 d001 20000 40000
2015 d002 30000
2016 d001 25000 50000
2016 d002 10000
很少需要 CROSS JOIN 和 FULL OUTER JOIN。因此,如果您还不了解它们,请不要担心。您通常只需要 INNER JOIN,有时只需要 LEFT OUTER JOIN。