2017-10-14 131 views
0

什么是使用这种语法的好处:WITH语句VS子查询

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

WITH AS ..可在子查询不能重用的情况下重用。 –

回答

1

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

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

  • 它允许重新使用表达式。子查询只在查询中出现一次。 CTE可以多次引用。
  • CTE可以指其他CTE。这可以防止大量子查询的嵌套问题。
  • CTE启用了递归的CTE,这很方便。

我不推荐使用子查询或CTE来选择特定的列。但是,我猜这只是为了说明的目的,并且切合你的实际问题。

Here为基准,他们是从优化的角度是相同的:

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

  • 合并将派生表转换为外部查询块

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

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