MySQL面试SQL真题(含语句+详细答案·实战版)_第1页
MySQL面试SQL真题(含语句+详细答案·实战版)_第2页
MySQL面试SQL真题(含语句+详细答案·实战版)_第3页
MySQL面试SQL真题(含语句+详细答案·实战版)_第4页
MySQL面试SQL真题(含语句+详细答案·实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

MySQL面试SQL真题(含语句+详细答案·实战版)说明:所有题目均为互联网大厂、中小企业高频面试原题,无空洞理论,全部基于业务实战场景。附带测试表结构、可直接执行SQL、逐题解析,适合面试刷题、复盘。提前创建测试表(所有题目通用)sql

--员工表

CREATETABLEemp(

idINTPRIMARYKEYAUTO_INCREMENT,

nameVARCHAR(20)NOTNULLCOMMENT'员工姓名',

dept_idINTCOMMENT'部门ID',

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

hire_dateDATECOMMENT'入职时间'

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

--部门表

CREATETABLEdept(

dept_idINTPRIMARYKEYAUTO_INCREMENT,

dept_nameVARCHAR(20)NOTNULLCOMMENT'部门名称'

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

--插入测试数据

INSERTINTOdept(dept_name)VALUES('研发部'),('市场部'),('人事部'),('财务部');

INSERTINTOemp(name,dept_id,salary,hire_date)VALUES

('张三',1,8500,'2022-03-12'),

('李四',1,12000,'2021-05-20'),

('王五',2,7200,'2023-01-15'),

('赵六',3,6500,'2022-07-08'),

('孙七',1,9800,'2020-11-02'),

('周八',2,8800,'2021-09-30'),

('吴九',NULL,7500,'2022-08-22');一、基础查询高频题1、查询所有员工的姓名、薪资,薪资统一保留2位小数SQL语句:sql

SELECTname,ROUND(salary,2)ASsalaryFROMemp;详细答案解析:ROUND(字段,小数位数)是MySQL内置保留小数函数,业务中展示薪资、金额必须保留固定小数位。直接查询原始字段会出现多位小数,不符合展示规范。AS是字段别名,用于优化返回结果的字段名可读性。2、查询薪资在8000-12000之间的所有员工(包含边界值)SQL语句:sql

--写法1:betweenand(包含首尾)

SELECT*FROMempWHEREsalaryBETWEEN8000AND12000;

--写法2:条件判断(面试推荐,逻辑更清晰)

SELECT*FROMempWHEREsalary>=8000ANDsalary<=12000;详细答案解析:BETWEEN数值1AND数值2是闭区间查询,包含两个边界值。面试中建议两种写法都掌握,部分场景区间不规整时,使用&>=、<=灵活度更高。注意:BETWEENAND不适合日期模糊范围外的复杂判断。3、查询没有分配部门的员工(dept_id为NULL)SQL语句:sql

SELECT*FROMempWHEREdept_idISNULL;详细答案解析:重点面试坑点:NULL不能用=NULL判断。数据库中NULL代表空、未知,不是0、不是空字符串,只能用ISNULL/ISNOTNULL筛选。日常开发90%的新人BUG都出在这里。二、模糊查询与排序分页4、查询姓名包含“张”的员工SQL语句:sql

SELECT*FROMempWHEREnameLIKE'%张%';详细答案解析:LIKE模糊查询通配符说明:%代表任意任意字符(0个/多个);_代表单个字符。'%张%':匹配中间、开头、结尾包含张的名字;'张%':以张开头;'%张':以张结尾。注意:模糊查询前置%会失效索引,大数据量禁止使用。5、查询员工信息,按薪资降序排序,薪资相同按入职时间升序,取前5条数据SQL语句:sql

SELECT*FROMempORDERBYsalaryDESC,hire_dateASCLIMIT5;详细答案解析:ORDERBY排序规则:DESC降序(从大到小),ASC升序(从小到大,默认可省略)。多字段排序优先级:先排前面字段,前面字段值相同,再执行后面字段排序。LIMITn用于分页取前N条,是业务分页核心语法。三、分组聚合面试必考6、统计每个部门的员工人数、平均薪资、最高薪资、最低薪资SQL语句:sql

SELECT

dept_id,

COUNT(id)ASemp_count,

ROUND(AVG(salary),2)ASavg_salary,

MAX(salary)ASmax_salary,

MIN(salary)ASmin_salary

FROMemp

GROUPBYdept_id;详细答案解析:1、GROUPBY分组字段,查询字段只能是分组字段或聚合函数(面试高频考点);2、COUNT(id)统计有效数据,忽略NULL,比COUNT(*)性能更好;3、AVG/MAX/MIN是基础聚合函数,用于分组统计,是报表统计核心语法。7、查询员工人数大于2人的部门ID及人数(HAVING用法)SQL语句:sql

SELECTdept_id,COUNT(id)ASemp_count

FROMemp

GROUPBYdept_id

HAVINGemp_count>2;详细答案解析:核心区别(面试必问):WHERE是分组前过滤数据,不能识别聚合函数;HAVING是分组后过滤结果,可以使用聚合函数、别名。分组筛选必须用HAVING,不能用WHERE。四、联表查询(面试重中之重)8、查询所有员工的姓名、薪资、所属部门名称(INNERJOIN)SQL语句:sql

SELECT,e.salary,d.dept_name

FROMempe

INNERJOINdeptdONe.dept_id=d.dept_id;详细答案解析:INNERJOIN内连接:只查询两张表中匹配关联条件的数据,无部门的员工(dept_id为NULL)会被过滤。日常业务查询有效关联数据最常用。e、d是表别名,简化SQL书写,企业开发强制使用别名。9、查询所有员工信息及对应部门名称,无部门的员工也要展示(LEFTJOIN)SQL语句:sql

SELECT,e.salary,d.dept_name

FROMempe

LEFTJOINdeptdONe.dept_id=d.dept_id;详细答案解析:LEFTJOIN左连接:以左表(emp)为基准,左表所有数据全部展示,右表匹配不到数据则显示NULL。业务场景:需要展示全部主表数据,关联附表可选展示,是工作中使用最多的联表方式。10、查询所有部门及对应员工信息,无员工的部门也展示(RIGHTJOIN)SQL语句:sql

SELECTd.dept_name,,e.salary

FROMempe

RIGHTJOINdeptdONe.dept_id=d.dept_id;详细答案解析:RIGHTJOIN右连接:以右表为基准,右表数据全部展示,左表无匹配则为NULL。MySQL不支持FULLJOIN全连接,需要全连接可通过UNION拼接左连接+右连接实现。五、子查询经典面试题11、查询薪资高于平均薪资的所有员工SQL语句:sql

SELECT*FROMemp

WHEREsalary>(SELECTAVG(salary)FROMemp);详细答案解析:单行子查询:子查询只返回单个数值,作为外层查询的条件。执行顺序:先执行括号内子查询算出整体平均薪资,再执行外层查询筛选高薪员工。是面试最基础的子查询题型。12、查询研发部的所有员工信息SQL语句:sql

--子查询写法

SELECT*FROMemp

WHEREdept_id=(SELECTdept_idFROMdeptWHEREdept_name='研发部');

--联表写法(推荐,效率更高)

SELECTe.*FROMempe

JOINdeptdONe.dept_id=d.dept_id

WHEREd.dept_name='研发部';详细答案解析:子查询写法逻辑简单,但大数据量下联表查询索引效率更高。面试中建议两种写法都会,优先说明联表性能优势。六、经典难题(中级面试必问)13、查询每个部门薪资最高的员工信息SQL语句:sql

SELECTe.*

FROMempe

INNERJOIN(

SELECTdept_id,MAX(salary)ASmax_sal

FROMemp

GROUPBYdept_id

)tONe.dept_id=t.dept_idANDe.salary=t.max_sal;详细答案解析:解题思路:1、先分组查出每个部门的最高薪资;2、将查询结果作为临时表,和员工表联表匹配,拿到对应员工信息。这是面试高频难题,核心是分组统计+临时表联查,适配所有分组取最值场景。14、去除员工表重复薪资数据,只保留一条(去重查询)SQL语句:sql

SELECTDISTINCTsalaryFROMemp;详细答案解析:DISTINCT关键字用于字段去重,针对查询的所有字段组合去重。注意:DISTINCT会增加查询开销,大数据量慎用,优先通过业务逻辑规避重复数据。15、统计入职2年以内的新员工人数SQL语句:sql

SELECTCOUNT(id)ASnew_emp_count

FROMemp

WHEREhire_date>=DATE_SUB(CURDATE(),INTERVAL2YEAR);详细答案解析:CURDATE()获取当前日期;DATE_SUB(日期,间隔)日期减法函数。INTERVAL2YEAR代表2年,可替换为MONTH、DAY。是业务中统计新增数据、周期数据的核心函数。七、面试高频简答题(SQL原理)1、WHERE和HAVING的区别?答:WHERE在分组前过滤原始数据,不支持聚合函数;HAV

温馨提示

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

最新文档

评论

0/150

提交评论