4.from/join子查詢
from/join子查詢通常為表子查詢,在實(shí)際業(yè)務(wù)中岩瘦,有時(shí)單個(gè)原始數(shù)據(jù)表中存儲(chǔ)的現(xiàn)成字段無法涵蓋分析所需的全部字段,這些需要處理的字段可能會(huì)分布在多個(gè)表中窿撬,需要依次進(jìn)行計(jì)算之后再連接启昧。from/join子查詢也可以用來進(jìn)行計(jì)算字段和原始數(shù)據(jù)表中數(shù)據(jù)列的比較,因?yàn)橛行┎樵冏志浠蚝瘮?shù)并沒有考慮數(shù)據(jù)重復(fù)的情況劈伴,直接使用它們進(jìn)行查詢?nèi)菀讓?dǎo)致結(jié)果丟失箫津,因此在不確定數(shù)據(jù)的重復(fù)情況時(shí),可以使用子查詢來規(guī)避此類錯(cuò)誤宰啦。
如:我們想要查詢最高工資的員工苏遥,代碼如下
select empno,ename,sal,emp.deptno from emp left join (select deptno,max(sal) as 最高工資 from emp group by deptno) as t
on emp.deptno=t.deptno where sal = 最高工資;
或者也可以使用開窗函數(shù)實(shí)現(xiàn):
select emptno,ename,sal,deptno from (select *,dense_rank() over(partition by deptno order by sal desc) 工資排名 from emp) t where 工資排名=1;
5. where/having子查詢
where/having子查詢通常用于根據(jù)較為復(fù)雜的業(yè)務(wù)邏輯需求來對(duì)數(shù)據(jù)進(jìn)行條件篩選赡模,支持所有種類的字查詢田炭,并可以直接使用運(yùn)算符來對(duì)子查詢返回的結(jié)果集進(jìn)行比較和篩選。如果子查詢?yōu)闃?biāo)量子查詢或者行子查詢漓柑,即在只返回一條記錄的前提下教硫,可以直接使用>、>=辆布、<瞬矩、<=、=锋玲、<>/!=等比較操作字符來進(jìn)行比較景用。如果子查詢?yōu)榱凶硬樵兓蛘弑碜硬樵儯捶祷囟鄺l記錄惭蹂,需要使用[not]in伞插、any/some、all盾碗、[not]exists等關(guān)鍵詞進(jìn)行條件篩選媚污,通常比較操作字符會(huì)直接添加在子查詢外部括號(hào)的左邊。
基礎(chǔ)語法格式:
select <字段名列表> from? <表名> where expr operator(select <字段名列表> from <表名>);
1)比較操作字符
當(dāng)返回的結(jié)果集為單行時(shí)廷雅,可以直接使用比較操作字符直接進(jìn)行比較耗美。如果記過集包含多個(gè)字段,需要使用括號(hào)將多個(gè)字段括起來航缀,兩側(cè)字段的數(shù)據(jù)類型商架、個(gè)數(shù)順序必須一一對(duì)應(yīng)。