2017-10-14 137 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子句子查詢),優化器 這些選擇:

  • 合併將派生錶轉換爲外部查詢塊

  • 將派生表具體化爲內部臨時表

對於視圖引用和公用表表達式,優化程序的 與派生表的選擇相同。