MySQL 结合子查询(“衍生”表)

示例

SELECT x, ...

    FROM ( SELECT y, ... FROM ... ) AS a

    JOIN tbl  ONtbl.x= a.y

    WHERE ...

这会将子查询评估为临时表,然后评估JOIN为tbl。

在5.6之前的版本中,临时表上没有索引。因此,这可能效率很低:

SELECT ...

    FROM ( SELECT y, ... FROM ... ) AS a

    JOIN ( SELECT x, ... FROM ... ) AS b  ONb.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。但是它是有效的,因为子查询仅返回必须与。中的n行匹配的一行the_real_table。)

以上是 MySQL 结合子查询(“衍生”表) 的全部内容, 来源链接: utcz.com/z/348723.html

回到顶部