MySQL Common Table Expressions(CTE)是MySQL 8.0中的一個功能強大的擴展,可用於環節中包含高級SELECT查詢。 CTE是一個臨時結果集,表示由一個SQL查詢定義的命名查詢表。 它通過一個SQL查詢給出了一個臨時命名表,它們的結果可以被引用多次,而不需要對同一個SQL查詢進行多次操作。 此外,CTE還可以幫助開發人員在處理數據時更聰明地編寫代碼,提高其維護性和閱讀性。
一、基本語法
CTE的基本語法如下:
WITHview_name[columnlist]AS(SELECTstatementSELECTstatementUSINGview_name;
這裡,view_name代表CTE的名稱,可以使任何有效的MySQL標識符。可選的column list允許開發人員在CTE上創建列別名。 SELECT語句是CTE的定義,它傳回某些結果,稍後可以從查詢中引用。 這個可選項的語句能夠使用查詢中定義的任何有效SQL語句。 採用如下方式在查詢中使用CTE:
SELECTstatementUSINGview_name;
下面是一個簡單的例子:
WITHmyCTEAS(SELECT*FROMcustomersWHEREcustomerName='AlfredsFutterkiste'SELECT*FROMmyCTEUNIONSELECT*FROMordersWHEREcustomerName='AlfredsFutterkiste';
這裡我們使用WITH聲明了一個名為myCTE的CTE,該CTE返回了名為“Alfreds Futterkiste”的客戶的所有詳細信息。 接下來,我們將使用UNION運算符將兩個查詢的結果組合為一個結果集。 在這個示例中,我們使用我們的CTE查詢和SELECT * FROM orders WHERE customerName ='Alfreds Futterkiste'查詢的結果。
二、遞歸CTE
除了普通CTE之外,MySQL 8.0還允許使用遞歸CTE。 遞歸CTE不僅返回結果集,而且還將結果集與自身聯接。 它們通常用於處理具有層次結構的數據。 遞歸CTE由以下組件組成:
初始查詢(即基本查詢)
遞歸部分(包括聯接條件和遞歸查詢)
下面是一個簡單的例子,演示了遞歸CTE如何使用:
WITHRECURSIVEmyCTE(emp_id,emp_name,manager_id,level)AS(SELECTemp_id,emp_name,manager_id,0ASlevelFROMemployeesWHEREmanager_idISNULLUNIONALLSELECTe.emp_id,e.emp_name,e.manager_id,level+1FROMemployeese,myCTEcWHEREe.manager_id=c.emp_idSELECTemp_name,levelFROMmyCTE;
在此示例中,我們使用WITH RECURSIVE語句中的遞歸函數來查找一個組織的層次結構。 我們在遞歸CTE中定義了一個名為myCTE的表,該表具有四個列:emp_id,emp_name,manager_id和level。 我們的遞歸CTE具有兩個部分:初始查詢和遞歸部分。 初始查詢用於查找沒有經理的員工。 非循環部分的列包括emp_id,emp_name,manager_id和0作為level。 第二個SELECT語句是遞歸部分,它包括聯接條件和遞歸查詢。 此聯接條件使用emp_id和manager_id列。 在遞歸查詢中,我們聯接了每個員工的經理並返回emp_id列,emp_name列,manager_id列和level基於遞歸次數而定的級別列。 我們的查詢的結果是員工名和他們的級別。
三、CTE的優缺點
CTE的優點如下:
簡潔代碼
可重用
可讀性好
提高性能
CTE的缺點如下:
不能在表達式中使用CTE。因此,您不可以編寫複雜的查詢來處理CTE查詢的結果。
性能可能受到影響。在某些情況下,CTE可能會導致性能下降,尤其是在與大型數據庫一起使用時。
四、總結
該文章為MySQL Common Table Expressions(CTE)提供了一個簡要介紹,這是一個MySQL 8.0中的強大擴展。 CTE用於環節中包含高級SELECT查詢,因為它定義了一個臨時命名表,這個臨時命名表可以被引用多次,避免重複操作同一查詢。 CTE提供了一種優雅簡潔並具有可讀性的替代方式,可以更聰明地處理數據。 相比較其他MySQL擴展功能,CTE 卓越的性能和優良的查詢結果,可以大大提高數據庫的工作效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/152015.html