SQL子查询面试题及详细答案(零基础到进阶)_第1页
SQL子查询面试题及详细答案(零基础到进阶)_第2页
SQL子查询面试题及详细答案(零基础到进阶)_第3页
SQL子查询面试题及详细答案(零基础到进阶)_第4页
SQL子查询面试题及详细答案(零基础到进阶)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SQL子查询面试题及详细答案(零基础到进阶)说明:所有题目基于MySQL通用语法,适配80%以上互联网、传统行业面试场景,包含基础概念、易错点、实操题型、经典面试真题,答案简洁落地,可直接用于面试作答。默认测试表(所有题目通用):1、员工表emp(员工信息)字段:emp_id(员工ID)、emp_name(员工姓名)、dept_id(部门ID)、salary(薪资)、entry_time(入职时间)2、部门表dept(部门信息)字段:dept_id(部门ID)、dept_name(部门名称)、manager_id(部门经理ID)3、工资记录表salary_log字段:id、emp_id、salary、create_time一、基础概念面试题(必问)1、什么是子查询?子查询的执行顺序是什么?答案:子查询就是嵌套在另一条SQL语句中的查询语句,也叫嵌套查询,外层SQL称为父查询,内层嵌套的SQL就是子查询。执行顺序:先执行子查询,再执行父查询。子查询会先产出结果集,将结果作为父查询的查询条件、数据源、字段值,再完成父查询的逻辑。子查询可以嵌套多层,遵循由内到外的执行规则。2、子查询分为哪几类?各自特点是什么?答案:行业内最常用的分类方式:按是否依赖父查询分为普通子查询(非相关子查询)和相关子查询。1、普通子查询(非相关子查询)独立执行,不依赖父查询的任何字段,一次性执行完毕,结果供父查询使用。执行效率更高,日常开发优先使用。2、相关子查询子查询需要引用父查询的字段,无法独立执行。父查询每遍历一条数据,子查询就会执行一次,遍历完所有数据才结束,执行效率相对较低。补充:按返回结果还可分为标量子查询(返回单行单列)、行子查询(返回单行多列)、列子查询(返回多行单列)、表子查询(返回多行多列)。3、子查询常用的运算符有哪些?分别适用什么场景?答案:=、>、<、>=、<=:适用于标量子查询,子查询只能返回单个值IN:适用于子查询返回多行单列,匹配结果集中任意一个值EXISTS/NOTEXISTS:判断子查询是否有返回结果,只看有无数据,不关注具体值,效率高于INANY/SOME:匹配子查询结果中任意一个满足条件的值ALL:匹配子查询结果中所有值,需要全部满足条件4、IN和EXISTS的区别?面试高频易错点答案:1、执行逻辑不同IN:先执行子查询,拿到所有结果集后,父查询再逐行匹配筛选;EXISTS:父查询先遍历,每一条数据去匹配子查询,判断是否存在结果。2、效率差异子查询表数据量小、父查询表数据量大:优先用IN;子查询表数据量大、父查询表数据量小:优先用EXISTS;3、空值问题IN查询如果子查询结果包含NULL,会导致整体查询结果为空;EXISTS不受空值影响,稳定性更高。开发规范:尽量优先使用EXISTS,避免IN的空值坑和大数据量性能问题。二、基础实操面试题(手写SQL必考)1、查询所有员工所在的部门名称(子查询实现)解题思路:先通过员工表拿到所有部门ID,再通过部门表匹配部门名称,用IN子查询实现答案SQL:sql

SELECTdept_name

FROMdept

WHEREdept_idIN(SELECTDISTINCTdept_idFROMemp);2、查询薪资高于公司平均薪资的所有员工信息解题思路:子查询先计算全员平均薪资,父查询筛选薪资大于该值的员工答案SQL:sql

SELECT*

FROMemp

WHEREsalary>(SELECTAVG(salary)FROMemp);3、查询没有员工的部门ID和部门名称解题思路:遍历部门表,判断当前部门ID不存在于员工表中,用NOTEXISTS最优答案SQL:sql

SELECTdept_id,dept_name

FROMdeptd

WHERENOTEXISTS(SELECT1FROMempeWHEREe.dept_id=d.dept_id);补充:子查询写SELECT1比写SELECT*效率更高,无需查询字段,仅判断存在性。4、查询每个部门薪资最高的员工信息(经典分组子查询)答案SQL:sql

SELECTe.*

FROMempe

WHERE(dept_id,salary)IN(SELECTdept_id,MAX(salary)FROMempGROUPBYdept_id);说明:使用行子查询,匹配「部门ID+最高薪资」组合,精准筛选各部门高薪员工。三、进阶相关子查询面试题1、查询薪资大于本部门平均薪资的员工解题思路:核心考点:相关子查询。子查询需要依赖父查询的部门ID,逐部门计算平均薪资并匹配答案SQL:sql

SELECTe1.*

FROMempe1

WHEREe1.salary>(

SELECTAVG(salary)

FROMempe2

WHEREe2.dept_id=e1.dept_id

);2、查询所有部门经理的员工信息解题思路:部门表manager_id存储经理员工ID,子查询取出所有经理ID,匹配员工表答案SQL:sql

SELECT*

FROMemp

WHEREemp_idIN(SELECTDISTINCTmanager_idFROMdept);3、查询近3个月有薪资调整的员工姓名(子查询+时间筛选)答案SQL:sql

SELECTemp_name

FROMemp

WHEREemp_idIN(

SELECTDISTINCTemp_id

FROMsalary_log

WHEREcreate_time>DATE_SUB(NOW(),INTERVAL3MONTH)

);四、面试易错坑点问答题(加分项)1、子查询能不能用ORDERBY?答案:普通子查询不建议、多数场景不允许。子查询的结果是数据集,排序对父查询无意义,MySQL会直接忽略子查询的ORDERBY。只有一种场景可以用:子查询配合LIMIT分页时,必须加ORDERBY,用来精准筛选指定条数的数据。2、子查询可以嵌套多少层?答案:MySQL默认支持多层嵌套,理论上无硬性层数限制,但开发中禁止三层及以上嵌套。多层子查询会大幅降低SQL执行效率,可读性极差,生产环境一般用联表查询替代。3、标量子查询的报错场景是什么?答案:当使用=、>、<等对标量的运算符时,如果子查询返回多条数据,会直接报错:Subqueryreturnsmorethan1row。解决方案:改用IN、EXISTS,或增加LIMIT1限制子查询只返回单个值。4、子查询和JOIN联表查询的区别?开发中如何选择?答案:1、区别子查询:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论