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

下载本文档

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

文档简介

OracleSQL高频面试题及详细答案(实战版)本套面试题精选企业实操高频考点,涵盖SQL基础、查询优化、函数使用、联表查询、子查询、索引、事务、分页、数据库特性等核心内容,答案贴合工作实战,规避理论空话,适合面试刷题、技术复盘。一、基础语法类(入门高频)1、简述Oracle中SELECT语句的完整执行顺序?答案:完整执行顺序(从先到后):FROM→WHERE→GROUPBY→HAVING→SELECT→DISTINCT→ORDERBY→ROWNUM详细解析:1.先通过FROM确定查询数据源(表、视图、联表结果);2.WHERE筛选单条数据,过滤不符合条件的记录,无法过滤聚合结果;3.GROUPBY对筛选后的数据进行分组;4.HAVING过滤分组后的聚合数据,专门配合分组函数使用;5.SELECT筛选需要展示的字段、执行字段计算、调用函数;6.DISTINCT对查询结果去重;7.ORDERBY对最终结果排序;8.ROWNUM截取指定行数数据。核心注意:ORDERBY是最后执行的排序动作,因此ROWNUM分页必须嵌套排序,否则分页数据错乱。2、WHERE和HAVING的区别是什么?答案:1.执行时机不同:WHERE在分组前过滤数据行,HAVING在分组后过滤分组结果;2.支持函数不同:WHERE不能使用聚合函数(SUM、COUNT、MAX等),HAVING专门用于过滤聚合函数结果;3.适用场景不同:普通字段条件筛选用WHERE,分组后的统计结果筛选用HAVING;4.效率不同:WHERE优先过滤数据,减少后续分组计算的数据量,效率更高;HAVING必须先完成分组统计再过滤,性能相对更低。实战示例:PlainText

--查询部门人数大于3人的部门

SELECTdept_id,COUNT(*)user_num

FROMuser_info

WHEREstatus=1--先筛选有效用户

GROUPBYdept_id

HAVINGCOUNT(*)>3;3、Oracle中IN、EXISTS、JOIN的区别和使用场景?答案:1.IN:将子查询结果作为集合,主表逐行匹配集合数据。适用:子查询结果集小、数据量少的场景;子查询结果为空时,主查询无数据。大数据量下效率极差。2.EXISTS:外层查询逐行遍历,内层子查询做匹配判断,找到匹配数据立即终止当前行匹配。适用:子查询数据量大、主表数据少的场景,大数据量下远优于IN。3.JOIN(联表查询):通过关联字段直接关联两张表,基于索引匹配数据。适用:需要查询多张表字段、数据量大的场景,是企业开发首选,性能最优。核心总结:小数据用IN,大数据用EXISTS,多表查字段必用JOIN。二、Oracle特有语法(面试重点)1、讲解ROWNUM和ROWID的区别?答案:1.ROWID是数据表记录的物理唯一地址,每条数据的ROWID固定不变,是数据库存储数据的物理标识,不属于表字段,可直接查询。特性:唯一、固定、查询速度极快,常用于快速去重、精准定位数据。2.ROWNUM是查询结果的虚拟行号,动态生成,每次查询结果不同,排序后行号会重新分配。特性:动态变化、仅支持<、<=、=1,不支持>、>=、=大于1的判断,是Oracle分页核心语法。实战去重示例(ROWID)PlainText

--删除重复数据,保留最新一条

DELETEFROMuser_infoa

WHEREa.ROWID<(SELECTMAX(ROWID)FROMuser_infobWHEREa.phone=b.phone);2、Oracle标准分页语句怎么写?为什么不能直接用ROWNUM>10?答案:ROWNUM是动态生成的虚拟行号,查询时逐行分配,不存在ROWNUM>10的数据,因此直接写该条件查询不到结果。正确分页方式:嵌套子查询,先排序生成固定行号,再截取数据。标准分页语法(查询第11-20条数据)PlainText

SELECT*FROM(

SELECTt.*,ROWNUMrnFROM(

SELECT*FROMuser_infoORDERBYcreate_timeDESC--必须内层排序

)tWHEREROWNUM<=20

)WHERErn>10;3、Oracle中DECODE和CASEWHEN的区别?答案:1.DECODE:Oracle独有函数,语法简洁,仅支持等值判断,不支持区间、大于小于判断。语法:DECODE(字段,值1,结果1,值2,结果2,默认值)2.CASEWHEN:通用标准语法,支持等值、区间、多条件复杂判断,可读性更强,兼容性更好。实战示例PlainText

--DECODE等值判断

SELECTDECODE(status,1,'正常',2,'禁用','未知')FROMuser_info;

--CASEWHEN复杂判断

SELECTCASE

WHENscore>=90THEN'优秀'

WHENscore>=60THEN'及格'

ELSE'不及格'END

FROMexam_score;三、联表与子查询类1、Oracle常用联表方式有哪些?区别是什么?答案:1.INNERJOIN(内连接):只返回两张表中关联字段匹配成功的数据,取交集。2.LEFTJOIN(左连接):以左表为主,左表数据全部展示,右表无匹配数据显示为空。3.RIGHTJOIN(右连接):以右表为主,右表数据全部展示,左表无匹配数据显示为空。4.FULLJOIN(全连接):展示两张表所有数据,无匹配字段显示为空。工作常用场景:90%业务场景使用LEFTJOIN,保证主表数据不丢失。2、什么是关联子查询?和普通子查询的区别?答案:1.普通子查询:子查询独立执行,执行完成后将结果传给外层查询,只执行一次。2.关联子查询:子查询引用外层查询的表字段,外层每遍历一行数据,子查询就执行一次,性能较低。实战示例(关联子查询)PlainText

--查询每个部门的最新入职员工

SELECTname,dept_id,create_time

FROMuser_infoa

WHEREcreate_time=(SELECTMAX(create_time)FROMuser_infobWHEREa.dept_id=b.dept_id);四、函数与数据处理类1、Oracle中NVL、NVL2、NULLIF函数用法?答案:1.NVL(字段,默认值):字段为空则返回默认值,不为空返回原值,最常用空值处理函数。示例:NVL(score,0)分数为空赋值0。2.NVL2(字段,非空值,空值):字段非空返回第一个值,字段为空返回第二个值。示例:NVL2(score,'已考试','缺考')。3.NULLIF(值1,值2):值1等于值2则返回空,否则返回值1。常用于剔除默认空数据。2、Oracle分组聚合函数注意事项?GROUPBY报错常见原因?答案:核心规则:SELECT后的非聚合字段,必须全部出现在GROUPBY后。常见报错场景:1.查询字段包含普通字段,未写入GROUPBY;2.GROUPBY字段和查询字段大小写、格式不一致;3.聚合函数混用WHERE条件(需改用HAVING)。五、索引与优化类(进阶高频)1、Oracle常用索引类型及适用场景?答案:1.B树索引(默认):最常用,适用于等值、范围查询(>、<、BETWEEN),普通字段优先创建。2.唯一索引:保证字段数据唯一,无重复值,适用于手机号、身份证、账号等字段。3.复合索引:多个字段联合索引,遵循最左前缀原则,适用于多字段联合查询场景。4.函数索引:适用于字段经常被函数包裹查询的场景,如UPPER(name)、TRIM(phone)。5.位图索引:适用于字段基数低、重复值多的字段(如性别、状态),OLAP统计场景使用,OLTP业务不推荐。2、索引失效的常见场景(面试必问)?答案:1.索引字段使用函数、运算(如SUBSTR、+、-、||拼接);2.隐式类型转换(字段是字符型,查询传数字;或字段数字型传字符);3.使用!=、<>、NOTIN、ISNOTNULL反向查询;4.LIKE模糊查询以%开头(如%张三);5.复合索引不满足最左前缀原则,跳过前置索引字段;6.数据表数据量过小、索引碎片化严重、统计信息过期;7.OR连接的字段存在无索引字段。3、什么是最左前缀原则?复合索引如何创建更合理?答案:复合索引遵循从左到右依次匹配的规则,查询条件必须包含索引最左侧字段,索引才会生效,跳过左侧字段、仅查右侧字段索引失效。索引创建优先级:高频等值查询字段在前、范围查询字段在后、排序分组字段最后。示例:索引(dept_id,status,create_time),仅查status索引失效,查dept_id+status索引生效。六、事务与数据库特性1、Oracle事务的四大特性(ACID)?答案:1.原子性(Atomicity):事务要么全部执行成功,要么全部回滚,不可部分执行;2.一致性(Consistency):事务执行前后,数据库数据状态保持一致,无数据异常;3.隔离性(Isolation):多个事务并发执行时,相互独立互不干扰;4.持久性(Durability):事务提交成功后,数据永久落地,断电、重启不丢失。2、Oracle事务默认隔离级别?有哪些隔离级别?答案:Oracle默认隔离级别:读已提交(READCOMMITTED)。支持的隔离级别:读未提交、读已提交、可重复读、串行化。核心特点:读已提交级别下,能避免脏读,会出现不可重复读、幻读,是企业最常用级别,兼顾性能和数据安全。七、实操手写SQL题(面试手撕题)1、手写SQL:查询每个部门的员工人数、最高工资、最低工资答案:PlainText

SELECT

dept_id,

COUNT(*)user_total,

MAX(salary)max_salary,

MIN(salary)min_salary

FROMuser_info

GROUPBYdept_id

ORDERBYuser_totalDESC;2、手写SQL:删除表中重复数据,保留ID最大的一条答案:PlainText

DELETEFROMuser_infoa

WHEREa.id<(SELECTMAX(id)FROMuser_infobWHEREa.phone=b.phone);3、手写SQL:统计每月用户注册量,无数据显示为0答案:PlainText

SELECT

t.month,

NVL(COUNT(u.id),0)register_num

FROM(

SELECT'2026-01'monthFROMDUALUNIONALL

SELECT'2026-02'FROMDUALUNIONALL

SELECT'2026-03'FROMDUAL

)t

LEFTJOINuser_infouONTO_CHAR(u.create_time,'YYYY-MM')=t.month

GROUPBYt.month

ORDERBYt.month;八、高频疑难面试题1、UNION和UNIONALL的区别?答案:1.UNION:合并查询结果后自动去重、排序,性能低;2.UNIONALL:直接拼接查询结果,不去重、不排序,性能远高于UNION;3.业务无重复数据、无需去重时,优先使用UNIONALL。2、Oracle中DDL、DML、DCL、TCL分别是什么?包含哪些语句?答案:1.DDL(数据定义语言):定义数据库结构,自动提交事务包含:CREATE、ALTER、DROP、TRUNCATE2.DML(数据操作语言):操作表数据,手动提交事务包含:INSERT、UPDATE、DELETE、SELECT3.DCL(数据控制语言):权限管理包含:GRANT、REVOKE4.TCL(事务控制语言):事务管理

温馨提示

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

最新文档

评论

0/150

提交评论