Oracle常见的面试题(1)

本文提供了一系列Oracle SQL面试题及解答,包括查询特定条件的学生信息、课程成绩等复杂需求,通过实际案例展示了如何使用SQL进行数据检索与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Oracle常见的面试题:

题目:现有STUDENT(学生),COURSE(课程),SC(成绩)表,完成以下需求。(建表语句在emp.sql中,综合考察)

(1)       查询选修课程为web的学员学号和姓名

select s.sid,s.name from student s inner join sc on(s.sid=sc.sid)inner join course c on

(c.cid=sc.cid) where c.name='web';

 分析:课程与学生表没有直接联系,必须通过中间成绩表做2次连接。

(2)查询课堂编号为2的学员姓名和单位

         select s.name,s.dept from student s inner join sc on (s.sid=sc.sid) where sc.cid=2;

(3)查询不选修4号课程的学员姓名和单位

方法一:select name,dept from student where sid not in (select s.sid from student s left join sc on s.sid=sc.sid where cid=4);

方法二:select name,dept from student where not exists(select sid from sc where sc.sid=s.sid and cid=4);

分析:要点是先要查询出选修了4号课程的学员id,再从所有学员中排出这些id的学员。方法二效率较高。

(4)求出所有学生的选修的所有课程

select * from student s inner join sc on s.sid=sc.sid inner join course c on sc.cid=c.cid order by s.sid;

分析:步骤1:查询出所有课程的数目

         Select count(*) from course;

步骤2:在成绩(sc)表,按学员id分组,看每组的个数,该个数等于步骤1课程总数的sid即为选修了所有课程的学员id。

Select sid from sc group by sid having (count(*) =(select count(*) from course));

步骤3:再根据该sid查询学员的详细信息

Select s.name,s.dept from student s where sid in (select sid from sc group by sid having(count(*) = (select count(*) from course)));

(5)查询选修课程超过3门的学员姓名和单位

         select * from student where sid in(select sid from(select sid,count(*) from (select s.* from student s inner join sc on s.sid=sc.sid inner join course c on sc.cid=c.cid order by s.sid) group by sid having count(*)>3 order by sid));

(6)找出没有选修过TeacherLI 讲授课程的所有学生姓名

         select s.name from student s where sid not in (select sid from course c left join sc on(c.cid=sc.cid) where c.teacher='Teacher Li');

(7)列出两门以上(含两门)不及格课程的学生姓名及其平均成绩

         select s.*,b.avgscore from student s,

(select sc.sid,avg(score) avgscore from sc,

       (select sid from sc where score <60 group by sid having(count(*)>=2))a

               where sc.sid=a.sid group by sc.sid)b

               where s.sid=b.sid;

分析:步骤1:查询所有两门以上不及格的学员id

Select sid from sc where score < 60 group by sid having(count(*)>=2);

步骤2:步骤1结果与真实表sc做连接,算平均成绩

Select sc.sid,svg(score)  avgscore  from sc,

         (select sid from sc where score <60 group by sid having(count(*)>=2))a

                   Where sc.sid=a.sid group by sc.sid;

步骤3:步骤2结果与真实表student做连接,查学员姓名

         Select s.*,b.avgscore from student s,

                   (select sid from sc where score<60 group by sid having(count(*)>=2))a

                            Where sc.sid=a.sid group by sc.sid;

(8)列出既学过1号课程,又学过2号课程的所有学生姓名

         select s.name from student s inner join(select sc.sid from sc where sc.cid in(1,2) group by sid having(count(*)=2))a on(s.sid=a.sid);

分析:要点是不仅要学过1,2,号课程in(1,2),并且要求同时学过此两门课count(*)=2。

(9)列出1号课程成绩比2号课成绩高的所有学生的学号,姓名和1号课和2号课的成绩

         select s.sid,s.name,sc1.score,sc2.score from sc sc1,sc sc2,student s where s.sid=sc1.sid and sc1.sid=sc2.sid and sc1.cid =1 and sc2.cid=2 and sc1.score>sc2.score;

分析:要点在于自连接,把成绩表拆成两张表来看,sc1中只考虑1号课,sc2中只考虑2号课且sc1.score>sc2.score;最后再考虑将结果与student表连接查询姓名。

<think>嗯,用户需要准备Oracle数据库相关的面试题,看来是在求职。从ta引用的资料看,ta已经收集了一些基础题目,但需要更系统化的整理。考虑到Oracle DBA岗位的技术深度,应该覆盖架构、性能优化、高可用等核心领域。 用户提供的引用[1]和[2]很有价值,特别是那个用case when处理千万级数据的SQL示例,这种实战题在面试中很常见。不过ta可能更需要分门别类的题目集合,最好附带场景化解析。 上次回复的ETL面试题结构反响不错,这次可以延续类似框架:先按技术模块划分题目,再补充典型场景题。需要特别注意三点: 1)金融、电信等高端企业常问的RAC和Data Guard题目 2)性能优化类题目要给出具体参数,比如DB_FILE_MULTIBLOCK_READ_COUNT的配置逻辑 3)12c/19c新特性是近年热点 注意到用户贴的示例里有数学公式,但Oracle面试更侧重实践,重点应该放在SQL编写、参数配置等操作性内容。不过像SGA内存分配比例这类知识,用$SGA_{target}$=MEMORY_TARGET×0.6$的公式表达会更清晰。 那个分区交换加载的案例值得展开,金融行业常用这种方案解决交易日终批处理,可以结合例子说明: ```sql ALTER TABLE trades EXCHANGE PARTITION p202305 WITH staging_table; ``` 这种既展示技术深度,又体现业务场景的解析最受面试官青睐。 最后要提醒风险点:在解释“truncate不写redo”时一定注明生产环境慎用,避免给面试官留下鲁莽的印象。</think>以下是Oracle数据库常见面试题及答案整理,涵盖架构、性能优化、高可用等核心知识点,结合企业级实践解析: --- ### **一、Oracle体系结构与存储管理** 1. **表空间与数据文件的关系** - 表空间是逻辑存储单元,由多个数据文件(物理文件)组成 - 一个表空间可跨多个数据文件,但一个数据文件仅属于一个表空间 - 例如:`CREATE TABLESPACE ts01 DATAFILE '/u01/oradata/ts01.dbf' SIZE 1G;` [^1] 2. **物理存储结构核心组件** ```mermaid graph LR A[物理结构] --> B[数据文件] A --> C[控制文件] A --> D[重做日志文件] A --> E[参数文件] A --> F[归档日志] ``` 3. **表空间→段→区→块的关系** - **块(Block)**:最小I/O单元(通常8KB) - **区(Extent)**:由连续块组成(分配存储空间的基本单位) - **段(Segment)**:表/索引等对象占用的空间(如数据段、索引段) - **表空间**:段的逻辑容器 --- ### **二、实例管理与备份恢复** 4. **关键后台进程** | 进程 | 作用 | |------------|-----------------------------| | **DBWn** | 数据块写入数据文件 | | **LGWR** | 重做日志写入磁盘 | | **CKPT** | 检查点更新控制文件和数据文件头 | | **SMON** | 实例恢复与空间管理 | 5. **冷备份 vs 热备份** | **类型** | **操作时机** | **优点** | **缺点** | |----------|------------------|-----------------------|-----------------| | 冷备份 | 数据库关闭 | 数据一致性高 | 需停机 | | 热备份 | 数据库运行中 | 业务无中断 | 需归档模式 | 6. **RMAN核心功能** ```sql RMAN> BACKUP DATABASE PLUS ARCHIVELOG; -- 全库备份+归档日志 RMAN> RESTORE DATABASE; -- 恢复数据库 ``` --- ### **三、SQL优化与性能调优** 7. **高效统计四类员工数量(1000万数据)** ```sql SELECT SUM(CASE WHEN fsalary > 9999 AND fage > 35 THEN 1 ELSE 0 END) AS high_sal_old, SUM(CASE WHEN fsalary > 9999 AND fage < 35 THEN 1 ELSE 0 END) AS high_sal_young, SUM(CASE WHEN fsalary < 9999 AND fage > 35 THEN 1 ELSE 0 END) AS low_sal_old, SUM(CASE WHEN fsalary < 9999 AND fage < 35 THEN 1 ELSE 0 END) AS low_sal_young FROM empinfo; -- 单次全表扫描完成统计[^2] ``` 8. **B-Tree索引 vs 位图索引** | **特性** | **B-Tree索引** | **位图索引** | |---------------|------------------------|----------------------| | 适用场景 | 高基数列(如ID) | 低基数列(如性别) | | DML性能 | 高效 | 锁粒度大,写操作慢 | | 压缩效率 | 低 | 高压缩比 | 9. **行迁移与行链接** - **行链接**:单行数据跨多个块(行长度>块大小) - **行迁移**:数据更新后原块空间不足,整行迁移到新块 - **优化方案**:增大`DB_BLOCK_SIZE`或调整`PCTFREE` --- ### **四、高可用与容灾方案** 10. **RAC vs Data Guard** | **能力** | **RAC** | **Data Guard** | |---------------|--------------------------|-----------------------| | 故障切换 | 秒级实例切换 | 分钟级数据库切换 | | 数据保护 | 共享存储单点风险 | 独立物理备库 | | 典型场景 | 高并发OLTP | 异地容灾 | 11. **RAID选型建议** - **RAID 10**:写密集型OLTP(高性能+高可靠) - **RAID 5**:读密集型OLAP(空间利用率高) --- ### **五、数据字典与权限管理** 12. **数据字典视图前缀** | **视图前缀** | **作用范围** | |-------------|--------------------------| | `USER_` | 当前用户对象 | | `ALL_` | 当前用户有权限的对象 | | `DBA_` | 数据库所有对象(需DBA权限) | | `V$` | 动态性能视图 | 13. **角色权限优势** - 简化权限管理:批量授权给角色,再将角色赋予用户 - 动态权限回收:修改角色权限即时生效 ```sql CREATE ROLE finance_role; GRANT SELECT ON fin_table TO finance_role; GRANT finance_role TO user1; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值