1、union 和 union all的区别
union会对结果进行去重,union all会保留重复数据
2、窗口函数rank() over(order by )、dense_rank() over(order by)、row_number() over(order by)区别
rank() 函数rank相同,排序值相同,且占排序位置。如113446
dense_rank() 函数rank相同,排序值相同,不占排序位置。如1223445
row_number() 函数rank相同,排序依次递增,占排序位置。如123456
3、空值不占空间,null占空间。
4、开窗函数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的区别
数据量不大时,两者性能相近。前者主要用于统计去重指标,后者主要用于分组统计。数据量较大时可以使用里层group by,外层count代替count (distinct )操作。由于count distinct全局只有一个reduce,数据量较大时,容易reduce端数据倾斜,性能较差。
两者执行方式不同,distinct主要对数据进行两两比较,需要遍历整个表。group by分组类似先建立索引再查索引,当数据量大时,group by速度快于distinct。
7、exists和in的区别
in在查询时,先执行子查询,然后与外表进行笛卡尔积按照过滤条件进行过滤。所以内表小时,in比较快。
exists指定一个子查询,检测行的存在。遍历循环外表,然后看外表是否有和内表一样的数据,匹配上就将结果放入结果集中。
exists只返回true或false。因此查询的select *也可以是select 1或其他。select * from A exists (select 1 from B where A.id = B.id); exists的实际过程经过了优化,而非逐条对比;Exists子查询往往可以使用条件表达式。其他子查询或join来代替。
当A表数据量大于B表时,in优于exists。当A表数据量小于B表时用exists优于in。【A与B表的id字段应该建立索引】。如果两个表查询性能相当,那么in和exists差别不大,如果两个表一个较小,一个是大表,则子查询的大用exists。子查询小的用in。