这里是JOIN
优先级更详细的解答。在你的情况下,JOIN
都是可交换的。让我们尝试一个他们没有的地方。
构建模式:
CREATE TABLE users (
name text
);
CREATE TABLE orders (
order_id text,
user_name text
);
CREATE TABLE shipments (
order_id text,
fulfiller text
);
添加数据:
INSERT INTO users VALUES ('Bob'), ('Mary');
INSERT INTO orders VALUES ('order1', 'Bob');
INSERT INTO shipments VALUES ('order1', 'Fulfilling Mary');
运行查询:
SELECT *
FROM users
LEFT OUTER JOIN orders
ON orders.user_name = users.name
JOIN shipments
ON shipments.order_id = orders.order_id
结果:
只有鲍勃行返回
分析:
在这个查询中LEFT OUTER JOIN
评价第一和JOIN
对所LEFT OUTER JOIN
的合成结果进行评价。
第二个查询:
SELECT *
FROM users
LEFT OUTER JOIN (
orders
JOIN shipments
ON shipments.order_id = orders.order_id)
ON orders.user_name = users.name
结果:
鲍勃
一行(与履行数据)和一行玛利亚与空值的履行数据。
分析:
括号改变了评估顺序。
而且MySQL文档是https://dev.mysql.com/doc/refman/5.5/en/nested-join-optimization.html
,这真是个跨产品?我认为 SELECT * FROM table_a JOIN table_b USING(common_column) 会产生table_a中所有行,它们在table_b的common_column字段的任何行上都有匹配吗?这可能少于n行。 交叉乘积不会返回多少行? – 2008-10-23 18:05:41
对不起。我对USING语法一无所知,所以我不能评论它是如何工作的。 “交叉产品”的评论只是参考一般的联接,它们有能力创建元组的组合爆炸,这就是优化器考虑基数的原因。 – benjismith 2008-10-24 17:13:40