SQL经典面试题及详细答案(企业高频完整版)_第1页
SQL经典面试题及详细答案(企业高频完整版)_第2页
SQL经典面试题及详细答案(企业高频完整版)_第3页
SQL经典面试题及详细答案(企业高频完整版)_第4页
SQL经典面试题及详细答案(企业高频完整版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

SQL经典面试题及详细答案(企业高频完整版)本套题库整理互联网、传统软件、数据岗位高频SQL面试题,涵盖入门、进阶、优化核心考点,所有题目附可直接运行的SQL答案+思路解析,贴合真实面试场景,无冗余理论,侧重实战落地。通用测试表说明(所有题目共用)为方便练习,统一使用三张经典测试表,提前建表插入数据,所有题目SQL均可直接执行:sql

--员工表

CREATETABLEemp(

emp_idINTPRIMARYKEYCOMMENT'员工编号',

emp_nameVARCHAR(20)COMMENT'员工姓名',

dept_idINTCOMMENT'部门编号',

salaryDECIMAL(10,2)COMMENT'薪资',

hire_dateDATECOMMENT'入职时间'

);

--部门表

CREATETABLEdept(

dept_idINTPRIMARYKEYCOMMENT'部门编号',

dept_nameVARCHAR(20)COMMENT'部门名称',

locationVARCHAR(20)COMMENT'部门地点'

);

--工资等级表

CREATETABLEsal_level(

level_idINTPRIMARYKEYCOMMENT'等级编号',

min_salDECIMAL(10,2)COMMENT'最低薪资',

max_salDECIMAL(10,2)COMMENT'最高薪资'

);

--测试数据

INSERTINTOdeptVALUES(10,'研发部','北京'),(20,'市场部','上海'),(30,'人事部','广州'),(40,'财务部','深圳');

INSERTINTOempVALUES

(1,'张三',10,8000,'2022-01-15'),

(2,'李四',10,12000,'2021-05-20'),

(3,'王五',20,9000,'2022-03-10'),

(4,'赵六',30,7000,'2023-02-08'),

(5,'孙七',10,15000,'2020-11-01'),

(6,'周八',20,11000,'2021-08-12'),

(7,'吴九',NULL,6000,'2023-05-20');

INSERTINTOsal_levelVALUES(1,5000,7000),(2,7001,10000),(3,10001,15000);一、SQL基础查询(入门必问)1、查询所有研发部员工的姓名、薪资、入职时间解题思路:关联员工表和部门表,通过部门名称筛选研发部数据。sql

SELECTe.emp_name,e.salary,e.hire_date

FROMempe

JOINdeptdONe.dept_id=d.dept_id

WHEREd.dept_name='研发部';2、查询薪资在8000-12000之间的员工,包含边界值解题思路:BETWEENAND包含上下边界,也可使用>=和<=书写。sql

--写法1:简洁写法

SELECTemp_name,salaryFROMempWHEREsalaryBETWEEN8000AND12000;

--写法2:通用严谨写法

SELECTemp_name,salaryFROMempWHEREsalary>=8000ANDsalary<=12000;3、查询没有分配部门的员工信息解题思路:NULL值判断只能用ISNULL,不能用=NULL,NULL不等于任何值。sql

SELECT*FROMempWHEREdept_idISNULL;4、查询员工姓名包含“张”的员工信息解题思路:模糊查询,%代表任意多个字符,_代表单个字符。sql

SELECT*FROMempWHEREemp_nameLIKE'%张%';二、分组聚合题型(面试高频)1、统计每个部门的员工人数、平均薪资、最高薪资、最低薪资解题思路:按部门分组,使用COUNT、AVG、MAX、MIN聚合函数,注意NULL部门单独分组统计。sql

SELECT

dept_id,

COUNT(emp_id)ASemp_count,

ROUND(AVG(salary),2)ASavg_sal,

MAX(salary)ASmax_sal,

MIN(salary)ASmin_sal

FROMemp

GROUPBYdept_id;2、查询员工人数大于2人的部门编号及员工人数解题思路:分组后筛选条件用HAVING,WHERE是分组前筛选,HAVING是分组后筛选。sql

SELECTdept_id,COUNT(emp_id)ASemp_count

FROMemp

GROUPBYdept_id

HAVINGCOUNT(emp_id)>2;重点区别:WHERE过滤原始数据,不能用聚合函数;HAVING过滤分组后的结果,可使用聚合函数。3、查询平均薪资大于9000的部门名称、平均薪资解题思路:先关联两张表,再分组、聚合、筛选。sql

SELECT

d.dept_name,

ROUND(AVG(e.salary),2)ASavg_sal

FROMempe

JOINdeptdONe.dept_id=d.dept_id

GROUPBYd.dept_name

HAVINGAVG(e.salary)>9000;三、多表关联查询(核心必考)1、查询所有部门的员工人数,无员工的部门显示0解题思路:左连接,以部门表为左表,匹配不到员工数据则补空,COUNT统计时指定员工编号避免统计空值。sql

SELECT

d.dept_id,

d.dept_name,

COUNT(e.emp_id)ASemp_count

FROMdeptd

LEFTJOINempeONd.dept_id=e.dept_id

GROUPBYd.dept_id,d.dept_name;2、查询所有员工的姓名、部门名称、薪资等级解题思路:三表关联,通过薪资区间匹配工资等级。sql

SELECT

e.emp_name,

d.dept_name,

sl.level_id

FROMempe

LEFTJOINdeptdONe.dept_id=d.dept_id

LEFTJOINsal_levelslONe.salaryBETWEENsl.min_salANDsl.max_sal;3、查询没有员工的部门信息解题思路:左连接后,员工编号为空即为无员工部门。sql

SELECTd.*

FROMdeptd

LEFTJOINempeONd.dept_id=e.dept_id

WHEREe.emp_idISNULL;四、子查询与exists题型(进阶高频)1、查询薪资高于公司平均薪资的员工信息解题思路:子查询先算出全局平均薪资,再作为筛选条件。sql

SELECT*FROMemp

WHEREsalary>(SELECTAVG(salary)FROMemp);2、查询研发部中薪资最高的员工sql

SELECT*FROMemp

WHEREdept_id=(SELECTdept_idFROMdeptWHEREdept_name='研发部')

ANDsalary=(SELECTMAX(salary)FROMempWHEREdept_id=10);3、EXISTS用法:查询存在员工的部门解题思路:EXISTS判断子查询是否有结果,有则保留外层数据,效率高于IN,适合大数据量。sql

SELECT*FROMdeptd

WHEREEXISTS(SELECT1FROMempeWHEREe.dept_id=d.dept_id);IN和EXISTS区别:IN会遍历匹配所有数据,大数据量效率低;EXISTS找到匹配项即终止判断,性能更优。五、排序、去重与分页1、按薪资降序排序,薪资相同按入职时间升序排序sql

SELECT*FROMempORDERBYsalaryDESC,hire_dateASC;2、查询薪资排名前3的员工(包含并列薪资)解题思路:普通LIMIT无法处理并列,使用窗口函数实现排名。sql

WITHemp_rankAS(

SELECT*,DENSE_RANK()OVER(ORDERBYsalaryDESC)ASrk

FROMemp

)

SELECTemp_name,salaryFROMemp_rankWHERErk<=3;3、分页查询:第2页数据,每页3条解题思路:LIMIT偏移量,条数,第一页偏移量为0,第二页为3。sql

SELECT*FROMempORDERBYemp_idLIMIT3,3;六、窗口函数专项(中高级面试必问)1、查询每个部门内员工的薪资排名(并列排名,不跳号)解题思路:DENSE_RANK分组排名,同薪资同排名,后续不跳号;RANK会跳号,ROW_NUMBER连续不重复。sql

SELECT

emp_name,

dept_id,

salary,

DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASsal_rk

FROMemp;2、统计每个部门的薪资累计总和sql

SELECT

emp_name,

dept_id,

salary,

SUM(salary)OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASsum_sal

FROMemp;七、经典场景难题(面试压轴题)1、删除员工表中重复数据(保留最新一条)场景说明:假设存在同名员工,保留入职时间最晚的记录,删除重复旧数据。sql

DELETEe1FROMempe1

JOINempe2

ONe1.emp_name=e2.emp_name

ANDe1.hire_date<e2.hire_date;2、查询每个部门薪资第二高的员工sql

WITHemp_rkAS(

SELECT

emp_name,

dept_id,

salary,

DENSE_RANK()OVER(PARTITIONBYdept_idORDERBYsalaryDESC)ASrk

FROMemp

)

SELECTemp_name,dept_id,salaryFROMemp_rkWHERErk=2;八、SQL优化面试题(理论+实战)1、什么场景不适合建立索引?1、数据量极少的表,索引维护成本高于查询收益;2、频繁增删改的表,索引会大幅降低写入效率;3、字段重复度极高(如性别、状态),索引无法过滤有效数据;4、NULL值过多的字段,索引利用率极低。2、索引失效的常见场景?1、WHERE条件中对索引字段使用函数、运算(如DATE(hire_date)、salary+1);2、模糊查询以%开头(如%张三);3、字符串字段未加引号,隐式类型转换;4、OR前后字段未全部建立索引;5、MySQL优化器判断全表扫描效率更高,主动放弃索引。3、LEFTJOIN和INNERJOIN效率区别?

温馨提示

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

评论

0/150

提交评论