公共表表達式(CTEs)是一個命名的臨時結果集。CTE不作為對象存儲,僅在查詢執行期間持續。
有時我們在處理一些復雜查詢的時候,需要把查詢內容一步步分解,最后計算出想要的結果。因此我們需要保存這些中間數據,但是計算出最后結果之后這些數據就沒用了,因此我們需要把這些中間計算過程保存在一個臨時的結果集里。
語法:
WITH cte_name AS (
query
);
注:CTE后面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔。
例子:
在合並兩張表之前先進行篩選,盡可能刪減掉不需要的行,只保留需要的行,這樣編寫出的SQL更高效。
以下的SQL是非常低效的,因為它先合並兩個表,之后才對“2017年1月9日”之后的時間進行篩選:
SELECT * FROM table_a a JOIN table_b b ON a.username = b.username WHERE a.day >= '2017-09-01'
正確的表達方式是在合並表之前使用CTEs進行篩選,如下:
WITH a AS ( SELECT * FROM table_a WHERE day >= '2017-09-01'), b AS ( SELECT * FROM table_b WHERE day >= '2017-09-01'); SELECT * FROM a JOIN b ON a.username=b.username;
CTEs會預存子查詢的結果,所以運行速度通常比子查詢要快。尤其是當某個子查詢的表被重復使用的時候,效率會顯著提升。