1、union 和 union all的區(qū)別
union會(huì)對(duì)結(jié)果進(jìn)行去重,union all會(huì)保留重復(fù)數(shù)據(jù)
2、窗口函數(shù)rank() over(order by )、dense_rank() over(order by)、row_number() over(order by)區(qū)別
rank() 函數(shù)rank相同,排序值相同,且占排序位置。如113446
dense_rank() 函數(shù)rank相同,排序值相同,不占排序位置。如1223445
row_number() 函數(shù)rank相同,排序依次遞增,占排序位置。如123456
3、空值不占空間,null占空間。
4、開窗函數(shù)sum() over(partition by A order by B
5、grouping sets用法 select a,b,count(c),grouping__id from table_A where dt = 20230228 group by 1,2 grouping sets(a,b,(a,b))
6、count (distinct )和group by的區(qū)別
數(shù)據(jù)量不大時(shí),兩者性能相近。前者主要用于統(tǒng)計(jì)去重指標(biāo),后者主要用于分組統(tǒng)計(jì)。數(shù)據(jù)量較大時(shí)可以使用里層group by,外層count代替count (distinct )操作。由于count distinct全局只有一個(gè)reduce,數(shù)據(jù)量較大時(shí),容易reduce端數(shù)據(jù)傾斜,性能較差。
兩者執(zhí)行方式不同,distinct主要對(duì)數(shù)據(jù)進(jìn)行兩兩比較,需要遍歷整個(gè)表。group by分組類似先建立索引再查索引,當(dāng)數(shù)據(jù)量大時(shí),group by速度快于distinct。
7、exists和in的區(qū)別
in在查詢時(shí),先執(zhí)行子查詢,然后與外表進(jìn)行笛卡爾積按照過濾條件進(jìn)行過濾。所以內(nèi)表小時(shí),in比較快。
exists指定一個(gè)子查詢,檢測(cè)行的存在。遍歷循環(huán)外表,然后看外表是否有和內(nèi)表一樣的數(shù)據(jù),匹配上就將結(jié)果放入結(jié)果集中。
exists只返回true或false。因此查詢的select *也可以是select 1或其他。select * from A exists (select 1 from B where A.id = B.id); exists的實(shí)際過程經(jīng)過了優(yōu)化,而非逐條對(duì)比;Exists子查詢往往可以使用條件表達(dá)式。其他子查詢或join來代替。
當(dāng)A表數(shù)據(jù)量大于B表時(shí),in優(yōu)于exists。當(dāng)A表數(shù)據(jù)量小于B表時(shí)用exists優(yōu)于in?!続與B表的id字段應(yīng)該建立索引】。如果兩個(gè)表查詢性能相當(dāng),那么in和exists差別不大,如果兩個(gè)表一個(gè)較小,一個(gè)是大表,則子查詢的大用exists。子查詢小的用in。