SQL自然连接,vs连接,vs其中

时间:2014-05-08 13:32:47

标签: sql postgresql

例如,我有以下表格:

pilot(eID, pID)

plane(pID, make, model, range)

(eID表示员工ID,pID表示planeID)

我想得到空中客车制造的所有飞机的飞行员的eID和飞行员飞行的飞机模型。似乎有多种方法可以解决这个问题,我不确定应该使用哪种方法:

使用自然联接:

SELECT pilot.eID, plane.model FROM pilot NATURAL JOIN plane WHERE plane.make = 'Airbus'

使用交叉联接:(或将pilot, plane替换为pilot CROSS JOIN plane的等效内容)

SELECT pilot.eID, plane.model FROM pilot, plane WHERE pilot.pID = plane.pID AND plane.make = 'Airbus'

使用theta join:

SELECT pilot.eID, plane.model FROM pilot join plane ON pilot.pID = plane.pID WHERE plane.make = 'Airbus'

(据我所知,您可以使用USING (pID)代替on pilot.pID = plane.pID进行theta连接,它会删除重复的pID列。

哪个更好用?为什么有这些不同的方式呢? (正如在其他情况下需要一个查询而不是其他查询)如果我没有make = 'Airbus'要求,答案会有所不同吗?

3 个答案:

答案 0 :(得分:0)

    所有数据库系统都不支持
  • NATURAL JOIN
  • 交叉连接是一种不再受欢迎的旧语法
  • JOIN语法(您的示例#3与我认为的“theta”连接不同)被更广泛接受(由SQL提供商和开发人员提供)
  

哪个更好用?

大多数人会说#3,但有些系统可能会更好地优化不同的连接类型

  

为什么有这些不同的方法呢?

因为语法会随着时间的推移而跨系统发生变化

  

如果我没有make ='空中客车'的要求会有不同的答案吗?

可能不是。同样,某些系统可能会更好地优化特定语法,但并不是涵盖所有系统的通用答案。

答案 1 :(得分:0)

由于笛卡尔积规则的属性,交叉连接会导致巨大的数据大小。请参阅:http://en.wikipedia.org/wiki/Cartesian_product

您可以在下面的网站上查看其他两种联接类型;

Difference between a theta join, equijoin and natural join

还有更多:http://en.wikipedia.org/wiki/Relational_algebra

答案 2 :(得分:0)

我建议您使用最广泛支持的最新语法版本 - 即:

SELECT pilot.eID, plane.model 
FROM pilot 
     [ INNER ] JOIN plane 
ON pilot.pID = plane.pID 
WHERE plane.make = 'Airbus'

与其他两个选项相比,优势在于连接是

  • a)明确和
  • b)与过滤(where)子句分开。