在mysql中,“with as”也叫子查詢,用于定義一個(gè)sql片段,且該片段會(huì)被整個(gè)sql語(yǔ)句反復(fù)使用很多次,這個(gè)sql片段就相當(dāng)于是一個(gè)公用臨時(shí)表,語(yǔ)法為“with tmp as (查詢語(yǔ)句)”。
本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。
mysql中with as的用法是什么
WITH AS短語(yǔ),也叫做子查詢部分(subquery factoring),可以定義一個(gè)SQL片斷,該SQL片斷會(huì)被整個(gè)SQL語(yǔ)句用到??梢允筍QL語(yǔ)句的可讀性更高,也可以在union ALL的不同部分,作為提供數(shù)據(jù)的部分。
對(duì)于UNION ALL,使用WITH AS定義了一個(gè)UNION ALL語(yǔ)句,當(dāng)該片斷被調(diào)用2次以上,優(yōu)化器會(huì)自動(dòng)將該WITH AS短語(yǔ)所獲取的數(shù)據(jù)放入一個(gè)Temp表中。而提示meterialize則是強(qiáng)制將WITH AS短語(yǔ)的數(shù)據(jù)放入一個(gè)全局臨時(shí)表中。很多查詢通過該方式都可以提高速度。
因with as 子查詢僅執(zhí)行一次,將結(jié)果存儲(chǔ)在用戶臨時(shí)表中,提高查詢性能,所以適合多次引用的場(chǎng)景,如:復(fù)雜的報(bào)表統(tǒng)計(jì),分頁(yè)查詢,且需要拿到sum、count、avg這類結(jié)果作為篩選條件,對(duì)查詢出的結(jié)果進(jìn)行二次處理!
特別對(duì)于union all比較有用。因?yàn)閡nion all的每個(gè)部分可能相同,但是如果每個(gè)部分都去執(zhí)行一遍的話,則成本太高
常用語(yǔ)法
–針對(duì)一個(gè)別名
with?tmp?as?(select?*?from?tb_name)
–針對(duì)多個(gè)別名
with tmp?as?(select?*?from?tb_name), tmp2?as?(select?*?from?tb_name2), tmp3?as?(select?*?from?tb_name3), …
–相當(dāng)于建了個(gè)e臨時(shí)表
with?e?as?(select?*?from?scott.emp?e?where?e.empno=7499) select?*?from?e;
–相當(dāng)于建了e、d臨時(shí)表
with e?as?(select?*?from?scott.emp), d?as?(select?*?from?scott.dept) select?*?from?e,?d?where?e.deptno?=?d.deptno;
其實(shí)就是把一大堆重復(fù)用到的sql語(yǔ)句放在with as里面,取一個(gè)別名,后面的查詢就可以用它,這樣對(duì)于大批量的sql語(yǔ)句起到一個(gè)優(yōu)化的作用,而且清楚明了。
推薦學(xué)習(xí):mysql視頻教程