這裏是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