例如,我有以下表格:
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'
要求,答案会有所不同吗?
答案 0 :(得分:0)
NATURAL JOIN
JOIN
语法(您的示例#3与我认为的“theta”连接不同)被更广泛接受(由SQL提供商和开发人员提供)哪个更好用?
大多数人会说#3,但有些系统可能会更好地优化不同的连接类型
为什么有这些不同的方法呢?
因为语法会随着时间的推移而跨系统发生变化
如果我没有make ='空中客车'的要求会有不同的答案吗?
可能不是。同样,某些系统可能会更好地优化特定语法,但并不是涵盖所有系统的通用答案。
答案 1 :(得分:0)
由于笛卡尔积规则的属性,交叉连接会导致巨大的数据大小。请参阅:http://en.wikipedia.org/wiki/Cartesian_product
您可以在下面的网站上查看其他两种联接类型;
答案 2 :(得分:0)
我建议您使用最广泛支持的最新语法版本 - 即:
SELECT pilot.eID, plane.model
FROM pilot
[ INNER ] JOIN plane
ON pilot.pID = plane.pID
WHERE plane.make = 'Airbus'
与其他两个选项相比,优势在于连接是
where
)子句分开。