使用子查詢加入(派生表)

SELECT x, ...
    FROM ( SELECT y, ... FROM ... ) AS a
    JOIN tbl  ON tbl.x = a.y
    WHERE ...

這會將子查詢評估為臨時表,然後將 JOIN 評估為 tbl

在 5.6 之前,臨時表上沒有索引。所以,這可能非常低效:

SELECT ...
    FROM ( SELECT y, ... FROM ... ) AS a
    JOIN ( SELECT x, ... FROM ... ) AS b  ON b.x = a.y
    WHERE ...

使用 5.6,優化器可以計算出最佳索引並在執行中建立它。 (這有一些開銷,所以它仍然不是’完美’。)

另一個常見的範例是有一個子查詢來初始化一些東西:

SELECT 
        @n := @n + 1,
        ...
    FROM ( SELECT @n := 0 ) AS initialize
    JOIN the_real_table
    ORDER BY ...

(注意:這在技術上是一個 CROSS JOIN(笛卡爾積),如缺少 ON 所示。但它很有效,因為子查詢只返回一行必須與 the_real_table 中的 n 行匹配。)