WITH语句VS子查询

时间:2017-10-14 12:52:30

标签: mysql sql

使用此类语法有什么好处:

WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;

代替:

SELECT b, d 
FROM (SELECT a, b FROM table1) AS cte1 
JOIN (SELECT c, d FROM table2) AS cte2
WHERE cte1.a = cte2.c;

我知道这是MySQL 8的新功能吗?

1 个答案:

答案 0 :(得分:2)

MySQL 8是对MySQL的重写。我相信两者都会以同样的方式运行 - 因为MySQL改进了子查询的处理。

也就是说,第二个版本与早期版本的MySQL兼容。第一个版本很方便,原因如下:

  • 它允许重复使用表达式。子查询仅在查询中出现一次。 CTE可以多次引用。
  • CTE可以参考其他CTE。这可以防止大量子查询的嵌套问题。
  • CTE可以实现方便的递归CTE。

我不建议仅使用子查询或CTE来选择特定列。但是,我猜这只是为了说明目的而与你的实际问题相关。

Here是从优化角度来看它们相同的参考:

  

对于派生表(FROM子句中的子查询),优化器具有   这些选择:

     
      
  • 将派生表合并到外部查询块

  •   
  • 将派生表具体化为内部临时表

  •   
     

对于视图引用和公用表表达式,优化器具有   与派生表的选择相同。