SQL 基础面试考点总结

发布时间:2026/5/26 2:36:41

SQL 基础面试考点总结 吃透这些SQL面试考点80%的面试题都能拿捏很多小伙伴面试数据开发、数据分析、后端岗位时SQL都是必考核心项。但大部分人刷题杂乱面试时遇到变形题就卡壳。今天我把全网高频的SQL面试考点从基础必背、核心查询、聚合分组、窗口函数、多表关联、优化实战、面试坑点七个维度系统总结全程干货无废话适合收藏复盘、考前突击一、基础概念考点面试开篇必问这部分属于送分题面试官主要考察基本功是否扎实杜绝基础漏洞。1. SQL分类高频问答DDL数据定义语言定义数据库、表结构无事务、不可回滚。核心语句CREATE、ALTER、DROP、TRUNCATEDML数据操作语言操作表中数据支持事务、可回滚。核心语句SELECT、INSERT、UPDATE、DELETEDCL数据控制语言权限管理。核心语句GRANT、REVOKETCL事务控制语言事务管理。核心语句COMMIT、ROLLBACK、SAVEPOINT2. 关键易混概念DELETE VS TRUNCATE VS DROP面试超高频对比题DELETE删除表数据保留表结构支持事务回滚速度慢可加WHERE条件精准删除TRUNCATE清空全表数据保留表结构不支持事务速度极快无法精准删除单行DROP删除整张表数据结构释放存储空间不可恢复彻底删除3. 事务四大特性ACID所有后端、数据岗位必背原子性、一致性、隔离性、持久性原子性事务要么全部执行成功要么全部失败回滚不可拆分一致性事务执行前后数据库数据完整性不变约束、索引有效隔离性多个事务并发执行互不干扰持久性事务提交后数据永久落地断电不丢失4. 事务隔离级别与并发问题面试常问脏读、不可重复读、幻读的区别以及隔离级别解决的问题读未提交存在脏读、不可重复读、幻读读已提交MySQL默认解决脏读存在不可重复读、幻读可重复读解决脏读、不可重复读存在幻读串行化解决所有并发问题性能最低完全串行执行二、核心查询语法笔试必考重点掌握SQL执行顺序90%的语法错误都是因为搞反了执行逻辑1. SQL完整执行顺序重中之重手写顺序SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT真实执行顺序FROM/JOIN确定数据源→ WHERE过滤行数据→ GROUP BY分组→ 聚合函数计算 → HAVING过滤分组后数据→ SELECT选取字段→ ORDER BY排序→ LIMIT分页 面试高频坑WHERE不能过滤聚合结果HAVING专门过滤分组聚合后的数据2. 条件查询核心要点NULL判断只能用 IS NULL / IS NOT NULL不能用 NULLNULL不等于任何值模糊查询LIKE %关键词%全模糊、关键词%右索引有效、%关键词左索引失效范围查询IN、BETWEEN AND、EXISTS高效、NOT EXISTS3. 例题精讲例题一入门条件筛选与NULL判断题目现有员工表 empidnamesalaryentry_timedept_id查询出薪资不为空、部门编号为10或20的员工姓名和薪资。错误写法SELECTname,salaryFROMempWHEREsalary!NULLANDdept_idIN(10,20);错误原因NULL不能用!、 判断数据库中 NULL 不等于任何值包括自身所有普通运算符与NULL运算结果都为NULL查询不到任何数据。正确写法SELECTname,salaryFROMempWHEREsalaryISNOTNULLANDdept_idIN(10,20);核心考点NULL专属判断语法 IS NULL / IS NOT NULL属于面试必背基础细节。例题二基础模糊查询与索引坑点题目在员工表emp中查询姓名以“张”开头、姓名包含“伟”、姓名最后一个字是“明”的员工数据分别写出对应SQL并说明索引有效性。标准答案-- 1、姓名以张开头索引有效SELECT*FROMempWHEREnameLIKE张%;-- 2、姓名包含伟全模糊索引失效SELECT*FROMempWHEREnameLIKE%伟%;-- 3、姓名以明结尾左模糊索引失效SELECT*FROMempWHEREnameLIKE%明;核心考点通配符%放前面索引失效%放后面保留索引。业务中尽量避免左模糊、全模糊查询大数据量场景会导致慢SQL。例题三进阶易错WHERE与HAVING区分执行顺序题目员工表empdept_id 部门号salary 薪资统计各部门平均薪资只筛选出平均薪资大于8000的部门写出正确SQL。错误写法SELECTdept_id,AVG(salary)ASavg_salaryFROMempWHEREavg_salary8000GROUPBYdept_id;错误原因根据SQL执行顺序WHERE在聚合函数之前执行此时还未计算出平均薪资WHERE无法过滤聚合结果直接报错。分组后的聚合筛选必须用HAVING。正确写法SELECTdept_id,AVG(salary)ASavg_salaryFROMempGROUPBYdept_idHAVINGAVG(salary)8000;解题逻辑先WHERE过滤原始数据行过滤→ 再GROUP BY分组 → 最后HAVING过滤分组后的聚合数据组过滤。例题四拔高EXISTS与IN性能场景题题目现有大表员工表emp100w数据、小表部门表dept几十条数据查询存在对应部门信息的员工数据分别用IN和EXISTS实现并说明性能优劣。写法1IN查询SELECT*FROMempWHEREdept_idIN(SELECTdept_idFROMdept);写法2EXISTS查询大表场景优先SELECT*FROMemp eWHEREEXISTS(SELECT1FROMdept dWHEREe.dept_idd.dept_id);核心考点总结外层大表、内层小表EXISTS性能更高遍历大表、匹配小表循环次数少外层小表、内层大表IN性能更高面试通用结论大表查询优先用EXISTS替代IN三、聚合与分组数据分析核心分组统计是面试、笔试、实操的高频场景核心是理解分组规则。1. 常用聚合函数SUM、COUNT、AVG、MAX、MIN高频考点COUNT(*)、COUNT(字段)、COUNT(1)的区别COUNT(*)统计所有行数包含NULL行、重复行性能最优COUNT(字段)统计字段非NULL的行数会忽略NULL数据COUNT(1)效果和COUNT(*)基本一致无本质区别2. GROUP BY 分组规则核心原则SELECT 后的非聚合字段必须出现在 GROUP BY 后面MySQL宽松模式除外正规面试必须遵守经典场景统计每个部门的员工人数、平均薪资、最高薪资易错点先WHERE过滤原始数据再GROUP BY分组最后HAVING过滤分组结果3. 例题精讲例题一入门基础聚合统计无分组题目基于员工表 emp统计全公司员工总人数、最高薪资、最低薪资、平均薪资、薪资总和。正确写法SELECTCOUNT(*)AStotal_staff,-- 总员工数MAX(salary)ASmax_salary,-- 最高薪资MIN(salary)ASmin_salary,-- 最低薪资AVG(salary)ASavg_salary,-- 平均薪资SUM(salary)ASsum_salary-- 薪资总和FROMemp;核心考点无GROUP BY时聚合函数会将全表所有数据视为一个整体分组直接输出全局统计结果COUNT(*) 统计所有行自动忽略NULL细节干扰。例题二基础基础分组统计单字段分组题目基于员工表 emp按部门分组统计每个部门的员工人数、部门平均薪资结果按部门人数降序排列。正确写法SELECTdept_id,COUNT(*)ASstaff_num,ROUND(AVG(salary),2)ASdept_avg_salary-- 保留2位小数业务常用FROMempGROUPBYdept_idORDERBYstaff_numDESC;解题逻辑通过dept_id将数据划分为多个分组再对每个分组单独执行聚合计算最后通过ORDER BY完成排序符合SQL执行顺序规则。高频坑点SELECT中查询的非聚合字段dept_id必须写在GROUP BY之后否则语法报错。例题三进阶WHERE分组前置过滤 HAVING分组后过滤题目统计在职员工中各部门的平均薪资只展示平均薪资大于7000的部门在职员工状态status1。错误写法-- 错误1用WHERE过滤聚合结果SELECTdept_id,AVG(salary)ASavg_salFROMempWHEREstatus1ANDavg_sal7000GROUPBYdept_id;-- 错误2用HAVING过滤原始字段SELECTdept_id,AVG(salary)ASavg_salFROMempGROUPBYdept_idHAVINGstatus1ANDavg_sal7000;错误原因WHERE只能过滤原始表行数据无法识别聚合后的字段HAVING只能过滤分组聚合后的数据无法过滤原始普通字段。正确写法SELECTdept_id,AVG(salary)ASavg_salFROMempWHEREstatus1-- 第一步先筛选在职员工过滤原始数据GROUPBYdept_id-- 第二步按部门分组HAVINGavg_sal7000;-- 第三步筛选符合条件的分组核心口诀原始数据过滤用WHERE分组结果过滤用HAVING。例题四拔高多字段分组 精准业务统计题目基于员工表 emp统计每个部门、每个岗位的员工人数和最高薪资筛选出人数大于3人的部门岗位。正确写法SELECTdept_id,job,COUNT(*)ASstaff_num,MAX(salary)ASmax_salFROMempGROUPBYdept_id,job-- 多字段联合分组字段顺序不影响结果HAVINGstaff_num3;解题逻辑多字段分组规则只有所有分组字段值完全相同的数据才会被分为同一组适用于精细化维度的业务统计部门岗位、年月地区等。假设有如下数据dept_idjobsalary10经理1000010经理900010程序员800020经理9500每个唯一组合会生成一行结果组1dept_id10, job‘经理’ → staff_num2, max_sal10000组2dept_id10, job‘程序员’ → staff_num1, max_sal8000组3dept_id20, job‘经理’ → staff_num1, max_sal9500注意字段顺序不影响分组结果GROUP BY dept_id, job等价于GROUP BY job, dept_idHAVING 筛选只保留staff_num 3的组即该部门同一岗位人数超过3人例题五面试真题COUNT统计NULL易错场景题目emp表中有部分员工salary薪资为NULL分别统计部门总人数、部门有薪资数据的人数。正确写法SELECTdept_id,COUNT(*)AStotal_staff,-- 统计部门所有员工含薪资NULLCOUNT(salary)ASvalid_sal_staff-- 仅统计薪资非空的员工FROMempGROUPBYdept_id;四、多表关联查询面试高频大题实际业务90%的SQL都是多表查询必须精通4种连接方式区分JOIN和子查询的使用场景。1. 四大JOIN区别INNER JOIN内连接只返回两张表匹配成功的数据交集数据LEFT JOIN左连接保留左表所有数据右表匹配不到则补NULL业务最常用RIGHT JOIN右连接保留右表所有数据左表匹配不到补NULLFULL JOIN全连接保留两张表所有数据无匹配补NULLMySQL不支持可用UNION替代2. UNION VS UNION ALLUNION去重排序性能低UNION ALL直接拼接结果不去重、不排序性能极高业务优先使用3. 子查询分类标量子查询返回单行单列可直接用于SELECT、WHERE后行子查询返回单行多列列子查询返回多行单列搭配IN、ANY、ALL使用表子查询返回多行多列可作为临时表搭配JOIN使用4. 例题精讲统一业务表结构所有例题通用员工表 empid(员工ID)、name(姓名)、salary(薪资)、dept_id(部门ID)部门表 deptdept_id(部门ID)、dept_name(部门名称)、leader_id(负责人ID)工资表 salary_logid、emp_id(员工ID)、month(月份)、salary(当月薪资)idnamesalarydept_id1mike1000012john1500013black8000Nulldept_iddept_nameleader_id1research2idemp_idmonthsalary1161000022615000例题一入门INNER JOIN 内连接基础查询题目查询所有有对应部门的员工姓名、部门ID、部门名称。解题思路只需要两表匹配成功的数据优先使用内连接自动过滤无部门的员工数据。正确写法SELECTe.name,e.dept_id,d.dept_nameFROMemp eINNERJOINdept dONe.dept_idd.dept_id;核心考点INNER JOIN 只返回两表匹配交集数据员工无部门、部门无员工的数据都会被过滤是最基础的多表关联用法。例题二基础LEFT JOIN 左连接经典场景面试必考题目查询所有员工的姓名、部门名称包含暂无分配部门的员工无部门则部门名显示NULL。错误写法-- 错误内连接会丢失无部门的员工数据SELECTe.name,d.dept_nameFROMemp eJOINdept dONe.dept_idd.dept_id;正确写法SELECTe.name,d.dept_nameFROMemp eLEFTJOINdept dONe.dept_idd.dept_id;核心考点业务中查全量主表数据必用左连接左表emp所有数据保留右表无匹配字段自动补NULL。例题三进阶易错LEFT JOIN 后WHERE过滤致命坑题目查询所有员工信息筛选出没有对应部门的员工。高频错误写法90%人踩坑-- 致命错误WHERE过滤右表字段抵消左连接效果降级为内连接SELECT*FROMemp eLEFTJOINdept dONe.dept_idd.dept_idWHEREd.dept_id!NULL;错误原因左连接查询后右表NULL数据会被WHERE条件过滤直接丢失主表全量数据等同于INNER JOIN。判断无匹配数据必须用 IS NULL。正确写法SELECTe.*FROMemp eLEFTJOINdept dONe.dept_idd.dept_idWHEREd.dept_idISNULL;-- 筛选右表无匹配的数据面试金句左连接筛选右表缺失数据只能用 IS NULL绝对不能用!、NOT IN。例题四进阶UNION ALL 与 UNION 去重实战题目现有10部门员工、20部门员工两份数据需要合并所有员工数据不做去重、保证查询性能。低效写法SELECT*FROMempWHEREdept_id10UNIONSELECT*FROMempWHEREdept_id20;高效正确写法SELECT*FROMempWHEREdept_id10UNIONALLSELECT*FROMempWHEREdept_id20;核心考点UNION 自带去重排序、性能极差业务合并结果集优先 UNION ALL仅在需要去重时使用UNION。例题五拔高三表关联综合统计题目统计每个部门的部门名称、员工人数、员工平均薪资展示所有部门含无员工的空部门。解题思路部门表为主表左连接员工表再分组聚合保留空部门数据。正确写法SELECTd.dept_id,d.dept_name,COUNT(e.id)ASstaff_num,-- 用员工id统计自动忽略NULL空部门人数为0ROUND(AVG(e.salary),2)ASavg_salaryFROMdept dLEFTJOINemp eONd.dept_ide.dept_idGROUPBYd.dept_id,d.dept_name;关键细节统计人数用 COUNT(员工字段) 而非COUNT(*)空部门无员工数据字段为NULL会被自动忽略统计结果精准为0避免统计异常。例题六面试真题子查询关联查询嵌套实战题目查询2026年5月有薪资记录的员工姓名、部门名称、当月薪资。正确写法SELECTe.name,d.dept_name,s.salaryFROMsalary_log sINNERJOINemp eONs.emp_ide.idINNERJOINdept dONe.dept_idd.dept_idWHEREs.month2026-05;解题逻辑以业务数据表工资表为核心串联员工、部门表三表内连接精准筛选有效数据是企业数据分析最常用的多表关联结构。五、窗口函数进阶面试必考普通聚合函数是“多行进一行”窗口函数是“多行保留多行”是中高级面试、数据分析的核心难点也是加分项。1. 核心语法函数() OVER (PARTITION BY 分组字段 ORDER BY 排序字段)2. 高频窗口函数及区别RANK()跳跃排名1,2,2,4并列占用名次DENSE_RANK()连续排名1,2,2,3并列不占用名次面试最常考ROW_NUMBER()连续不重复序号1,2,3,4无并列3. 常用场景分组排名每个班级成绩排名、每个部门薪资排名累计统计按月累计销售额、累计用户数前后行对比LAG()/LEAD() 获取上一行/下一行数据4. 例题精讲统一业务表结构所有例题通用员工表 empid(员工ID)、name(姓名)、dept_id(部门ID)、salary(薪资)、hire_time(入职时间)月度薪资表 salary_monthemp_id(员工ID)、month(月份)、salary(当月薪资)例题一入门三大排名函数基础用法与区别题目查询所有员工薪资对全员薪资进行排名分别使用 RANK、DENSE_RANK、ROW_NUMBER 展示排名结果对比三者差异。正确写法SELECTname,salary,ROW_NUMBER()OVER(ORDERBYsalaryDESC)ASrow_num,RANK()OVER(ORDERBYsalaryDESC)ASrk,DENSE_RANK()OVER(ORDERBYsalaryDESC)ASdense_rkFROMemp;结果差异说明ROW_NUMBER无论薪资是否相同序号连续不重复1、2、3、4适合取固定条数数据RANK薪资相同排名相同跳跃排名1、2、2、4会空缺名次DENSE_RANK薪资相同排名相同连续排名1、2、2、3无名次空缺面试最常用核心考点面试官必问三大排名函数区别重点掌握并列排名场景的适配场景。例题二基础分区排名分组排名核心题目查询每个部门内员工的薪资排名取出各部门员工姓名、薪资、部门内排名。解题思路通过 PARTITION BY 按部门分区再在分区内按薪资排序排名实现组内排名、组间独立。正确写法SELECTdept_id,name,salary,DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASdept_sal_rkFROMemp;核心考点PARTITION BY 是窗口函数核心区别于普通聚合函数分区后每组独立计算排名互不干扰不合并多行数据保留原始数据行。易错坑点只写 ORDER BY 不写 PARTITION BY会对全表排名无法实现部门分组排名。例题三进阶取每组TopN数据面试高频真题题目查询每个部门薪资排名前2的优秀员工允许并列名次。解题思路先通过窗口函数完成部门内排名再通过子查询筛选排名≤2的数据是TopN场景标准写法。正确写法SELECT*FROM(SELECTdept_id,name,salary,DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrkFROMemp)tWHERErk2;场景选型需要保留并列名次、不遗漏数据 → 用 DENSE_RANK需要严格限定2条数据、舍弃并列数据 → 用 ROW_NUMBER例题四进阶LAG/LEAD 行间数据对比题目基于月度薪资表查询每位员工每月薪资、上月薪资、下月薪资用于薪资环比分析。函数说明LAG(字段,n)获取当前行向上n行数据LEAD(字段,n)获取当前行向下n行数据正确写法SELECTemp_id,month,salaryAScurrent_sal,LAG(salary,1)OVER(PARTITIONBYemp_idORDERBYmonth)ASlast_month_sal,LEAD(salary,1)OVER(PARTITIONBYemp_idORDERBYmonth)ASnext_month_salFROMsalary_monthORDERBYemp_id,month;核心考点多用于环比分析、数据差值计算、异常数据比对是数据分析岗位高频实操场景。例题五拔高累计求和统计题目统计每位员工从入职开始逐月累计薪资实现薪资累计核算。正确写法SELECTemp_id,month,salaryASmonth_sal,SUM(salary)OVER(PARTITIONBYemp_idORDERBYmonth)AStotal_acc_salFROMsalary_monthORDERBYemp_id,month;语法解析窗口函数默认从分区第一行累计到当前行无需额外参数搭配 ORDER BY 实现有序累计去除 ORDER BY 则为分组整体总和。业务场景月度累计销售额、累计用户数、年度累计业绩等统计场景通用。例题六面试真题分组去重编号实操题目员工表存在同一部门多条重复薪资数据需要对每个部门数据排序并生成唯一序号用于删除重复数据。正确写法SELECTid,dept_id,salary,ROW_NUMBER()OVER(PARTITIONBYdept_id,salaryORDERBYid)ASrow_idFROMemp;解题逻辑按部门薪资双分区对重复数据编号后续可通过删除 row_id1 的数据实现去重是SQL删除重复数据的经典解法。六、SQL优化考点高阶面试核心工作3年以上面试必问重点考察性能调优思维拒绝慢SQL。1. 索引优化核心索引失效场景高频背诵模糊查询以%开头%xxx索引列参与运算、函数操作WHERE YEAR(create_time)2026使用!、、NOT IN、IS NOT NULL隐式类型转换字符串字段匹配数字OR连接非索引字段2. 语句优化原则避免SELECT *只查询需要的字段减少IO开销优先使用WHERE过滤数据缩小查询范围避免大表分组多表查询小表驱动大表LEFT JOIN 小表放左表分页优化深分页不用LIMIT 100000,10用主键偏移查询优先EXISTS替代IN大表场景EXISTS性能更高3. 避免重复计算复杂统计使用临时表、CTE表达式避免重复扫描大表4. 例题精讲统一业务表结构所有例题通用员工表 empid(主键)、name(姓名,普通索引)、salary(薪资,普通索引)、dept_id(部门ID,普通索引)、create_time(入职时间,普通索引)、status(在职状态)数据量级emp表100w测试数据模拟线上大表慢查询场景例题一入门避免索引列函数操作解决索引失效题目查询2026年入职的所有员工数据优化低效写法。低效写法索引失效SELECT*FROMempWHEREYEAR(create_time)2026;错误分析对索引列create_time使用YEAR()函数触发索引失效规则数据库放弃索引走全表扫描百万级数据查询极慢。优化后写法区间查询、命中索引SELECT * FROM emp WHERE create_time 2026-01-01 00:00:00 AND create_time 2026-12-31 23:59:59;核心优化思路索引列禁止参与函数、运算操作尽量用区间范围替代函数截取保留索引有效性。例题二基础模糊查询优化规避左模糊索引失效题目查询姓名包含“磊”的员工数据优化全模糊慢查询。低效写法全模糊、索引失效SELECT*FROMempWHEREnameLIKE%磊%;错误分析前后通配符全模糊查询name索引完全失效大表全表扫描性能极差。优化方案业务优先适配1、业务可约束场景改为右模糊LIKE ‘磊%’直接命中索引2、必须全模糊场景建立全文索引或使用ES检索替代原生模糊查询。核心考点日常开发坚决杜绝 %xxx、%xxx% 左模糊/全模糊查询是线上慢SQL重灾区。例题三进阶IN与EXISTS性能优化大表场景题目emp大表100w、dept小表几十条查询存在对应部门的员工数据优化查询性能。低效写法大表IN查询SELECT*FROMempWHEREdept_idIN(SELECTdept_idFROMdept);性能分析MySQL中IN对子查询结果集遍历匹配外层大表、内层小表时IN循环次数多、性能差。优化后写法EXISTS适配大表SELECT*FROMemp eWHEREEXISTS(SELECT1FROMdept dWHEREe.dept_idd.dept_id);核心优化口诀外层大表用EXISTS外层小表用IN精准适配不同数据量级。例题四进阶易错隐式类型转换索引失效优化题目dept_id为字符串索引字段查询部门编号为10的员工数据优化失效查询。低效写法隐式类型转换SELECT*FROMempWHEREdept_id10;错误分析字符串索引字段与数字匹配触发隐式类型转换数据库会对全表字段统一转数字索引彻底失效极易被忽略。优化后写法类型一致、命中索引SELECT*FROMempWHEREdept_id10;核心考点查询条件必须字段与参数类型完全一致杜绝隐式转换。例题五拔高深分页LIMIT超慢查询优化题目查询emp表第100000页之后的10条数据深分页场景优化慢查询。低效写法经典深分页坑SELECT*FROMempORDERBYidLIMIT100000,10;错误分析LIMIT偏移量过大时数据库会先查询前100010条数据丢弃前100000条只保留10条数据量越大耗时指数级增长。补充LIMIT 关键字在 SQL 中用于限制查询结果返回的行数。它的核心作用有两个获取前 N 条记录例如查询分数最高的前 10 名学生实现分页功能例如每页显示 20 条查看第 3 页的数据-- 返回前 5 行SELECT*FROM表名LIMIT5;-- 跳过前 5 行然后返回 10 行用于分页SELECT*FROM表名LIMIT5,10;-- 或者使用 OFFSET 写法更清晰SELECT*FROM表名LIMIT10OFFSET5;优化后写法主键偏移分页-- 先查上一页最大ID再偏移查询SELECT*FROMempWHEREid100000ORDERBYidLIMIT10;优化原理利用主键索引有序性直接定位起始位置无需扫描前置数据查询耗时从秒级降至毫秒级。适用场景所有需要分页展示的列表数据尤其后台管理系统、数据报表。例题六面试真题SELECT * 冗余查询优化题目查询在职员工的姓名、薪资、入职时间优化冗余SQL。低效写法全字段查询SELECT*FROMempWHEREstatus1;错误分析SELECT * 会查询所有字段包含大文本、冗余字段增加磁盘IO、网络传输开销无法使用覆盖索引。优化后写法按需查字段覆盖索引SELECTname,salary,create_timeFROMempWHEREstatus1;进阶优化可建立联合索引 idx_status_name_salary直接从索引获取数据无需回表查询性能拉满。七、面试高频坑点避坑指南很多人基础不错但总栽在细节坑点上这些是面试官最爱考察的细节NULL坑任何值和NULL运算结果都是NULL聚合函数自动忽略NULLGROUP BY坑分组后筛选必须用HAVINGWHERE无法识别聚合结果JOIN坑左连接后用WHERE过滤右表字段会强制抵消左连接效果等同于内连接排序坑ORDER BY 字段默认升序NULL值默认排在最前面去重坑DISTINCT 是对整行去重不是单个字段且性能较差八、高频面试真题场景总结统计每日新增用户、每日活跃用户、留存用户窗口函数分组找出重复数据、删除重复数据GROUP BY、ROW_NUMBER学生成绩排名、科目最高分DENSE_RANK、PARTITION BY多表关联统计订单、用户、销售额数据LEFT JOIN 聚合慢SQL排查与优化思路索引语句业务优化最后总结SQL面试的核心逻辑基础语法不踩坑、分组关联熟练用、窗口函数会进阶、优化思路有逻辑。大部分初级面试只考基础查询、多表关联、分组统计中高级面试重点考察窗口函数、SQL优化、业务场景落地。

相关新闻