我想确认一下SQL查询
SELECT ....
FROM apples,
oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
bananas
WHERE ....
完全等同于FROM子句中的其他排列,例如
SELECT ....
FROM oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id,
bananas,
apples
WHERE ....
或
SELECT ....
FROM bananas,
apples,
oranges
LEFT JOIN kiwis ON kiwis.orange_id = oranges.id
WHERE ....
只要桔子和猕猴桃之间明确的LEFT JOIN保持不变。从我在各种文档中看到的内容来看,返回的集应该完全相同。
我真的只关心查询的结果,而不是它在实际数据库中的性能。 (我正在使用PostgreSQL 8.3,AFAIK不支持关于连接顺序的优化器提示,并将尝试自动创建最佳查询计划。)
答案 0 :(得分:15)
它是一样的,但它与隐式 CROSS JOINs一样模棱两可。使用显式JOINS。
如果您要加入WHERE子句,那么结果可能会因为连接和过滤器混淆而不同。
SELECT ....
FROM apples a
JOIN
bananas b ON ...
JOIN
oranges o ON ...
LEFT JOIN
kiwis k ON k.orange_id = o.id
WHERE (filters only)
注意:
答案 1 :(得分:1)
情况总结在Controlling the Planner with Explicit JOIN Clauses。外连接不会重新排序,内连接可以。您可以通过在运行查询之前删除* join_collapse_limit *来强制执行特定的优化器顺序,并按照您希望的顺序放置内容。这就是你如何“暗示”这个领域的数据库。
通常,您希望使用EXPLAIN来确认您获得的订单,有时可以用来直观地确认两个查询是否获得相同的计划。
答案 2 :(得分:0)
我为驴子做了几年的SQL,根据我的经验,表格顺序并不重要。数据库将查看整个查询并创建最佳查询计划。这就是为什么数据库公司在查询计划优化中聘请了许多拥有博士学位的人。
如果数据库供应商按照您在查询中列出SQL的顺序进行优化,则会导致商业自杀。