SQL面试真题及详细答案(实操完整版)_第1页
SQL面试真题及详细答案(实操完整版)_第2页
SQL面试真题及详细答案(实操完整版)_第3页
SQL面试真题及详细答案(实操完整版)_第4页
SQL面试真题及详细答案(实操完整版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

SQL面试真题及详细答案(实操完整版)本次面试题适用于初级、中级开发、测试、数据岗位,涵盖SQL基础、查询进阶、联表、子查询、窗口函数、数据库优化等高频考点,所有题目均为企业真实面试原题,答案简洁实用、可直接落地执行。前置基础表说明(所有题目基于以下3张常用表)1.员工表emp(员工信息)字段:emp_id(员工ID,主键)、emp_name(员工姓名)、dept_id(部门ID)、salary(薪资)、hire_date(入职时间)、gender(性别)2.部门表dept(部门信息)字段:dept_id(部门ID,主键)、dept_name(部门名称)、dept_addr(部门地址)3.工资记录表salary_log(薪资变动记录)字段:id(主键)、emp_id(员工ID)、salary(变动后薪资)、change_time(变动时间)一、基础SQL查询(入门必考)1、查询所有入职时间在2024年的员工姓名、入职时间、薪资参考答案:sql

--方式1:函数筛选(通用)

SELECTemp_name,hire_date,salary

FROMemp

WHEREYEAR(hire_date)=2024;

--方式2:区间筛选(效率更高,可走索引)

SELECTemp_name,hire_date,salary

FROMemp

WHEREhire_dateBETWEEN'2024-01-01'AND'2024-12-31';解析:优先使用时间区间查询,避免对字段使用函数,导致索引失效,这是面试高频细节考点。2、查询薪资在8000-15000之间的男性员工,按薪资降序排序,薪资相同按入职时间升序参考答案:sql

SELECTemp_name,salary,hire_date,gender

FROMemp

WHEREsalary>=8000ANDsalary<=15000ANDgender='男'

ORDERBYsalaryDESC,hire_dateASC;解析:ORDERBY多字段排序规则:先按第一个字段排序,第一个字段值相同时,执行第二个字段排序。3、查询员工表中所有不重复的部门ID参考答案:sql

SELECTDISTINCTdept_idFROMemp;解析:DISTINCT用于去重,仅对查询字段生效,是基础去重核心关键字。二、分组聚合查询(高频核心)1、统计每个部门的员工人数、平均薪资、最高薪资、最低薪资参考答案:sql

SELECT

dept_id,

COUNT(emp_id)ASemp_num,--员工人数

ROUND(AVG(salary),2)ASavg_salary,--平均薪资(保留2位小数)

MAX(salary)ASmax_salary,--最高薪资

MIN(salary)ASmin_salary--最低薪资

FROMemp

GROUPBYdept_id;解析:GROUPBY分组后,SELECT后只能跟分组字段和聚合函数,不能单独查询非分组字段。2、查询员工人数大于3人的部门ID和员工人数参考答案:sql

SELECTdept_id,COUNT(emp_id)ASemp_num

FROMemp

GROUPBYdept_id

HAVINGCOUNT(emp_id)>3;重点考点:WHERE和HAVING区别1、WHERE:分组前过滤数据,不能使用聚合函数;2、HAVING:分组后过滤分组结果,专门用于聚合函数条件筛选。三、联表查询(面试重点)1、查询所有员工的姓名、所属部门名称、薪资(显示所有员工,无部门的显示为空)参考答案:sql

SELECTe.emp_name,d.dept_name,e.salary

FROMempe

LEFTJOINdeptdONe.dept_id=d.dept_id;解析:左连接(LEFTJOIN)保留左表(emp)所有数据,匹配不到右表数据则显示NULL,适配员工无部门的场景。2、查询存在员工的所有部门名称、部门人数(排除空部门)参考答案:sql

SELECTd.dept_name,COUNT(e.emp_id)ASemp_num

FROMdeptd

INNERJOINempeONd.dept_id=e.dept_id

GROUPBYd.dept_name;解析:内连接(INNERJOIN)只返回两张表中匹配成功的数据,自动过滤无员工的空部门。3、查询所有部门的名称、部门人数(无员工的部门人数显示0)参考答案:sql

SELECTd.dept_name,COUNT(e.emp_id)ASemp_num

FROMdeptd

LEFTJOINempeONd.dept_id=e.dept_id

GROUPBYd.dept_name;四、子查询与exists查询(进阶必考)1、查询薪资高于公司平均薪资的所有员工信息参考答案:sql

SELECT*FROMemp

WHEREsalary>(SELECTAVG(salary)FROMemp);解析:标量子查询,子查询仅返回单个数值,作为外层查询的条件依据。2、查询有薪资变动记录的员工姓名(用EXISTS实现)参考答案:sql

SELECTe.emp_name

FROMempe

WHEREEXISTS(

SELECT1FROMsalary_logs

WHEREs.emp_id=e.emp_id

);考点:EXISTS和IN的区别1、EXISTS:遍历外表,匹配内表数据,数据量大时效率更高;2、IN:先查询内表所有数据再匹配,小数据量适用;3、推荐生产环境优先用EXISTS。3、查询没有薪资变动记录的员工ID和姓名参考答案:sql

SELECTe.emp_id,e.emp_name

FROMempe

WHERENOTEXISTS(

SELECT1FROMsalary_logs

WHEREs.emp_id=e.emp_id

);五、常用函数实操题1、查询员工姓名、入职时间,入职时间格式化为「yyyy-MM-dd」参考答案:sql

SELECT

emp_name,

DATE_FORMAT(hire_date,'%Y-%m-%d')AShire_time

FROMemp;2、统计每个部门男女员工人数参考答案:sql

SELECT

dept_id,

SUM(CASEWHENgender='男'THEN1ELSE0END)ASmale_num,

SUM(CASEWHENgender='女'THEN1ELSE0END)ASfemale_num

FROMemp

GROUPBYdept_id;解析:CASEWHEN条件判断函数,是行转列、复杂统计的核心用法,面试高频。六、窗口函数(中级进阶必考)1、查询每个部门内薪资排名前三的员工信息(允许并列)参考答案:sql

WITHemp_rankAS(

SELECT

emp_id,emp_name,dept_id,salary,

DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrk

FROMemp

)

SELECT*FROMemp_rankWHERErk<=3;考点:三种排序函数区别1、RANK():并列排名会跳号(1、2、2、4);2、DENSE_RANK():并列排名不跳号(1、2、2、3);3、ROW_NUMBER():强制连续唯一排名(1、2、3、4)。2、查询每个员工的薪资及所在部门的平均薪资参考答案:sql

SELECT

emp_name,

salary,

AVG(salary)OVER(PARTITIONBYdept_id)ASdept_avg_salary

FROMemp;七、SQL优化面试简答题(高频问答)1、日常SQL优化的核心思路有哪些?参考答案:1、索引优化:高频查询、筛选、排序、分组字段建立索引,避免索引失效;2、避免全表扫描:禁止使用SELECT*,只查询需要的字段;3、优化查询条件:避免在索引字段上使用函数、运算、隐式转换;4、大表查询优化:大表禁止GROUPBY、ORDERBY全表操作,优先分页查询;5、联表优化:小表驱动大表,优先内连接,合理使用LEFTJOIN;6、避免冗余查询:优先使用EXISTS替代IN,减少子查询嵌套层数。2、哪些场景会导致索引失效?参考答案:1、索引字段使用函数、四则运算、逻辑运算;2、字符串字段未加引号,发生隐式类型转换;3、使用LIKE%xxx左模糊查询、%xxx%全模糊查询;4、OR连接的字段存在未建索引的字段;5、MySQL判断全表扫描比索引查询更快时,会自动放弃索引。3、LIMIT1000000,10分页查询为什么慢?如何优化?参考答案:原因:偏移量过大时,数据库需要先查询并跳过前100万条数据,再返回10条数据,IO开销极大。优化方案:1、用主键分页替代偏移分页(WHEREid>1000000LIMIT10);2、延迟关联,先分页查主键,再关联查询详情;3、业务层面限制深分页场景。4、INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLJOIN的区别?参考答案:1、INNERJOIN:内连接,只返回两张表匹配成功的数据;2、LEFTJOIN:左连接,保留左表全部数据,匹配右表数据,无匹配则NULL;3、RIGHTJOIN:右连接,保留右表全部数据,匹配左表数据,无匹配则NULL;4、FULLJOIN:全连接,保留两张表所有数据,互相匹配,无匹配则NULL(MySQL不支持,可用UNION替代)。八、经典实操难题(面试拔高题)1、删除员工表中重复的姓名,只保留入职时间最早的一条数据参考答案:sql

DELETEe1

FROMempe1

JOINempe2

ONe1.emp_name=e2.emp_name

ANDe1.hire_date>e2.hire_date;

温馨提示

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

评论

0/150

提交评论