WITH AS短語墙贱,也叫做子查詢部分(subquery factoring)蟋软,是用來定義一個SQL片斷亲澡,該SQL片斷會被整個SQL語句所用到盲憎。這個語句算是公用表表達(dá)式(CTE)。
比如
with A as (select * from class)
select *from A
這個語句的意思就是半夷,先執(zhí)行select * from class 得到一個結(jié)果婆廊,將這個結(jié)果記錄為A ,在執(zhí)行select *from A 語句巫橄。A 表只是一個別名淘邻。
也就是將重復(fù)用到的大批量 的SQL語句,放到with as 中湘换,加一個別名宾舅,在后面用到的時候就可以直接用。
對于大批量的SQL數(shù)據(jù)彩倚,起到優(yōu)化的作用筹我。
PostgreSQL提供的一種方法,用于寫一個大的查詢中使用的輔助報表與查詢帆离,能使復(fù)雜和大型查詢簡單易讀蔬蕊。
1:with子句的使用
使用現(xiàn)有數(shù)據(jù)庫查詢,查詢在2017.05.01號0點到2017.05.08號0點之間的充值玩家的id,sid,期間充值總數(shù)num哥谷。
命令如下:
with u as (select id, sum(amount) as num from pay where pay_time >= 1493568000 and pay_time < 1494172800 group by id) select u.id, pinfo.sid, u.num from u join pinfo on u.id=pinfo.id;
解析:
使用with查詢出相關(guān)玩家的id和期間充值總數(shù)num岸夯,
再查詢出對應(yīng)id玩家的sid。
2:多個with子句的使用
使用現(xiàn)有數(shù)據(jù)查詢们妥,在1的基礎(chǔ)上猜扮,增加查詢這些玩家到
2017.05.08號0點的歷史充值總數(shù)total。
with u1 as (select id, sum(amount) as num from pay where pay_time >= 1493568000 and pay_time < 1494172800 group by id), u2 as(select id, sum(amount) as total from pay where pay_time < 1494172800 group by id) select u1.id, pinfo.sid, u1.num, u2.total from u1, u2, pinfo where u2.id = u1.id and pinfo.id = u1.id;
解析:
使用with查詢出固定時間內(nèi)充值的玩家id和期間充值總數(shù)监婶,
使用with查詢出指定時間之前充值的玩家的id和歷史充值總數(shù)旅赢,
再查詢出u1中所有id對應(yīng)的u2中的數(shù)據(jù),以及pinfo中的sid压储。