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

下载本文档

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

文档简介

SQL面试50题(含详细实战答案)本套题目覆盖SQL基础、查询进阶、联表查询、子查询、聚合分组、窗口函数、索引、事务、数据库优化、经典场景实操等企业高频考点,答案贴合真实面试答题逻辑,通俗易懂、实用性强。一、SQL基础概念(1-10题)1、SQL分为哪几类?分别说明作用答:主要分为四类,是数据库操作的核心分类:1.DDL(数据定义语言):用于定义和管理数据库、表、字段结构,核心语句:CREATE、ALTER、DROP、TRUNCATE;2.DML(数据操作语言):用于操作表中数据,核心语句:SELECT、INSERT、UPDATE、DELETE;3.DCL(数据控制语言):用于权限管理,核心语句:GRANT、REVOKE;4.TCL(事务控制语言):用于管理事务,核心语句:COMMIT、ROLLBACK、SAVEPOINT。2、DELETE、TRUNCATE、DROP的区别?答:三者核心区别在操作对象、日志记录、效率、可恢复性:1.DELETE:删除表中部分/全部数据,属于DML,会记录事务日志,可回滚,不删除表结构,自增主键不会重置;2.TRUNCATE:清空整张表数据,属于DDL,日志记录极少,执行效率极高,不可回滚,保留表结构,会重置自增主键;3.DROP:删除整张表,包括数据、表结构、索引、约束,属于DDL,不可回滚,彻底释放表占用的存储空间。3、CHAR和VARCHAR的区别?答:1.CHAR是固定长度,VARCHAR是可变长度;2.CHAR存储效率高、查询速度快,但会占用多余存储空间,适合手机号、身份证等固定长度数据;3.VARCHAR按需分配存储空间,节省资源,适合姓名、备注等长短不一的数据;4.旧版本数据库中CHAR会自动补空格,VARCHAR不会。4、INT和BIGINT的区别?使用场景?答:INT为4字节整型,取值范围约-21亿~21亿,适合普通业务ID、数量、年龄等数据;BIGINT为8字节整型,取值范围极大,适合订单ID、用户ID、日志ID等数据量大、自增数值会超限的场景,互联网业务主键基本都用BIGINT。5、主键、唯一索引、普通索引的区别?答:1.主键:非空且唯一,一张表只能有一个主键,默认自带主键索引,不允许为空值;2.唯一索引:字段值唯一不重复,允许存在一个空值,一张表可以有多个唯一索引;3.普通索引:仅用于提升查询效率,字段值可重复、可空,无唯一性约束。6、什么是主键自增?自增主键的优缺点?答:主键自增是数据库自动为新增数据生成递增的主键数值,无需手动赋值。优点:查询、排序、联表查询效率高,索引结构紧凑,插入速度快;缺点:高并发场景下会产生主键竞争、锁等待问题,分库分表时容易出现主键冲突,安全性较差,容易被猜测数据量。7、NULL和空字符串''的区别?答:1.NULL代表未知、无值,空字符串是确定的空字符值;2.查询判断方式不同:NULL只能用ISNULL/ISNOTNULL判断,空字符串可以用=''判断;3.NULL不占用存储空间,空字符串会占用少量存储空间;4.聚合函数中,NULL会被忽略,空字符串会参与统计。8、数据库三大范式是什么?答:1.第一范式(1NF):字段具有原子性,不可再拆分,所有列都是单一值;2.第二范式(2NF):在1NF基础上,消除部分依赖,非主键字段完全依赖主键;3.第三范式(3NF):在2NF基础上,消除传递依赖,非主键字段不依赖其他非主键字段。核心目的:减少数据冗余,保证数据一致性,避免更新、删除异常。9、什么是冗余字段?为什么业务中会反范式设计?答:冗余字段是指可以通过其他字段计算、关联查询得到,但额外存储在表中的字段。范式优先保证数据严谨性,反范式优先保证查询性能。业务中适当冗余可以减少联表查询、降低SQL复杂度、提升查询速度,适合高并发、高查询量的业务场景,只需做好数据同步更新即可。10、MySQL中InnoDB和MyISAM引擎的区别?答:1.InnoDB:支持事务、行锁、外键、MVCC,数据安全性高,适合增删改频繁的业务,默认引擎;2.MyISAM:不支持事务、行锁、外键,只支持表锁,查询速度快,全文索引支持好,适合静态数据、只读场景,崩溃后无法安全恢复数据。二、基础查询与函数(11-25题)11、SELECT语句的完整执行顺序?答:执行顺序严格固定,是写SQL的核心基础:FROM->WHERE->GROUPBY->HAVING->SELECT->DISTINCT->ORDERBY->LIMIT重点:WHERE在分组前过滤,HAVING在分组后过滤;ORDERBY最后执行,可使用别名。12、WHERE和HAVING的区别?答:1.执行时机不同:WHERE分组前过滤原始数据,HAVING分组后过滤分组结果;2.支持函数不同:WHERE不能使用聚合函数(SUM、COUNT等),HAVING可以使用聚合函数;3.执行效率:优先用WHERE过滤无效数据,减少分组数量,提升整体效率,HAVING仅用于分组后筛选。13、DISTINCT的作用及使用注意事项?答:作用是去除查询结果中的重复数据,返回唯一值。注意:DISTINCT作用于后面所有字段,不是只针对第一个字段;多字段去重时,只有所有字段值全部相同才会去重;大量数据下DISTINCT效率较低,可通过分组替代。14、LIMIT的用法?分页查询如何写?答:LIMIT用于限制查询结果条数,语法:LIMIT偏移量,条数。常规分页:查询第N页,每页M条数据,语句为:SELECT*FROM表名LIMIT(N-1)*M,M;大数据分页偏移量过大会变慢,可通过主键索引优化。15、COUNT(*)、COUNT(1)、COUNT(字段)的区别?答:1.COUNT(*):统计所有行数,包含NULL值、重复数据,不会忽略任何行;2.COUNT(1):效果和COUNT(*)基本一致,统计全部行数,性能几乎无差异;3.COUNT(字段):统计该字段非空的行数,会自动忽略字段为NULL的数据,不统计空值。16、SUM、AVG聚合函数对NULL的处理方式?答:SUM求和、AVG求平均值时,会直接忽略字段为NULL的数据,只统计有效数值。注意:空字符串、0会正常参与计算,仅NULL被忽略。17、GROUPBY分组规则?分组后SELECT字段有什么要求?答:GROUPBY按照指定字段相同值进行合并分组。严格模式下,分组后SELECT后面只能写分组字段和聚合函数,不能写普通非分组字段,否则会报错,避免数据匹配混乱。18、ORDERBY排序默认规则?如何处理空值排序?答:默认升序ASC排序,NULL值在升序中排在最前面,降序DESC中排在最后面。如需自定义空值位置,可通过IFNULL、COALESCE函数对空值赋值后再排序。19、LIKE模糊查询%、_的区别?有什么性能问题?答:%代表任意多个任意字符,_代表单个任意字符。性能问题:前置模糊查询(%xxx、_xxx)会导致索引失效,触发全表扫描,大数据量下效率极低;后置模糊查询(xxx%)可以走索引。20、IN和EXISTS的区别?适用场景?答:1.IN是先执行子查询,将结果集合缓存,主查询匹配集合数据;子查询结果集小时IN效率高;2.EXISTS是主查询逐行遍历,再匹配子查询是否存在数据,返回布尔值;子查询结果集大、主查询数据少时EXISTS效率更高;3.IN可能出现重复数据,EXISTS不会产生重复,且NULL值处理更严谨。21、NOTIN和NOTEXISTS的坑点?答:NOTIN子查询结果中如果存在NULL,会查询不到任何数据,属于语法陷阱;NOTEXISTS不存在该问题,逻辑更严谨,日常开发中优先使用NOTEXISTS做反向匹配。22、CASEWHEN的用法及场景?答:CASEWHEN是条件判断函数,可实现多条件分支判断,常用于字段值转换、数据分类、统计汇总。示例:统计订单状态,1为已支付,2为待支付,3为已取消,可通过CASEWHEN批量替换展示文本,也可结合SUM实现行转列统计。23、IF和IFNULL函数的作用?答:IF(条件,值1,值2):条件成立返回值1,不成立返回值2,用于简单二分支判断;IFNULL(字段,默认值):如果字段为NULL,返回默认值,否则返回字段原值,常用于统一空值展示、避免计算出错。24、常用日期函数有哪些?答:NOW()获取当前时间、CURDATE()获取当前日期、DATE()截取日期、DATEDIFF()计算日期差、DATE_ADD()日期加值、DATE_SUB()日期减值、YEAR/MONTH/DAY截取年月日。25、字符串常用函数有哪些?答:CONCAT字符串拼接、SUBSTRING字符串截取、LENGTH获取长度、UPPER/LOWER大小写转换、TRIM去除首尾空格、REPLACE替换指定字符。三、联表与子查询(26-35题)26、MySQL五种联表查询的区别?答:1.INNERJOIN(内连接):只返回两张表中匹配成功的数据,交集数据;2.LEFTJOIN(左连接):以左表为基准,返回左表所有数据,右表无匹配则显示NULL;3.RIGHTJOIN(右连接):以右表为基准,返回右表所有数据,左表无匹配则显示NULL;4.FULLJOIN(全连接):返回两张表所有数据,无匹配则补NULL(MySQL不支持,可通过UNION模拟);5.CROSSJOIN(交叉连接):笛卡尔积连接,无关联条件,返回两表数据乘积,业务中基本不用。27、LEFTJOIN后加WHERE和AND的区别?答:1.ON后AND条件:只过滤关联的右表数据,不会影响左表数据,左表数据会全部保留;2.关联后WHERE条件:是对联表后的整体结果过滤,会筛选掉左表不满足条件的数据,等同于内连接效果。28、什么是笛卡尔积?如何避免?答:联表查询时没有写关联条件,或关联条件失效,导致两张表所有数据两两匹配,产生海量无效数据,就是笛卡尔积。避免方式:联表必须添加精准的关联条件,禁止无条件联表,多表联表逐一添加关联关系。29、子查询分为哪几类?答:1.标量子查询:子查询返回单行单列单个值;2.行子查询:返回单行多列值;3.列子查询:返回多行单列值;4.表子查询:返回多行多列结果集,可当作临时表使用。30、关联子查询和普通子查询的区别?答:普通子查询独立执行,先执行子查询再执行主查询,子查询只执行一次;关联子查询依赖主查询的字段,主查询每遍历一行,子查询就执行一次,数据量大时效率较低,可优化为联表查询。31、UNION和UNIONALL的区别?答:1.UNION会自动去除重复数据,同时排序,效率低;2.UNIONALL直接拼接所有结果,不去重、不排序,效率极高;3.业务中无去重需求时,优先使用UNIONALL。32、UNION查询的注意事项?答:1.前后查询的字段数量必须一致;2.对应字段的数据类型需要兼容;3.最终结果的字段名以前面查询的字段名为准;4.排序分页需作用于整体结果,不能单独对单段查询排序。33、多表联表查询的优化原则?答:1.小表驱动大表,数据量小的表作为左表;2.关联字段必须建立索引;3.先过滤、后关联,通过WHERE提前减少数据量;4.禁止使用SELECT*,只查询需要的字段;5.避免多层嵌套子查询,优先改写JOIN联表。34、什么是临时表?使用场景?答:临时表是会话级别的临时数据表,会话结束后自动销毁,仅当前会话可见。场景:复杂统计、多层数据处理、拆分复杂SQL、批量数据临时存储,简化复杂查询逻辑。35、视图的作用和优缺点?答:视图是虚拟表,不存储真实数据,本质是封装好的查询语句。优点:简化复杂查询、控制数据权限、统一查询逻辑、屏蔽表结构变更;缺点:无法优化底层SQL、查询存在层级损耗、不适合高频复杂统计、更新数据存在限制。四、窗口函数与高级SQL(36-40题)36、什么是窗口函数?和普通聚合函数的区别?答:窗口函数可以在不合并多行数据的前提下,实现分组统计,保留每一行原始数据,同时展示统计结果。普通聚合函数GROUPBY会将多行合并为一行,丢失原始明细数据;窗口函数分组后不合并数据,明细和统计数据共存。37、ROW_NUMBER、RANK、DENSE_RANK的区别?答:1.ROW_NUMBER:连续序号,无论值是否相同,序号依次递增,无重复、无空缺;2.RANK:排名相同序号相同,后续序号空缺,适合常规排名场景;3.DENSE_RANK:排名相同序号相同,后续序号连续无空缺,适合密集排名场景。38、OVER()中PARTITIONBY和ORDERBY的作用?答:PARTITIONBY用于指定分组窗口,相当于分组,不同分组独立计算;ORDERBY用于窗口内排序,配合排名、累加函数实现有序统计,不加排序默认统计分组全部数据。39、常用窗口函数有哪些?业务场景?答:排名类:ROW_NUMBER、RANK、DENSE_RANK,用于成绩排名、销售额排名、取每组第一条数据;聚合类:SUM/AVG/MAXOVER(),用于分组累加、平均值统计、分组最大值;位移类:LAG、LEAD,用于查询上一行、下一行数据,对比环比数据。40、如何取分组后每组的最新一条数据?答:通过窗口函数ROW_NUMBER(),按照业务维度分组、时间倒序排序,筛选序号为1的数据,即可精准获取每组最新数据,是企业通用最优方案。五、索引、事务与优化(41-50题)41、索引的作用?优缺点?答:索引是数据库的目录结构,核心作用是大幅提升查询效率。优点:加快查询、排序、分组、联表查询速度;缺点:占用磁盘空间,增删改数据时需要同步更新索引,降低写入效率,索引过多会严重影响写入性能。42、B+树索引的特点?为什么用B+树?答:特点:非叶子节点只存索引键,叶子节点存储全部数据,所有叶子节点有序双向链表串联。优势:层级少、查询速度稳定,支持范围查询、排序查询,磁盘IO次数少,适配数据库高频的范围检索场景,比二叉树、B树更适合海量数据查询。43、联合索引的最左匹配原则?答:联合索引遵循最左前缀匹配规则,查询条件需要匹配索引最左侧字段,才能触发索引生效。例如索引(a,b,c),查询a、a+b、a+b+c可走索引;查询b、c、b+c无法触发索引,会失效。日常建索引需要将高频查询字段放左侧。44、哪些情况会导致索引失效?答:1.违背最左匹配原则;2.索引字段使用函数、运算、类型转换;3.前置模糊查询%xxx;4.OR连接非索引字段;5.数据库判断全表扫描比索引查询更快,自动放弃索引;6.NULL值判断、隐式类型转换。45、覆盖索引是什么?优势?答:查询需要的所有字段全部包含在索引中,无需回表查询原始数据,就是覆盖索引。优势:避免回表IO操作,大幅提升查询效率,是日常SQL优化的核心手段。46、数据库事务四大特性ACID?答:1.原子性(A):事务要么全部执行成功,要么全部回滚,

温馨提示

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

评论

0/150

提交评论