【面试通关】大数据开发高频SQL面试题(含详细解析)——in/exists、having/where、排序函数等核心考点
【面试通关】大数据开发高频SQL面试题含详细解析——in/exists、having/where、排序函数等核心考点摘要本文整理了大数据开发面试中最高频的SQL核心考点聚焦in与exists、having与where、窗口排序函数、on与where表连接等易混淆知识点通过「问题核心区别实战案例」的形式清晰拆解每个考点的底层逻辑和使用场景帮助面试者快速掌握解题思路避开高频踩坑点适用于Hive/Spark SQL/Oracle等主流大数据SQL场景。正文一、基础核心区别类高频必问1. 请详细说明 IN 和 EXISTS 的区别以及各自的适用场景考察点子查询执行逻辑、性能优化、数据量适配参考答案核心区别① 执行逻辑IN是「外查询→内查询」先执行内查询得到结果集外查询匹配结果集EXISTS是「内查询→外查询」内查询只需返回是否存在记录布尔值无需返回完整结果集。② 空值处理IN遇NULL会返回NULL导致结果丢失EXISTS遇NULL仍可正常判断是否存在。③ 性能差异内查询结果集小→用IN外查询数据量小、内查询需关联字段→用EXISTS大数据场景下EXISTS更适合大表关联。实战案例-- IN内查询结果集小时使用SELECT*FROMempWHEREdeptnoIN(SELECTdeptnoFROMdeptWHEREloc北京);-- EXISTS大表关联时更高效SELECT*FROMemp eWHEREEXISTS(SELECT1FROMdept dWHEREe.deptnod.deptnoANDd.loc北京);2. WHERE 和 HAVING 的核心区别是什么分别在什么场景下使用考察点数据过滤阶段、聚合函数使用限制参考答案核心区别① 过滤阶段WHERE在「分组前」过滤行不允许使用聚合函数HAVING在「分组后」过滤分组结果必须配合GROUP BY使用可使用聚合函数。② 适用字段WHERE只能过滤表中原始字段HAVING可过滤聚合后的计算字段如SUM/COUNT/AVG结果。实战案例-- WHERE分组前过滤只查部门10的员工SELECTdeptno,AVG(sal)FROMempWHEREdeptno10GROUPBYdeptno;-- HAVING分组后过滤只查平均工资5000的部门SELECTdeptno,AVG(sal)FROMempGROUPBYdeptnoHAVINGAVG(sal)5000;3. 表连接中 ON 和 WHERE 的区别左连接场景下为什么不能随便替换考察点连接逻辑、NULL值处理、左连接/右连接特性参考答案核心区别① 执行阶段ON是「连接时」过滤先筛选符合条件的行再连接WHERE是「连接后」过滤先全量连接再筛选。② 左连接影响左连接中ON过滤不影响左表主数据不符合ON条件的左表行仍保留右表字段为NULLWHERE过滤会直接剔除不符合条件的行包括左表行。实战案例-- 错误WHERE过滤导致左表无匹配的行被剔除SELECTe.ename,d.dnameFROMemp eLEFTJOINdept dONe.deptnod.deptnoWHEREd.loc北京;-- 正确ON过滤只筛选右表左表行完整保留SELECTe.ename,d.dnameFROMemp eLEFTJOINdept dONe.deptnod.deptnoANDd.loc北京;二、窗口函数类大数据开发重点4. ROW_NUMBER()、RANK()、DENSE_RANK() 的区别请举例说明使用场景考察点排序逻辑、重复值处理、TopN场景适配参考答案核心区别以分数排序为例① ROW_NUMBER()连续编号重复值也会分配不同序号如90、90、80→1、2、3。② RANK()跳跃编号重复值共享序号后续序号跳跃如90、90、80→1、1、3。③ DENSE_RANK()连续编号重复值共享序号后续序号连续如90、90、80→1、1、2。实战案例取每个部门工资前2的员工SELECTename,deptno,sal,ROW_NUMBER()OVER(PARTITIONBYdeptnoORDERBYsalDESC)ASrn,RANK()OVER(PARTITIONBYdeptnoORDERBYsalDESC)ASrk,DENSE_RANK()OVER(PARTITIONBYdeptnoORDERBYsalDESC)ASdrFROMemp;5. LAG() 和 LEAD() 函数的作用请结合场景说明用法如计算用户连续登录天数/成绩环比考察点窗口函数取值逻辑、跨行数据处理参考答案核心作用① LAG(col, n)取当前行「前n行」的指定字段值默认n1。② LEAD(col, n)取当前行「后n行」的指定字段值默认n1。实战案例计算学生成绩环比变化SELECTsno,cla,score,LAG(score,1)OVER(PARTITIONBYsnoORDERBYcla)ASlast_score,-- 上一科成绩score-LAG(score,1)OVER(PARTITIONBYsnoORDERBYcla)ASdiff-- 成绩变化FROMt_score;三、性能优化类进阶考点6. 大数据场景下如何优化包含 IN/EXISTS 的慢SQL参考答案优先用EXISTS替代IN尤其是内查询结果集大时EXISTS只需判断存在性无需返回全量数据内查询结果集去重DISTINCT减少匹配次数给关联字段加索引如Hive中给分区字段/关联字段建索引Spark中优化Shuffle大数据量时用JOIN替代ININ底层会转为JOIN但手动JOIN可更精准控制。7. 窗口函数在大数据场景Hive/Spark中的性能优化技巧参考答案尽量缩小PARTITION BY的范围避免全表分区排序字段优先用整型/日期型减少字符串排序开销Hive中开启矢量化执行set hive.vectorized.execution.enabledtrueSpark中调整shuffle分区数spark.sql.shuffle.partitions避免数据倾斜。