你的问题已经得到解答,但从你的评论中我了解到你是否完全理解这个问题还存在一定的不确定性。因此,我想再添加一个答案来帮助你 :-)
让我们从简单的开始。
FROM a, b
这是一种过时的连接语法,已被标准SQL-1992中的显式连接所取代。在上述语法中,如果有连接条件,必须将其放在WHERE子句中。如果在WHERE子句中没有连接条件,则为交叉连接,现在应该明确地写成
FROM a CROSS JOIN b
这说明你有意想要得到所有a和b的组合(而不仅仅是忘记了连接条件或错误地删除了它)。一个例子是:
FROM store CROSS JOIN product
在这里,你将每个商店与每种产品结合在一起,无论该商店是否真的拥有该产品;你只需显示所有可能的组合。两个商店和两种产品的情况下,结果可能如下所示:
store product
s1 p1
s1 p2
s2 p1
s2 p2
CROSS JOIN 很少需要使用。在上述情况下,我们可能希望知道所有商店的产品/组合,并为每行选择一个'yes'或'no',以便我们看到商店有哪些产品,哪些没有。
在关系型数据库中,通常涉及表之间的关系,因此让我们添加连接条件:
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
假设表格包含:
年份 部门编号 总成本
2015 d001 20000
2016 d001 25000
2016 d002 10000
和
年份 部门编号 总利润
2015 d001 40000
2015 d002 30000
2016 d001 50000
那么结果将是:
年份 部门编号 总成本 总利润
2015 d001 20000 40000
2016 d001 25000 50000
因为只有在两个表中都找到了2015/d001和d001/2016。
如果你想要看到其他数据,你必须使用外连接。您可以将dept_gain与dept_cost进行外连接,以查看所有成本 - 以及它们的收益(如果有)。反之亦然,您可以将dept_cost与dept_gain进行外连接,以查看所有收益 - 以及它们的成本(如果有)。或者,您可以使用完全外连接,以查看所有数据:
FROM dept_cost
FULL OUTER JOIN dept_gain ON dept_gain.dept_no = dept_cost.dept_no
AND dept_gain.year = dept.cost.year
年份 部门编号 总花费 总收益
2015 d001 20000 40000
2015 d002 30000
2016 d001 25000 50000
2016 d002 10000
交叉连接(CROSS JOIN)和全外连接(FULL OUTER JOIN)很少使用,所以如果您还不理解它们,不要担心。通常只需要内连接(INNER JOIN),有时需要左外连接(LEFT OUTER JOIN)。